考虑依赖类型
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 n
和mkDep n'
类型不匹配。但是,从某种意义上说,这句话是 true ,因为他们在假设n = n'
下是相同的值。
我希望了解如何形式化和证明关于依赖类型的陈述(特别是它们的平等和概念)
答案 0 :(得分:4)
如何显示两种相关类型相同?
在这种情况下,您可以使用apply f_equal; assumption
或subst; reflexivity
(或destruct H; reflexivity
或case H; reflexivity
或induction H; reflexivity
或exact (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 <> T2
和T1
不同构的情况。 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
。)