我想以感应方式定义类型urt。 我想定义(urt n。+ 1)时想知道一些关于(urt n)的事情。 (我将使用urt定义中第二个元素pr1的投影。) Idenitifier sigT创建依赖对的类型; pr1,pr2是这样的一对投影。
Context (qsigT: forall (A : Type) (P : forall a : A, Type), Type).
Context (qpr1: forall (A : Type) (P : forall a : A, Type), (@qsigT A P) -> A ).
Inductive Unit : Type :=
| tt : Unit.
Inductive Bool : Type :=
| true : Bool
| false : Bool.
Fixpoint urt (n:nat): Type.
Proof.
refine (@qsigT Bool _).
destruct n.
exact (fun _ => Unit).
exact (fun q =>
(@qsigT (urt n) (fun q => (*error below occurs because of using (urt n)*)
Unit+Unit+Unit (*I also cannot use here something like (qpr1 q), because of the same reasons*)
))
).
Show Proof.
Defined.
Check fun (q : urt 4) => qpr1 q. (*Error!*)
Context (y:nat).
Check fun (q : urt y) => qpr1 q. (*Error here, need to be solved*)
错误是
The term "q" has type "urt (S (S (S (S O))))" while it is expected to have type "Type".
我该如何更改定义?
答案 0 :(得分:1)
您的urt
定义具有顶级修复点,因此您需要销毁y
以使修复点缩减为sigT _ _
形式。 (提示:尝试在(S y)
语句中使用Check
。
很难猜出你想做什么,但可能的解决办法是在sigT
构造函数之后延迟修复点。
Definition urt (n : nat) : Type.
Proof.
refine (@qsigT Bool _).
revert n.
fix urt 1.
intros [|n].
exact (fun _ => Unit).
exact (fun q =>
(@qsigT (urt n q) (fun q => (*error below occurs because of using (urt n)*)
(Unit+Unit+Unit)%type (*I also cannot use here something like (qpr1 q), because of the same reasons*)
))
).
Show Proof.
Defined.
Check fun (q : urt 4) => qpr1 _ _ q.
Context (y:nat).
Check fun (q : urt y) => qpr1 _ _ q.