我正在使用 Coq 8.5pl1。
举一个人为但说明性的例子,
(* fix so simpl will automatically unfold. *)
Definition double := fix f n := 2*n.
Theorem contrived n : double (2 + n) = 2 + double (1 + n).
现在,我只想将参数简化为加倍,而不是除此之外的任何部分。(例如,因为其余的已经仔细地放入正确的形式。)
simpl.
S (S (n + S (S (n + 0)))) = S (S (S (n + S (n + 0))))
这将外部 (2 + ...) 转换为 (S (S ...)) 以及展开双倍。
我可以通过以下方式匹配其中之一:
match goal with | |- (double ?A) = _ => simpl A end.
double (S (S n)) = 2 + double (1 + n)
我怎么说我想简化所有这些?也就是说,我想得到
double (S (S n)) = 2 + double (S n)
无需为每次调用加倍设置单独的模式。
我可以简化,除了 double 本身
remember double as x; simpl; subst x.
double (S (S n)) = S (S (double (S n)))