Согласно Теории гомотопического типа (стр. 49), это принцип полной индукции для равенства:
Definition path_induction (A : Type) (C : forall x y : A, (x = y) -> Type)
(c : forall x : A, C x x eq_refl) (x y : A) (prEq : x = y)
: C x y prEq :=
match prEq with
| eq_refl => c x
end.
Я не очень разбираюсь в HoTT, но вижу, что индукция пути сильнее, чем eq_rect
:
Lemma path_ind_stronger : forall (A : Type) (x y : A) (P : A -> Type)
(prX : P x) (prEq : x = y),
eq_rect x P prX y prEq =
path_induction A (fun x y pr => P x -> P y) (fun x pr => pr) x y prEq prX.
Proof.
intros. destruct prEq. reflexivity.
Qed.
И наоборот, мне не удалось построить path_induction
из eq_rect
. Является ли это возможным ? Если нет, то каков правильный принцип индукции для равенства? Я думал, что эти принципы были механически получены из определений типа Inductive
.
EDIT
Благодаря ответу ниже полный принцип индукции по равенству может быть сгенерирован
Scheme eq_rect_full := Induction for eq Sort Prop.
Тогда получаем обратное,
Lemma eq_rect_full_works : forall (A : Type) (C : forall x y : A, (x = y) -> Prop)
(c : forall x : A, C x x eq_refl) (x y : A)
(prEq : x = y),
path_induction A C c x y prEq
= eq_rect_full A x (fun y => C x y) (c x) y prEq.
Proof.
intros. destruct prEq. reflexivity.
Qed.