Coq:从总和中删除所有(嵌套的)括号

Coq:从总和中删除所有(嵌套的)括号,coq,associativity,Coq,Associativity,假设我有一个像a+(b+(c+d))的和,我想把它转换成a+b+c+d来应用引理 使用Nat.add\u assoc手动执行此操作非常繁琐。有更聪明的方法吗?我会使用的“简单但不好”的方法是用(a+b+c+d)替换(a+(b+(c+d)))到现在为止,欧米茄你可以使用重复战术,它重复一些战术,直到无法再应用: repeat rewrite Nat.add_assoc. 或更简洁的版本: rewrite !Nat.add_assoc. 它的工作原理与使用repeat的变体相同 这种方法的缺点是

假设我有一个像
a+(b+(c+d))
的和,我想把它转换成
a+b+c+d
来应用引理


使用
Nat.add\u assoc
手动执行此操作非常繁琐。有更聪明的方法吗?

我会使用的“简单但不好”的方法是
用(a+b+c+d)替换(a+(b+(c+d)))到现在为止,欧米茄
你可以使用
重复
战术,它重复一些战术,直到无法再应用:

repeat rewrite Nat.add_assoc.
或更简洁的版本:

rewrite !Nat.add_assoc.
它的工作原理与使用
repeat
的变体相同


这种方法的缺点是它重写了目标中的所有地方。因此,您可能只想选择公式的某个部分对其进行重写。

为什么不好?此外,您还可以使用*自动执行
。如果您看过由
omega
创建的输出术语,您就会明白。大多数情况下,它过于复杂,使用重写的一个小证明会小得多。但这是个人意见的问题;)<用欧米茄编码也可以;通过铃声
也解决了这个问题。前者需要导入
Omega
模块;后者--
Arith
@Vinz为什么输出项很重要?ω的问题在于它可能会减慢编译/检查阶段吗?是的,这就是想法。在这种情况下,我认为这并不重要。但在更大的开发中,这可能会显著改变
Qed
的执行时间。