我是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].
谢谢,
答案 0 :(得分:1)
这是一个非常基本的问题,看起来像家庭作业的问题1,所以我建议你:
答案 1 :(得分:0)
您已经了解:
destruct (classic R) as [r | rn].
它可以与任何R : Prop
一起使用,它在内部依赖于排除中间公理。
存在一个更简单的版本,其中不需要公理,因为您已经知道该对象只能有多种形式:
destruct l.
这里l
是你的清单,但它也可以是一个自然数字,也可以是分离的证明......