coq - 使用列表删除功能

标签 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 在包含以下内容的上下文中定义:

Hypothesis eq_dec : forall x y : A, {x = y}+{x <> y}.

函数removes将此作为第一个参数(您可以通过执行Printremove看到。)

这个假设是一个函数,决定列表中类型元素的相等性。在你的情况下,你必须提供一个函数来决定 var 的相等性(这似乎是 nat,所以标准库中也可能有这样的函数) .

如果您不知道“{p} + {q}”表示法,可以在这里查找: http://coq.inria.fr/library/Coq.Init.Specif.html#sumbool

关于coq - 使用列表删除功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20998889/

相关文章:

用于定义引理的 Coq 语法

coq - Coq 中的相互递归函数和终止检查

pattern-matching - 证明匹配语句

coq - 在 Coq 中是否有必要将当前目录添加到加载路径以访问那里的已编译文件以进行导入或导出?

coq - 为什么不能在 Coq 中评估具有抽象值的固定定义表达式?

coq - 从可计算函数转向归纳关系

coq - 在 coq 中,如何以不破坏归纳假设的方式执行 "induction n eqn: Hn"?

coq - 使用 'convoy pattern' 对模式匹配表达式使用 destruct

Coq:变量参数列表上的 Ltac 定义?

coq - 对目标类型的子项进行逻辑抽象