在coq中取消空和非空列表

时间:2016-09-20 01:12:21

标签: coq

我是Coq的新手。如何证明空和非空列表的分离是真的?

l = [] \/ l <> []

这是我正在努力的问题:

Lemma in_list: forall (X : Type) (a : X) l (P : X -> Prop),
        (a :: l <> [] /\ exists b : X, In b (a :: l) -> P b) ->

  (P a /\ l = [] \/
P a /\ l <> [] \/ ~ P a /\ l <> [] /\ (exists b : X, In b l -> P b))

因此,为了证明这个引理,一种方法似乎是考虑两种情况:

if l = [] or l <> []

然后

if l = [], P a holds

if l <> [], ~ P a /\ l <> [] /\ (exists b : X, In b l -> P b) holds

我可以用这种方式证明这个引理,但我不知道如何走这条道路。对于类型为Prop的变量R,我已经为Prop类型(不是列表)做了类似的事情,它考虑了两种True或False的情况。我不确定我是否可以为列表做类似的事情。

destruct (classic R) as [r | rn].

谢谢,

2 个答案:

答案 0 :(得分:1)

这是一个非常基本的问题,看起来像家庭作业的问题1,所以我建议你:

  • 在纸上思考:你怎么用笔和笔来证明这一点?纸?
  • 你知道什么战术,哪一个可以在这里适用?
  • 正如@anton所说,至少向我们解释你的尝试和失败的原因

答案 1 :(得分:0)

您已经了解:

destruct (classic R) as [r | rn].

它可以与任何R : Prop一起使用,它在内部依赖于排除中间公理。

存在一个更简单的版本,其中不需要公理,因为您已经知道该对象只能有多种形式:

destruct l.

这里l是你的清单,但它也可以是一个自然数字,也可以是分离的证明......