Coq 我们可以将引理应用于哪些子项?

Coq 我们可以将引理应用于哪些子项?,coq,Coq,假设我们有目标 a + b + c + d = a + c + b + d 式中,a,b,c,d:nat和引理加上Arith的_comm: 这是可能的 重写+命令以获得d+a+b+c=a+c+b+d和 重写加上通信a b。获得b+a+c+d=a+c+b+d。 但是执行rewrite plus_comm b c或rewrite plus_comm c d将抛出类似于的错误 Found no subterm matching "b + c" in the current goal. 问题。 为什

假设我们有目标

a + b + c + d = a + c + b + d
式中,a,b,c,d:nat和引理加上Arith的_comm:

这是可能的

重写+命令以获得d+a+b+c=a+c+b+d和 重写加上通信a b。获得b+a+c+d=a+c+b+d。 但是执行rewrite plus_comm b c或rewrite plus_comm c d将抛出类似于的错误

Found no subterm matching "b + c" in the current goal.
问题。 为什么会出现这种情况,我们可以做些什么来将目标中的b+c重写为c+b

编辑。 我们可以把b+c改写成c+b

rewrite (plus_assoc_reverse a).
rewrite (plus_comm b c).
rewrite plus_assoc.
用自反性证明引理。 还有更优雅的方法吗?

Coq中的+运算符是左联想的,因此像a+b+c+d这样的术语实际上是a+b+c+d的伪装。这应该可以回答为什么plus_comm没有达到您期望的效果


要解决这些类型的目标,你需要应用一系列你已经发现的引理。这通常会很乏味,因此有一些策略可以解决这些问题,如omega see question。

在这种情况下,如果您不想背诵所有定理,您通常可以写:

戒指

此命令也称为策略,在加载Arith库后立即可用。它专门用于证明等式,其中两项是相同的模结合性、加法和乘法的交换性以及乘法对加法的分配性。如果使用的是整数Z的类型,还可以包含减法

在另一个答案中提出的欧米茄策略会起作用,但只适用于包含有限乘法形式的公式。作为旁注,omega将在Coq的未来版本中退役,它将被一种称为lia的策略所取代,lia代表线性整数算术

rewrite (plus_assoc_reverse a).
rewrite (plus_comm b c).
rewrite plus_assoc.