HOTT一书在第51页写道:
......我们可以通过路径归纳证明p:x = y
$(x, y, p) =_{ \sum_{(x,y:A)} (x=y)} (x, x, refl x)$ .
有人可以告诉我如何在COQ中证明这一点吗?
备注:
答案 0 :(得分:3)
实际上, 可以在Coq中证明这个结果:
Notation "y ; z" := (existT _ y z) (at level 80, right associativity).
Definition hott51 T x y e :
(x; y; e) = (x; x; eq_refl) :> {x : T & {y : T & x = y} } :=
match e with
| eq_refl => eq_refl
end.
在这里,我使用分号元组符号表示依赖对;在Coq中,{x : T & T x}
是sigma类型\sum_{x : T} T x
。还有一个稍微容易阅读的变体,我们没有提到y
:
Definition hott51' T x e : (x; e) = (x; eq_refl) :> {y : T & x = y} :=
match e with
| eq_refl => eq_refl
end.
如果你不习惯手工编写证明条款,这段代码可能看起来有点神秘,但它正在完成HoTT书中所说的:按路径归纳进行。这里缺少一个至关重要的信息,这是进行路径归纳所需的类型注释。 Coq能够推断出这些,但我们可以要求它通过打印这个术语来告诉我们它们是什么。对于hott51'
,我们得到以下内容(在重写之后):
hott51' =
fun (T : Type) (x : T) (e : x = x) =>
match e as e' in _ = y' return (y'; e') = (x; eq_refl) with
| eq_refl => eq_refl
end
: forall (T : Type) (x : T) (e : x = x),
(x; e) = (x; eq_refl)
重要的细节是,在match
的返回类型中,x
和e
都被推广到y'
和e'
。 这是可能的唯一原因是因为我们将x
包裹在一对中。考虑如果我们尝试证明UIP会发生什么:
Fail Definition uip T (x : T) (e : x = x) : e = eq_refl :=
match e as e' in _ = y' return e' = eq_refl with
| eq_refl => eq_refl
end.
在这里,科克抱怨说:
The command has indeed failed with message:
In environment
T : Type
x : T
e : x = x
y' : T
e' : x = y'
The term "eq_refl" has type "x = x" while it is expected to have type
"x = y'" (cannot unify "x" and "y'").
此错误消息的含义是,在match
的返回类型中,e'
的类型为x = y'
,其中y'
已归一化。这意味着平等e' = eq_refl
是错误类型的,因为右侧必须有x = x
或y' = y'
类型。
答案 1 :(得分:0)
简单回答:你不能。 Coq中x = y
的所有证明都不是eq_refl x
的实例。您必须假设身份证明的唯一性才能获得这样的结果。这是一个非常好的公理,但它仍然是归纳结构微积分的公理。