Coq:证明如果(A,B)=(C,D),那么A=C/\B=D
如标题所示,我找不到足够的工具来解决这件小事:Coq:证明如果(A,B)=(C,D),那么A=C/\B=D,coq,theorem-proving,Coq,Theorem Proving,如标题所示,我找不到足够的工具来解决这件小事: p : (A, B) = (C, D) ------------ A = C /\ B = D 我怎么能证明呢?我刚拿到。它是配对相等\u规格: Proof. intros. apply pair_equal_spec. assumption. Qed. 证明它的一个更原始的方法是injection p 同样有趣的是,看看如何在标准库中证明pair_equal_spec本身,使用假设(a1,b1)=(a2,b2)重写fst(a1,b
p : (A, B) = (C, D)
------------
A = C /\ B = D
我怎么能证明呢?我刚拿到。它是
配对相等\u规格:
Proof.
intros.
apply pair_equal_spec.
assumption.
Qed.
证明它的一个更原始的方法是injection p
同样有趣的是,看看如何在标准库中证明pair_equal_spec
本身,使用假设(a1,b1)=(a2,b2)
重写fst(a1,b1)
和snd(a1,b1)
引理对等于规格:
对于所有(AB:类型)(a1 a2:A)(b1 b2:B),
(a1,b1)=(a2,b2)a1=a2/\b1=b2。
自动校对。
分裂介绍。
-分开。
+将a1替换为(fst(a1,b1));将a2替换为(fst(a2,b2))。。。
重写H。。。
+将b1替换为(snd(a1,b1));将b2替换为(snd(a2,b2))。。。
重写H。。。
-破坏H;替代。。。
Qed。
有时被称为:用解构证明相等。可以涉及模式匹配:当A=B时f(g(A))=f(g(B))。
Lemma pair_equal_spec :
forall (A B : Type) (a1 a2 : A) (b1 b2 : B),
(a1, b1) = (a2, b2) <-> a1 = a2 /\ b1 = b2.
Proof with auto.
split; intros.
- split.
+ replace a1 with (fst (a1, b1)); replace a2 with (fst (a2, b2))...
rewrite H...
+ replace b1 with (snd (a1, b1)); replace b2 with (snd (a2, b2))...
rewrite H...
- destruct H; subst...
Qed.