Coq 关于Sigma类型的等价性证明

Coq 关于Sigma类型的等价性证明,coq,Coq,我已经定义了一个Sygma类型,如下所示: { R : nat -> nat -> bool | Reflexive R } 我有两个元素r1r2:{R:nat->nat->bool |自反R},我要证明r1=r2。我该怎么做呢?如果你想证明这样一个等式,你需要(1)证明基础函数是相等的(即你的sigma类型的R成分),和(2)证明相应的证明是相等的。然而,有两个问题 第一个问题是Coq中的函数等式太弱。根据常见的数学实践,如果两个函数对任何输入产生相等的结果,我们期望它们相等。这

我已经定义了一个Sygma类型,如下所示:

{ R : nat -> nat -> bool | Reflexive R }

我有两个元素
r1r2:{R:nat->nat->bool |自反R}
,我要证明
r1=r2
。我该怎么做呢?

如果你想证明这样一个等式,你需要(1)证明基础函数是相等的(即你的sigma类型的
R
成分),和(2)证明相应的证明是相等的。然而,有两个问题

第一个问题是Coq中的函数等式太弱。根据常见的数学实践,如果两个函数对任何输入产生相等的结果,我们期望它们相等。这一原则称为功能扩展性:

尽管听起来很自然,但这一原则在Coq的逻辑中是无法证明的!粗略地说,两个函数相等的唯一方法是根据逻辑的计算规则将它们转换为语法上相等的项。例如,我们可以证明
fun:nat=>0+n
fun:nat=>n
是相等的,因为
+
是在Coq中通过第一个参数的模式匹配定义的,第一个术语的第一个参数是
0

Goal (fun n : nat => 0 + n) = (fun n : nat => n). reflexivity. Qed.
我们可以期望通过类似的方法证明
funn=>n+0
funn=>n
是相等的。但是,Coq不接受这一点,因为当第一个参数是变量时,
+
无法简化

另一个问题是,证明上的相等概念也不是很有趣。证明两个证明相等的唯一方法是,再次强调,句法相等。然而,凭直觉,我们想通过证明无关性来论证,这是一个原则,表明同一事物的证明总是相等的:

Axiom proof_irrelevance :
  forall (P : Prop) (p q : P), p = q.
但是,同样,这一原则在逻辑上是无法证明的。幸运的是,Coq的逻辑设计允许人们以合理的方式添加这些原则作为公理。然后我们可以得到以下证明:

Axiom functional_extensionality :
  forall A (B : A -> Type)
         (f g : forall a, B a),
    (forall a, f a = g a) ->
    f = g.

Axiom proof_irrelevance :
  forall (P : Prop) (p q : P), p = q.

Lemma l (r1 r2 : { R : nat -> nat -> bool |
                   forall n, R n n = true }) :
  (forall n1 n2, proj1_sig r1 n1 n2 = proj1_sig r2 n1 n2) ->
  r1 = r2.
Proof.
  destruct r1 as [r1 H1], r2 as [r2 H2].
  simpl.
  intros H.
  assert (H' : r1 = r2).
  { apply functional_extensionality.
    intros n1.
    apply functional_extensionality.
    intros n2.
    apply H. }
  subst r2.
  rename r1 into r.
  f_equal.
  apply proof_irrelevance.
Qed.
尽管公理可能有用,但人们可能希望避免公理。在这种情况下,实际上可以用函数的可扩展性来证明这个引理,但至少需要这样做。如果您希望避免使用公理,并且
r1
r2
在计算时不相等,则必须在类型上使用差异等价关系,并使用该关系进行形式化,例如

Definition rel_equiv (r1 r2 : { R : nat -> nat -> bool | forall n, R n n = true }) : Prop :=
  forall n1 n2, proj1_sig r1 n1 n2 = proj2_sig r2 n1 n2.

对等价关系的重写有很好的支持;例如,

我不会说,例如,
(funx:nat=>x)
(funf=>f)(funx:nat=>x)
在语法上是相等的,但在Coq中它们是相等的。也许最好用“定义上或“计算上”替换“语法上”?
l
引理也可以用等式证明的唯一性(UIP)公理来证明,它比证明无关公理弱。修改很简单:我们需要为所有A(xy:A)(p1p2:x=y)引入
公理UIP:,p1=p2。
并将
应用证明不相关。
在证明的末尾改为
应用功能性扩展性;简介;应用UIP。
一读时,我错过了你关于在没有证明不相关(或UIP)的情况下证明这种特殊情况的可能性的评论由于
bool
是一种具有可判定等式的类型,因此我们可以使用
Eqdep\u dec
模块中的
UIP\u refl\u bool
来完成证明:
应用函数扩展性;intro.destruct(H2)。应用UIP\u refl\u bool。
谢谢!
Definition rel_equiv (r1 r2 : { R : nat -> nat -> bool | forall n, R n n = true }) : Prop :=
  forall n1 n2, proj1_sig r1 n1 n2 = proj2_sig r2 n1 n2.