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.