На самом деле, это является можно доказать этот результат в 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}
- это сигма тип \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.
Здесь Coq жалуется, говоря:
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'
.
Определение hott51 дает следующую ошибку в COQ8.4 на MAC: Ошибка: Незаконное применение (Тип Ошибка): Термин «существует» типа «forall (A: Тип) (P: A -> Тип) (x: A), P x -> sigT P " не может быть применена к условиям " T ":" Тип " " fun y: T => eq ty ":" T -> Prop " " t ":" T " " e0 ":" eq xt " 4-й термин имеет тип" eq xt ", который должен быть принудительным до " (fun y: T => eq ty) t ". – Cryptostasis
HI Arthur, не могли бы вы отправить ссылку, где объясняется символ «:>»? – Cryptostasis
@ Криптостаз. Это, вероятно, некоторая несовместимость между 8.4 и 8.5. Если вы наберете его на JsCoq (https://x80.org/rhino-coq/), вы увидите, что он работает. Что касается 'x = y:> T', он определяется как' @eq T xy' в стандартной библиотеке (https://coq.inria.fr/distrib/current/stdlib/Coq.Init.Logic.html). –