Z3 SMT中量化算法的推理限制是什么?

Z3 SMT中量化算法的推理限制是什么?,z3,smt,cvc4,Z3,Smt,Cvc4,我在以下看似微不足道的基准上尝试了几种SMT解决方案(CVC3、CVC4和Z3): (set-logic LIA) (set-info :smt-lib-version 2.0) (assert (forall (( x Int)) (forall ((y Int)) (= y x)))) (check-sat) (exit) 解算器都返回未知。我知道这是一个不可判定的片段(很好是非线性的),但我希望会有一些简单的实例化启发法来解决它。我还尝试用常量添加一些额外的断言,但没有帮助 有没有办法解

我在以下看似微不足道的基准上尝试了几种SMT解决方案(CVC3、CVC4和Z3):

(set-logic LIA)
(set-info :smt-lib-version 2.0)
(assert (forall (( x Int)) (forall ((y Int)) (= y x))))
(check-sat)
(exit)
解算器都返回未知。我知道这是一个不可判定的片段(很好是非线性的),但我希望会有一些简单的实例化启发法来解决它。我还尝试用常量添加一些额外的断言,但没有帮助


有没有办法解决这些问题?SMT中量化算法的推理限制是什么?

您的示例属于线性整数算法(LIA)范畴

LIA即允许量词消除(qe),尽管qe程序的时间复杂度高得令人望而却步

我不确定CVC3和CVC4是否支持LIA的量词消除,但在Z3中可以这样做

(set-logic LIA)
(set-info :smt-lib-version 2.0)
(assert (forall (( x Int)) (forall ((y Int)) (= y x))))
(check-sat-using (then qe smt))
从中,我得到了
unsat
结果


这里的
qe
策略是应用游戏结束策略之前的预处理步骤
smt
Pad是正确的,
qe
预处理器可能非常昂贵。此外,它对来自软件验证工具(如、、和)的公式无效。这是无效的,因为这些应用程序生成的公式还包含未解释的函数、数组等

正如Pad的回答所表明的,Z3是一组引擎。它提供API和命令,允许用户选择使用哪个引擎(或引擎组合)来解决问题。当用户只说
(check sat)
时,他会尝试猜测什么是解决输入公式的最佳引擎。猜测基于用户提供的输入公式和注释的结构(例如:
set logic
命令)。我们正在不断扩展自动检测的片段集,以及我们提供的引擎集

尽管如此,令人尴尬的是Z3遗漏了一个片段,例如
LIA
,并且没有自动将
qe
过程应用到它。对于
LIA
公式,
qe
通常是最佳选择。基于电子匹配或MBQI的替代方案无效,因为它们适用于完全不同的片段

我只是检测
LIA
(即使未使用
set logic
)。更改已在
不稳定
(正在处理)分支中可用。它将在明天的夜间版本和下一个正式版本中提供