Coq中如何对列表的长度进行案例分析?
How to do case analysis on the length of a list in Coq?
我在证明过程中需要对列表的长度进行案例分析l
。
- 当
length l < 2
是一种情况(其中 +
这样的二元运算不适用)
- 当
length l >= 2
是另一种情况(二元运算适用)
如何使用 destruct
或其他一些策略来做到这一点,并获得两种情况,即 True 和 False?
我试过:
destruct (length l < 2).
destruct (lt (length l) 2).
remember (length l < 2).
destruct HeqP.
但是 none 有效。
你需要<
的"constructive"版本,因为标准版本在Prop
,所以你不能对其进行案例分析。
您可以使用 compare
、le_lt_dec
或 <
的布尔版本(在文档中搜索所有选项,最简单的应该是 this one)。
如果你真的需要根据2测试长度,你也可以破坏length n
3次并手动处理前3种情况。
Vinz 的回答是正确的。当您需要考虑 "know are distinct" 的两种情况时,通常是因为它们是可判定的,所以寻找以 _dec
结尾的引理。在这种情况下,lt_dec
是在 Compare_dec
中定义的,当您导入 Arith 时就可以得到它。所以:
Require Import Arith.
Goal forall (l:list nat), True.
intro. destruct (lt_dec (length l) 2).
现在第一个目标是
l : list nat
l0 : length l < 2
============================
True
第二个目标是
l : list nat
n : ~ length l < 2
============================
True
我在证明过程中需要对列表的长度进行案例分析l
。
- 当
length l < 2
是一种情况(其中+
这样的二元运算不适用) - 当
length l >= 2
是另一种情况(二元运算适用)
如何使用 destruct
或其他一些策略来做到这一点,并获得两种情况,即 True 和 False?
我试过:
destruct (length l < 2).
destruct (lt (length l) 2).
remember (length l < 2).
destruct HeqP.
但是 none 有效。
你需要<
的"constructive"版本,因为标准版本在Prop
,所以你不能对其进行案例分析。
您可以使用 compare
、le_lt_dec
或 <
的布尔版本(在文档中搜索所有选项,最简单的应该是 this one)。
如果你真的需要根据2测试长度,你也可以破坏length n
3次并手动处理前3种情况。
Vinz 的回答是正确的。当您需要考虑 "know are distinct" 的两种情况时,通常是因为它们是可判定的,所以寻找以 _dec
结尾的引理。在这种情况下,lt_dec
是在 Compare_dec
中定义的,当您导入 Arith 时就可以得到它。所以:
Require Import Arith.
Goal forall (l:list nat), True.
intro. destruct (lt_dec (length l) 2).
现在第一个目标是
l : list nat
l0 : length l < 2
============================
True
第二个目标是
l : list nat
n : ~ length l < 2
============================
True