依赖类型和依赖值的相等性

时间:2018-01-12 13:18:32

标签: equality coq dependent-type

考虑依赖类型

Inductive dep (n: nat) :=
  mkDep : dep n.

现在,考虑一个我想证明的简单定理:

Theorem equalTypes (n n': nat): n = n' -> dep n = dep n'.
Proof.
  intros.
Abort.

如何显示两种依赖类型相同?什么是类型相等的概念?

更糟糕的是,请考虑这个“定理”(不编译)

Theorem equalInhabitants (n n' : nat): n = n' -> mkDep n = mkDep n'.
Abort.

语句错误,因为mkDep nmkDep n'类型不匹配。但是,从某种意义上说,这句话是 true ,因为他们在假设n = n'是相同的值。

我希望了解如何形式化和证明关于依赖类型的陈述(特别是它们的平等和概念)

1 个答案:

答案 0 :(得分:4)

  

如何显示两种相关类型相同?

在这种情况下,您可以使用apply f_equal; assumptionsubst; reflexivity(或destruct H; reflexivitycase H; reflexivityinduction H; reflexivityexact (eq_rect n (fun n' => dep n = dep n') eq_refl n' H)来证明此问题。

  

什么是类型相等的概念?

与任何其他平等相同; Print eq.给出:

Inductive eq (A : Type) (x : A) : A -> Prop :=  eq_refl : x = x

这表示你必须构建一个平等证明的唯一特殊事实是任何x = x的{​​{1}}。使用等同证明x的方法是,如果你有eq_rect,要证明x = y的属性P,就足以证明y } P。在这种情况下,由于我们有x来证明n = n',因此只需证明dep n = dep n'(其中dep n = dep n)。

有一个更深层次的意义,可以提出这个问题,因为事实证明,Coq中类型的相等性受到限制。给定

P := fun n' => dep n = dep n'

你无法证明Inductive unit1 := tt1. Inductive unit2 := tt2. ,也无法证明unit1 = unit2。实际上,事实证明,您可以证明的唯一类型不等式unit1 <> unit2是可以证明T1 <> T2T1不同构的情况。 Univalence公理是一种填充细节的方式。类型相等,表示任何同构类型是相等的。但是还有其他一致的解释(例如,我认为它与T2一致,尽管这与单一性相矛盾。)

  

更糟糕的是,请考虑这个&#34;定理&#34; (不编译)

A * B = C * D -> A = C /\ B = D

右。这是因为我们在Coq中没有相等的反射规则,而判断/定义的平等与命题相等并不相同。说明这一点的方法是&#34;演员&#34;平等证明中的Theorem equalInhabitants (n n' : nat): n = n' -> mkDep n = mkDep n'. 一词。

mkDep n

请注意,Import EqNotations. Theorem equalInhabitants (n n' : nat): forall H : n = n', rew H in mkDep n = mkDep n'. intros. subst; reflexivity. Qed. 的绑定比rew更紧密,并且是=的表示法。这表示,对于eq_rect H的任何证明,n = n'一词在mkDep n内传输成为H类型的术语时,等于{ {1}}。 (另请注意,我们也可以使用dep n'mkDep n'destruct H(但不是induction H)代替case H。)