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.
意思是“lockZ.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测试版