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的理论中没有任何东西可以帮助你做到这一点。您有两个选择:

  • 使用证明不相关的公理,它表示所有(p:Prop)(p1p2:p),p1=p2。例如:

    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.