我有一些代码,我想借助一些策略来检查。由于我有很多if-then-else
语句,我想应用elim-term-ite
策略。
我已经使用了以下策略
(check-sat-using (then (! simplify :arith-lhs true) elim-term-ite solve-eqs lia2pb pb2bv bit-blast sat))
但是,如果我将此错误称为 - "goal is in a fragment unsupported by lia2pb"
那么,如果我尝试删除策略lia2pb
及其旁边的策略,我会收到另一个错误unknown "incomplete"
。
我尝试删除除simplify
之外的所有策略,但我仍然会收到incomplete
错误。
我应该尝试帮助坐着的解决方案解决问题是什么? 我应该尝试其他策略吗?
答案 0 :(得分:2)
要使用lia2pb
(也就是线性整数算术来伪布尔),所有整数变量都必须有界。也就是说,它们必须具有下限和上限。
如果输入目标不包含理论原子,则策略sat
仅完成。也就是说,目标仅包含布尔连接词和布尔常量。如果不是这种情况,那么如果它不能显示(输入的布尔抽象)目标是不可满足的,那么它将返回“unknown”。
您可以使用以下命令要求Z3显示lia2pb
的输入目标:
(apply (then (! simplify :arith-lhs true) elim-term-ite solve-eqs)
如果某些公式包含无界整数变量,则可以在可能的情况下构建一个减少为SAT的策略,否则调用通用解算器。这可以使用or-else
组合子来完成。这是一个例子:
(check-sat-using (then (! simplify :arith-lhs true) elim-term-ite solve-eqs
(or-else (then lia2pb pb2bv bit-blast sat)
smt)))
编辑:策略lia2pb
还假设每个有界整数变量的下限为零。这在实践中不是一个大问题,因为我们可以在应用normalize-bounds
之前使用策略lia2pb
。策略normalize-bounds
将使用x
替换绑定变量y + l_x
,其中y
是新变量,l_x
是x的下限。例如,在包含3 <= x
的目标中,x
替换为y+3
,其中y
是新的新变量。