coq中的记录相等
例如,我有以下示例记录:coq中的记录相等,coq,Coq,例如,我有以下示例记录: Record Sample := { SA :> nat ; SB :> Z ; SCond : Z.abs_nat SB <> SA }. 记录样本:={ SA:>nat; SB:>Z; SCond:Z.abs_nat SB SA }. 当我想证明这个引理时: Lemma Sample_eq : forall a b : Sample , a = b <-> SA a = SA b /\ SB a = SB b.
Record Sample := {
SA :> nat ;
SB :> Z ;
SCond : Z.abs_nat SB <> SA
}.
记录样本:={
SA:>nat;
SB:>Z;
SCond:Z.abs_nat SB SA
}.
当我想证明这个引理时:
Lemma Sample_eq : forall a b : Sample , a = b <-> SA a = SA b /\ SB a = SB b.
Lemma-Sample\u-eq:for-all-ab:Sample,a=b-SA-a=SA-b/\SB-a=SB-b。
我看到:
1 subgoal
______________________________________(1/1)
forall a b : Sample, a = b <-> a = b /\ a = b
1子目标
______________________________________(1/1)
对于所有a b:样本,a=b a=b/\a=b
问题1:如何强制Coq显示SA a而不是a
问题2:如何证明这个引理?问题1 Coq打印
SA
,因为您将其声明为强制。您可以通过在文件中添加选项设置打印强制。
来防止这种情况。据我所知,没有办法只让Coq打印SA
,而不是像SB
这样的其他强制。但是,您可以将:>
替换为:
,以防止SA
被声明为强制
问题2
如果不在Coq的理论中假设额外的公理,你的引理就无法被证明。问题是,你需要证明两个Z.abs_nat SB SA
的证明是相等的,以便证明两个Sample
类型的记录是相等的,Coq的理论中没有任何东西可以帮助你做到这一点。您有两个选择:
Require Import Coq.ZArith.ZArith.
Require Import Coq.Logic.ProofIrrelevance.
Record Sample := {
SA : nat;
SB : Z;
SCond : Z.abs_nat SB <> SA
}.
Lemma Sample_eq a b : SA a = SA b -> SB a = SB b -> a = b.
Proof.
destruct a as [x1 y1 p1], b as [x2 y2 p2].
simpl.
intros e1 e2.
revert p1 p2.
rewrite <- e1, <- e2.
intros p1 p2.
now rewrite (proof_irrelevance _ p1 p2).
Qed.
Require Import Coq.ZArith.ZArith.
Require Import Coq.Logic.ProofIrrelevance.
Require Import Coq.Logic.Eqdep_dec.
Module BoolDecidableSet <: DecidableSet.
Definition U := bool.
Definition eq_dec := Bool.bool_dec.
End BoolDecidableSet.
Module BoolDecidableEqDepSet := DecidableEqDepSet BoolDecidableSet.
Record Sample := {
SA : nat;
SB : Z;
SCond : Nat.eqb (Z.abs_nat SB) SA = false
}.
Lemma Sample_eq a b : SA a = SA b -> SB a = SB b -> a = b.
Proof.
destruct a as [x1 y1 p1], b as [x2 y2 p2].
simpl.
intros e1 e2.
revert p1 p2.
rewrite <- e1, <- e2.
intros p1 p2.
now rewrite (BoolDecidableEqDepSet.UIP _ _ p1 p2).
Qed.