使用量词查找SMT系统解决方案的复杂性

时间:2019-01-11 08:55:06

标签: z3 smt z3py

我需要通过使用z3py进行生成来找到问题的解决方案。取决于用户的输入来生成公式。在公式生成期间,将创建临时SMT变量,该变量只能采用有限数量的值,例如,它是整数,仅允许偶数值。对于这种情况,让临时变量为ab,它们与全局变量xy的关系由谓词P(a,b,x,y)定义。

使用SMT-LIB之类的语法生成的示例:

(set-info :status unknown)
(declare-fun y () Int)
(declare-fun x () Int)
(assert
(forall (
    (a Int) (b Int) (z Int) )
    (let 
      (($x22 (exists ((z Int))(and (< x z) (> z y)))))
      (=> 
          P(a, b, x, y) 
          $x22))))
(check-sat)

其中

  • z是一个变量,必须考虑所有可能的值
  • ab代表变量,其允许值受谓词P限制
  • 需要计算满足公式的变量“ x”和“ y”。

问题:

  • 谓词P是否减少了z3查找解决方案所需的时间?
  • 或者:查看z3za的所有可能值执行搜索,谓词P会减小搜索空间的大小吗?

注意:该问题是在Levent Erkok发表评论后更新的。

1 个答案:

答案 0 :(得分:3)

您给出的(生成或手写的)SMTLib示例对我来说没有多大意义。您对xz进行了通用量化,并且在其中又对z进行了定量存在,整个公式似乎毫无意义。但这也许不是您的意思,这只是一个玩具。因此,我将直接忽略它。

通常,“冗余方程式”(如您所说)不会影响性能。 (通过冗余,我假设您的意思是从您提供的其他事实衍生的事物吗?)另外:上述公式中的a=z根本不是多余的。

只要您保留在逻辑的可确定子集中,这应该是正确的;这通常意味着线性且无量词。

这里的问题是您有数量词,尤其是嵌套数量词。 SMT解决方案不能很好地处理它们。 (在堆栈溢出中搜索有关数量词和z3的许多问题。)因此,如果您遇到性能问题,最好的策略是查看您是否确实需要它们。仅通过查看您发布的示例,就无法说出来,因为它似乎并没有说明一个合法的事实。因此,看看您是否可以在不使用量词的情况下表达自己的财产。

如果必须使用量词,那么您将受到电子匹配器和启发式方法的支配,所有赌注都关闭了。在那种情况下,我已经看到了疯狂的性能特征。而且,如果您要使用量词推理,那么我认为SMT求解器不是您的正确工具,而应该使用HOL / Isabelle / Coq等定理证明,它们对量词具有内置支持和高阶逻辑。

如果您要发布一个实际示例,说明您正试图让z3证明自己,那么我们也许可以查看是否存在另一种公式化它的方法,这可能会使z3更加容易处理。没有特定的目标和示例,就不可能进一步限制性能。