我正在尝试使用Coq standard library中的列表删除功能,但它要求进行奇怪的输入,我不知道如何解决。
我正在实现的函数是在lambda术语中创建一个自由变量列表,如下所示:
Fixpoint fv (t : trm) : vars :=
match t with
| Var v => [v]
| App t1 t2 => (fv t1) ++ (fv t2)
| Abs x t' => remove x (fv t')
end.
它给了我以下错误:
Error: In environment
fv : trm -> vars
t : trm
x : nat
t' : trm
The term "x" has type "nat" while it is expected to have type
"forall x0 y : ?171, {x0 = y} + {x0 <> y}".
我很确定在remove函数的定义中与hyphotesis有关。我不知道如何处理它,有什么帮助吗?
答案 0 :(得分:4)
remove
在包含以下内容的上下文中定义:
Hypothesis eq_dec : forall x y : A, {x = y}+{x <> y}.
函数remove将此作为第一个参数(您可以通过执行Print remove.
)
此假设是决定列表中类型元素相等的函数。在你的情况下,你必须提供一个函数来决定var
的平等(似乎是nat
,所以在标准库中也可能有这样的函数。)
如果你不知道&#34; {p} + {q}&#34;符号,你可以在这里查找: http://coq.inria.fr/library/Coq.Init.Specif.html#sumbool