我正在使用:
$ coqtop -v
The Coq Proof Assistant, version 8.4pl5 (February 2015)
compiled on Feb 06 2015 17:44:41 with OCaml 4.02.1
我定义了以下CoInductive
类型stream
:
$ coqtop
Welcome to Coq 8.4pl5 (February 2015)
Coq < CoInductive stream (A : Type) : Type :=
Coq < | Cons : A -> stream A -> stream A.
stream is defined
Coq < Check stream.
stream
: Type -> Type
Coq < Check Cons.
Cons
: forall A : Type, A -> stream A -> stream A
然后,我尝试定义以下CoFixpoint
定义,zeros
:
Coq < CoFixpoint zeros : stream nat := Cons 0 zeros.
但是,我收到了以下错误:
Toplevel input, characters 38-39:
> CoFixpoint zeros : stream nat := Cons 0 zeros.
> ^
Error: In environment
zeros : stream nat
The term "0" has type "nat" while it is expected to have type
"Type".
我发现我必须明确地实例化变量A
:
Coq < CoFixpoint zeros : stream nat := Cons nat 0 zeros.
zeros is corecursively defined
为什么Coq不会自己推断出A
的类型?如何推断A
的类型?
答案 0 :(得分:4)
您需要声明A
是隐式的,要求Coq为您推断它。有几种方法可以做到:
将以下声明添加到您的文件中:Set Implicit Arguments.
。这将导致Coq为A
的{{1}}等参数启用自动推理,允许您编写Cons
。
仅针对Cons 0 zeros
启用隐式参数,而不会影响文件的其余部分:
Cons
此声明将Arguments Cons {A} _ _.
标记为隐式,并将其他两个参数保留为显式。
将A
标记为A
的定义:
stream
我个人不建议这样做,因为它会将CoInductive stream {A : Type} : Type :=
| Cons : A -> stream A -> stream A.
标记为隐含A
。
您可以在reference manual
中找到有关隐式参数的更多信息