Я хочу определить зависимый тип как eqType
. Например, предположим, что мы определили следующий зависимый тип Tn
:
From mathcomp Require Import all_ssreflect.
Variable T: nat -> eqType.
Inductive Tn: Type := BuildT: forall n, T n -> Tn.
Чтобы сделать это из eqType
, я определил функцию равенства Tn_eq
для Tn
:
Definition Tn_eq: rel Tn :=
fun '(BuildT n1 t1) '(BuildT n2 t2) =>
(if n1 == n2 as b return (n1==n2) = b -> bool
then fun E => t1 == eq_rect_r T t2 (elimTF eqP E)
else fun _ => false) (erefl (n1 == n2)).
Затем я попытался доказать аксиому равенства для Tn_eq
, но она не удалась.
Lemma Tn_eqP: Equality.axiom Tn_eq.
Proof.
case=>n1 t1; case=>n2 t2//=.
case_eq(n1==n2).
У меня возникла ошибка:
Illegal application:
The term "elimTF" of type
"forall (P : Prop) (b c : bool), reflect P b -> b = c -> if c then P else ~ P"
cannot be applied to the terms
"n1 = n2" : "Prop"
"b" : "bool"
"true" : "bool"
"eqP" : "reflect (n1 = n2) (n1 == n2)"
"E" : "b = true"
The 4th term has type "reflect (n1 = n2) (n1 == n2)" which should be coercible to
"reflect (n1 = n2) b".
Как мне доказать это? лемма