coq - 添加 ltac 表达式作为自动重写的提示?
问题描述
我正在尝试使用autorewrite
. 为简单起见,我们可以假设它是一个列表(但实际上该类型更复杂,具有多个 cons 构造函数,并且重写规则使用等价而不是相等)。
我想要得到的正常形式是变量或单例列表的串联,x1 :: x2 :: xs ++ y :: ys
即[x1] ++ [x2] ++ xs ++ [y] ++ ys
. 到目前为止,我通过为autorewrite
. 但是,提示forall x xs, xs :: x = xs ++ [x]
不起作用,因为[x] = x : []
它可以被重写,[x] ++ []
从而产生一个无限循环。
我在编写自定义 Ltac 表达式方面没有太多经验,但似乎我可以定义如下内容:
Ltac norm_cons :=
match goal with
| H: ?X : [] => idtac
| H: ?X : ?XS => (* actual rewrite *)
end.
这样我们[]
在第一个模式中捕获并跳过重写,否则执行重写。也许这需要一个失败的案例,但这不是重点:我如何给出(类似的)这个作为提示autorewrite
?我试图将上述定义为一个单独的策略(也许我可以将 normalize 定义为(norm_cons; autorewrite with blablabla).
),但它随后抱怨没有与match
我的目标匹配的分支。这会进行递归搜索吗?还是我必须自己添加这个(即匹配?XS ++ ?YS
并递归地重写 lhs 和 rhs?)
解决方案
似乎您只想用至少两个元素重写列表。也许你可以重写
forall x y xs, x :: y :: xs = [x] ++ y::xs
推荐阅读
- python - Sklearn中的高维DBSCAN
- sql - Oracle 条件排序依据
- shell - 我在哪里安装包 wget 并解压缩以获取 virtualbox 安装脚本
- twilio - 如何使用 API 创建 Authy (twilio) 应用程序?
- database-design - 在 3 个表之间建立关系
- java - Java CompletableFuture anyOf N
- c# - 我不断收到“无法在 DLL 'user32.dll' 中找到名为 'GetWindowLongPtrA' 的入口点”
- netlogo - 在 netlogo 中从 shapefile 添加障碍物和目标
- javascript - 我可以在多个事件侦听器中重用 javascript 函数吗?
- java - 我可以修改 maven-javadoc-plugin 2.10.4 生成的 Javadoc 注释吗?