我是Coq的新手。我有一个函数findshare
,可以在两个列表中找到相同的元素。引理sameElements
证明函数findshare
在两个列表的串联上的结果等于对每个列表应用的函数的结果的串联。我有点难以证明引理sameElements
。
Require Import List .
Fixpoint findshare(s1 s2: list nat): list nat:=
match s1 with
| nil => nil
| v :: tl =>
if ( existsb (Nat.eqb v) s2)
then v :: findshare tl s2
else findshare tl s2
end.
Lemma sameElements l1 l2 tl :
(findshare tl (l1++l2)) =
(findshare tl (l1))++ (findshare tl (l2)).
Proof.
答案 0 :(得分:0)
您遇到了麻烦,因为您的陈述不太正确:这带来了矛盾。更确切地说,它暗示着[1; 2] = [2; 1]
:
Require Import List .
Fixpoint findshare(s1 s2: list nat): list nat:=
match s1 with
| nil => nil
| v :: tl =>
if ( existsb (Nat.eqb v) s2)
then v :: findshare tl s2
else findshare tl s2
end.
Lemma sameElements l1 l2 tl :
(findshare tl (l1++l2)) =
(findshare tl (l1))++ (findshare tl (l2)).
Admitted.
Import ListNotations.
Lemma contra : False.
Proof.
pose proof (sameElements [1] [2] [2;1]).
simpl in H.
discriminate.
Qed.
您应该能够通过将tl
与l1
,l2
和l1 ++ l2
交换并通过对l1
的归纳来证明引理。