使用List删除功能

时间:2014-01-08 14:50:49

标签: coq

我正在尝试使用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有关。我不知道如何处理它,有什么帮助吗?

1 个答案:

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