如果采用的策略不适合特定问题,那么Z3的行为通常是什么?例如:
(declare-fun x () Real)
(declare-fun y () Real)
(assert (= x (* y y)))
(check-sat-using qflia)
此特定示例返回sat
。我对此感到惊讶,因为问题不在QFLIA
中。我原以为是错误,或unknown
。
即使您不知道您所应用的策略是否实际适用于特定问题实例,是否可以安全地应用策略?
答案 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将失败(返回未知)。