Coq fixpoint定义由自然数计算。((n + 1)类型的类型取决于(n)的类型)

时间:2016-05-17 11:39:41

标签: coq

我想以感应方式定义类型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". 我该如何更改定义?

1 个答案:

答案 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.