Coq中如何对列表的长度进行案例分析?

How to do case analysis on the length of a list in Coq?

我在证明过程中需要对列表的长度进行案例分析l

  1. length l < 2 是一种情况(其中 + 这样的二元运算不适用)
  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,所以你不能对其进行案例分析。 您可以使用 comparele_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