在Z3中将量词消除应用于线性算术公式h
后,我得到一个30行左右的公式。事实证明,这个公式相当于h2=And(n>2, i>=0, i<=n-2)
,我更喜欢将其作为输出。
我试过ctx-solver-simplify
;我越来越:
And(Not(n <= 2), Or(Not(i >= 1), Not(n + -1*i <= 1)), i >= 0)
现在,Not(n<=2)
可以更简洁地表达为n>=3
,Not(n + -1*i <= 1)
表示为n-i>=2
,而且此公式中不需要i >= 1
。
Repeat(Then('nnf','ctx-solver-simplify'))
做得更好(摆脱i>=1
)。
是否有更好的简化策略?
同样,是否有一种策略可以将Or(x==0, x==1, x==2, x==3)
转换为And(x>=0,x<=3)
?
答案 0 :(得分:0)
我目前最好的解决方案是使用Repeat(Then(OrElse('split-clause', 'nnf'), 'propagate-ineqs', 'ctx-solver-simplify'))
,使用最新的Z3不稳定版本(ctx-solver-simplify
中的错误已得到纠正)。