如何找出coq中两个列表之间的差异
我在coq中有两个列表。我想找出这两个列表之间的差异。请指导我用coq编写代码,正如Arthur所说,差异有很多版本。如果你是说减法,这里有两种方法:如何找出coq中两个列表之间的差异,coq,Coq,我在coq中有两个列表。我想找出这两个列表之间的差异。请指导我用coq编写代码,正如Arthur所说,差异有很多版本。如果你是说减法,这里有两种方法: Variable (T: eqType). Definition dlist1 (l1 l2 : seq T) := foldr (fun x l => if x \in l2 then l else [:: x & l]) [::] l1. Definition dlist2 (l1 l2 : seq T) := fo
Variable (T: eqType).
Definition dlist1 (l1 l2 : seq T) :=
foldr (fun x l => if x \in l2 then l else [:: x & l]) [::] l1.
Definition dlist2 (l1 l2 : seq T) :=
foldl (fun l x => filter (predC1 x) l) l1 l2.
YMMV。证据:
Lemma dlist2_nil l2 : dlist2 [::] l2 = [::].
Proof. by elim: l2. Qed.
Lemma dlist2_cons x1 l1 l2 :
dlist2 (x1 :: l1) l2 =
if x1 \in l2 then dlist2 l1 l2 else [:: x1 & dlist2 l1 l2].
Proof. by elim: l2 l1 => //= x2 l2 ih2 l1; rewrite inE; case: eqP => /=. Qed.
Lemma dlistP l1 l2 : dlist1 l1 l2 = dlist2 l1 l2.
Proof.
by elim: l1 l2 => [|x1 l1 ih1] /= l2; rewrite ?dlist2_nil // dlist2_cons ih1.
Qed.
你要寻找的不是两个列表之间的差异,而是它们的交叉点。可以通过重用部分标准库来编程此函数
Require Import Coq.Arith.Arith.
Require Import Coq.Lists.List.
Definition intersection (l1 l2 : list nat) : list nat :=
List.filter (fun n => List.existsb (Nat.eqb n) l2) l1.
Lemma intersectionP l1 l2 n : In n (intersection l1 l2) <-> In n l1 /\ In n l2.
Proof.
unfold intersection.
rewrite filter_In, existsb_exists; split.
- intros [H1 [m [H2 e]]]; split; trivial.
rewrite Nat.eqb_eq in e; congruence.
- intros [H1 H2]; split; trivial.
now exists n; split; trivial; rewrite Nat.eqb_refl.
Qed.
需要导入Coq.Arith.Arith。
需要导入Coq.Lists.List。
定义交叉点(l1 l2:列表nat):列表nat:=
List.filter(fun=>List.existsb(Nat.eqb n)l2)l1。
引理相交P l1 l2 n:In n(相交l1 l2)In n l1/\n l2。
证据
展开交叉点。
在中重写筛选器,\u,existsb\u存在;分裂
-简介[H1[m[H2 e]];分裂不重要的
重写e中的Nat.eqb_eq;相似
-简介[H1H2];分裂不重要的
现在存在n;分裂不重要的重写Nat.eqb_refl。
Qed。
您所说的“两个列表之间的差异”是什么意思?我在一个列表中有几个自然数,在另一个列表中有一些其他自然数。我想在两个列表中找到共同的自然数。如果它们之间不存在共同元素,差异将为零。