我是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))).
答案 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
),正如您已经想到的那样。