Coq:错误:在当前环境中找不到引用_

时间:2012-07-01 23:03:41

标签: coq

我是Coq的新手。 我无法使用单位,产品和总和来定义列表,地图和树。 我在标题中收到错误消息。 评论上方的代码工作正常,下面的代码没有。

Inductive one : Type := nil : one.

Inductive sum (t0 t1 : Type) : Type :=
  | inject_left : t0 -> sum t0 t1
  | inject_right : t1 -> sum t0 t1.

Inductive product (t0 t1 : Type) : Type := pair : t0 -> t1 -> product t0 t1.

Definition list (t0 : Type) : Type := sum one (product t0 (list t0)).

Definition map (t0 t1 : Type) : Type := list (product t0 t1).

(* From here on nothing works. *)

Definition List (t0 : Type) : Type := sum one (product t0 (List t0)).

Definition map (t0 t1 : Type) : Type :=
  sum one (product (product t0 t1) (map t0 t1)).

Definition Map (t0 t1 : Type) : Type :=
  sum one (product (product t0 t1) (Map t0 t1)).

Definition tree (t0 : Type) : Type :=
  sum one (product t0 (product (tree t0) (tree t0))).

Definition Tree (t0 : Type) : Type :=
  sum one (product t0 (product (Tree t0) (Tree t0))).

1 个答案:

答案 0 :(得分:1)

Definition List (t0 : Type) : Type := sum one (product t0 (List t0)).

在Coq中,你不能使用Definition来编写递归函数,你需要使用Fixpoint(或更强的东西)。见http://coq.inria.fr/refman/Reference-Manual003.html#@command14

现在,这不是全部,但递归定义必须可证明终止(以确保您使用的逻辑的一致性)。特别是,你不能写出类似的东西:

Fixpoint List (t0 : Type) : Type := sum one (product t0 (List t0)).

因为你正在对你所进入的同一个参数进行递归调用。这显然无法终止。


无论如何,要定义这些类型,您可能应该使用Inductive(和CoInductive),正如您已经想到的那样。