我正在学习同伦型理论(HoTT)及其与COQ的关系。 尤其是身份类型的路径归纳概念对我来说仍然是个谜 因此我用COQ做了一些实验。
让我们从使用路径归纳的标准相等类型的简单引理开始:
Lemma eq_sym: forall (x y:nat), x = y -> y = x.
intros.
apply (match H in (_ = y0) return y0 = x with eq_refl => eq_refl end).
Defined.
现在让我们看看这是否是对COQ“eq”类型的特殊处理。因此,让我们用类似的对称引理定义一个新的相等类型(仅限于nat):
Inductive est (x : nat) : nat -> Prop :=
est_refl: est x x.
Lemma est_sym: forall (x y:nat), est x y -> est y x.
intros.
apply (match H in (est _ y0) return est y0 x with est_refl => est_refl x end).
Defined.
好的,这与标准“=”类型的工作方式相同 现在让我们概括一下:
Inductive tri (x : nat) : nat->nat->Prop :=
tri_refl: tri x x x.
Lemma tri_sym: forall (x y z:nat), tri x y z -> tri z x y.
intros.
apply (match H in (tri _ y0 z0) return tri z0 x y0 with tri_refl => tri_refl x end).
Defined.
我的问题是:
这与HoTT的理论有何关系?
这是一个广义的路径归纳,它不是HoTT的一部分吗?
答案 0 :(得分:0)
你的“三端平等”相当于一对平等证明,在某种意义上我们可以编写在两种形式之间来回转换的Coq函数。 (这些是下面摘录中的eq_of_teq
和teq_of_eq
条款。)
Section Teq.
Variable T : Type.
Inductive teq (x : T) : T -> T -> Prop :=
| teq_refl : teq x x x.
Definition teq_of_eq {x y z} (e1 : x = y) (e2 : x = z) : teq x y z :=
match e1 in _ = y' return x = z -> teq x y' z with
| eq_refl => fun e2 =>
match e2 in _ = z' return teq x x z' with
| eq_refl => teq_refl x
end
end e2.
Definition eq_of_teq1 {x y z} (te : teq x y z) : x = y :=
match te in teq _ y' z' return x = y' with
| teq_refl => eq_refl
end.
Definition eq_of_teq2 {x y z} (te : teq x y z) : x = z :=
match te in teq _ y' z' return x = z' with
| teq_refl => eq_refl
end.
Definition teq_eq_teq x y z (te : teq x y z) :
teq_of_eq (eq_of_teq1 te) (eq_of_teq2 te) = te :=
match te as te' in teq _ y' z' return teq_of_eq (eq_of_teq1 te') (eq_of_teq2 te') = te' with
| teq_refl => eq_refl
end.
Definition eq_teq_eq1 x y z (e1 : x = y) (e2 : x = z) :
eq_of_teq1 (teq_of_eq e1 e2) = e1 :=
match e1 as e1' in _ = y' return eq_of_teq1 (teq_of_eq e1' e2) = e1' with
| eq_refl =>
match e2 as e2' in _ = z' return eq_of_teq1 (teq_of_eq eq_refl e2') = eq_refl with
| eq_refl => eq_refl
end
end.
Definition eq_teq_eq2 x y z (e1 : x = y) (e2 : x = z) :
eq_of_teq2 (teq_of_eq e1 e2) = e2 :=
match e1 as e1' in _ = y' return eq_of_teq2 (teq_of_eq e1' e2) = e2 with
| eq_refl =>
match e2 as e2' in _ = z' return eq_of_teq2 (teq_of_eq eq_refl e2') = e2' with
| eq_refl => eq_refl
end
end.
End Teq.
teq_eq_teq
,eq_teq_eq1
和eq_teq_eq2
引理表明转换来回不会改变我们开始的条款;因此,两种表述都是等价的。从这个意义上说,Coq没有比HoTT更强大的表达能力,因为我们可以定义teq
。
在基本的Martin-Löf类型理论(HoTT所依据的形式系统)中,通过在相同的术语之间保持一对等式,你获得的收益并不多,因为你能用这种等式做的唯一事情就是对您操纵的术语类型执行强制转换。因此,通常在术语之间只有一个或两个相等证明并不重要。
由于添加了 univalence axiom ,HoTT中的情况发生了一些变化,这使我们能够以计算上有趣的方式在类型之间使用相等证明。这是因为HoTT中的A = B
证明可以类型A = B
之间的任何双射。在该设置中,teq A B C
的证明相当于两次双向投射:一次在A
和B
之间,另一次在A
和C
之间。