我需要通过使用z3py
进行生成来找到问题的解决方案。取决于用户的输入来生成公式。在公式生成期间,将创建临时SMT变量,该变量只能采用有限数量的值,例如,它是整数,仅允许偶数值。对于这种情况,让临时变量为a
和b
,它们与全局变量x
和y
的关系由谓词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
是一个变量,必须考虑所有可能的值a
和b
代表变量,其允许值受谓词P
限制问题:
P
是否减少了z3
查找解决方案所需的时间?z3
对z
和a
的所有可能值执行搜索,谓词P
会减小搜索空间的大小吗?注意:该问题是在Levent Erkok发表评论后更新的。
答案 0 :(得分:3)
您给出的(生成或手写的)SMTLib示例对我来说没有多大意义。您对x
和z
进行了通用量化,并且在其中又对z
进行了定量存在,整个公式似乎毫无意义。但这也许不是您的意思,这只是一个玩具。因此,我将直接忽略它。
通常,“冗余方程式”(如您所说)不会影响性能。 (通过冗余,我假设您的意思是从您提供的其他事实衍生的事物吗?)另外:上述公式中的a=z
根本不是多余的。
只要您保留在逻辑的可确定子集中,这应该是正确的;这通常意味着线性且无量词。
这里的问题是您有数量词,尤其是嵌套数量词。 SMT解决方案不能很好地处理它们。 (在堆栈溢出中搜索有关数量词和z3的许多问题。)因此,如果您遇到性能问题,最好的策略是查看您是否确实需要它们。仅通过查看您发布的示例,就无法说出来,因为它似乎并没有说明一个合法的事实。因此,看看您是否可以在不使用量词的情况下表达自己的财产。
如果必须使用量词,那么您将受到电子匹配器和启发式方法的支配,所有赌注都关闭了。在那种情况下,我已经看到了疯狂的性能特征。而且,如果您要使用量词推理,那么我认为SMT求解器不是您的正确工具,而应该使用HOL / Isabelle / Coq等定理证明,它们对量词具有内置支持和高阶逻辑。
如果您要发布一个实际示例,说明您正试图让z3证明自己,那么我们也许可以查看是否存在另一种公式化它的方法,这可能会使z3更加容易处理。没有特定的目标和示例,就不可能进一步限制性能。