我有一个关于如何在 Coq 中重新排列术语的一般性问题。例如,如果我们有一个 term m + p + n + p
,人类可以快速将这些术语重新排列成类似的东西m + n + p + p
(隐式使用 plus_comm 和 plus_assoc)。我们如何在 Coq 中有效地做到这一点?
举一个(愚蠢的)例子,
Require Import Coq.Arith.Plus.
Require Import Coq.Setoids.Setoid.
Theorem plus_comm_test: forall n m p: nat,
m + p + (n + p) = m + n + 2 * p.
Proof. intros. rewrite plus_assoc. simpl. rewrite <- plus_n_O.
现在,我们有
1 subgoals
...
______________________________________(1/1)
m + p + n + p = m + n + (p + p)
我的问题是:
如何m + n + p + p
有效地重写 LHS?
我尝试使用rewrite plus_comm at 2
,但它给出了一个错误Nothing to rewrite.
只需使用重写plus_comm
将 LHS 更改为p + m + n + p
.
也欢迎任何关于有效重写的建议。
谢谢。