如果使用不适用的策略,Z3的行为?

时间:2016-05-25 14:45:36

标签: z3

如果采用的策略不适合特定问题,那么Z3的行为通常是什么?例如:

(declare-fun x () Real)
(declare-fun y () Real)
(assert (= x (* y y)))
(check-sat-using qflia)

此特定示例返回sat。我对此感到惊讶,因为问题不在QFLIA中。我原以为是错误,或unknown

即使您不知道您所应用的策略是否实际适用于特定问题实例,是否可以安全地应用策略?

1 个答案:

答案 0 :(得分:0)

通过SMT-LIB 2 API发布(help-tactic)可提供有关不同内置策略及其支持选项的大量信息。在那里的某个地方,你会发现:

- qflia builtin strategy for solving QF_LIA problems.
    add_bound_lower (rational) (default: -2) lower bound to be added to unbounded variables.
    add_bound_upper (rational) (default: 2) upper bound to be added to unbounded variables.
    ...
    fail_if_inconclusive (bool) (default: true) fail if found unsat (sat) for under (over) approximated goal.

这里有一个有趣的参数是fail_if_inconclusive。据我了解,此参数表示,当使用add_bound_lower之类的近似值时,unsat结果将转换为unknown。事实上,在使用unsat时,似乎无法获得add_bounds结果。

我不确定这一点,但似乎将qflia策略应用于QFLIA以外的目标也可能被视为低估。与使用add-bounds时相比,这一点不那么明确,因为真正微不足道的不满足目标确实会使用qflia返回unsat,即使它们在QFLIA之外。例如,这会返回unsat

(declare-fun x () Real)
(assert (distinct x x))
(assert (= (* x x) 2.0))
(check-sat-using (using-params qflia :fail_if_inconclusive true))

我猜这个令人惊讶的结果背后的原因是,(distinct x x)可能足以使整个目标在预处理步骤中不可满足。

整体而言,策略API似乎如下工作:如果该策略包含目标的过高或过低,可能会使用看似不合适的策略获得有用的结果。如果由于战术与目标之间的不匹配而导致目标变得不稳定或坐着,则Z3将失败(返回未知)。