在COQ中证明平等是反身性

时间:2016-09-13 07:31:32

标签: equality coq type-theory

HOTT一书在第51页写道:
......我们可以通过路径归纳证明p:x = y

 $(x, y, p) =_{ \sum_{(x,y:A)} (x=y)} (x, x, refl x)$ .

有人可以告诉我如何在COQ中证明这一点吗?

备注:

  • 很抱歉,我不知道如何在这里渲染乳胶代码。
  • 那不是作业。

2 个答案:

答案 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的返回类型中,xe都被推广到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 = xy' = y'类型。

答案 1 :(得分:0)

简单回答:你不能。 Coq中x = y的所有证明都不是eq_refl x的实例。您必须假设身份证明的唯一性才能获得这样的结果。这是一个非常好的公理,但它仍然是归纳结构微积分的公理。