Tactic不支持的目标

时间:2012-09-18 16:39:54

标签: z3

我有一些代码,我想借助一些策略来检查。由于我有很多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错误。

我应该尝试帮助坐着的解决方案解决问题是什么? 我应该尝试其他策略吗?

1 个答案:

答案 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是新的新变量。