Coq 如何禁止简单策略展开算术表达式?

Coq 如何禁止简单策略展开算术表达式?,coq,Coq,siml策略将2+a这样的表达式展开为“匹配树”,这看起来一点也不简单。例如: 所有i:Z的目标((乐趣x=>x+i)3=i+3)。 简单。 导致: 对于所有i:Z, 匹配 | 0 => 3 |Z.pos y'=> Z.pos 配上 |q~1=> 匹配q |q0~1=>(位置成功q0)~1 |q0~0=>(位置成功q0)~0 | 1 => 3 结束~0 |q~0=> 匹配q |q0~1=>(位置成功q0)~0 |q0~0=>q0~1 | 1 => 2 结束~1 | 1 => 4 结束 |Z.n

siml
策略将
2+a
这样的表达式展开为“匹配树”,这看起来一点也不简单。例如:

所有i:Z的目标((乐趣x=>x+i)3=i+3)。
简单。
导致:

对于所有i:Z,
匹配
| 0 => 3
|Z.pos y'=>
Z.pos
配上
|q~1=>
匹配q
|q0~1=>(位置成功q0)~1
|q0~0=>(位置成功q0)~0
| 1 => 3
结束~0
|q~0=>
匹配q
|q0~1=>(位置成功q0)~0
|q0~0=>q0~1
| 1 => 2
结束~1
| 1 => 4
结束
|Z.neg y'=>Z.pos_sub 3 y'
结束=i+3
如何使用
siml
策略避免此类并发症


这个特殊的目标可以用
omega
来解决,但是如果它稍微复杂一点,omega就失败了,我不得不求助于这样的方法:
用(a+2)替换(2+a);单纯形;将(a+2)替换为(2+a)

您可以使用
透明
不透明
命令控制定义展开。在你的例子中,你应该可以说

Opaque Z.add.
simpl.
Transparent Z.add.
rewrite (lock Z.add) /= -lock.
或者,
参数
可用于指导
siml
策略,以避免在某些上下文中简化术语。例如

Arguments Z.add _ _ : simpl nomatch.
在你的情况下对我有好处。这个特殊的变体所做的是避免简化一个术语,当一个大的、丑陋的
匹配项出现在头部位置时(您在示例中看到的)。然而,还有其他的变体

最后,为了完整起见,该库提供了很好的基础设施,可以使某些定义在本地不透明。所以你可以说

Opaque Z.add.
simpl.
Transparent Z.add.
rewrite (lock Z.add) /= -lock.

意思是“lock
Z.add
,这样它就不会简化,然后简化表达式的其余部分(开关
/=
),然后再次解锁定义(
-lock
)”。

您可以调整simple策略的行为方式,以减少匹配

Require Import Coq.ZArith.ZArith.

Goal forall i:Z, ((fun x => (x + i)%Z) 3%Z = (i + 3)%Z).
Arguments Z.add x y : simpl nomatch.
simpl.
阅读更多关于它的信息

否则,您可以使用它来选择如何减少<例如,代码>cbn测试版