z3py试图消除量词

z3py试图消除量词,z3,z3py,quantifiers,Z3,Z3py,Quantifiers,我有一个Python程序,其中我生成了不同的z3公式,然后我对其中一些公式进行了存在量化。我的程序过去运行得很好,但突然间,它开始停止尝试对一些表达式进行量词消除。代码不会返回并挂起这些示例。这是发生问题的输入之一。所有变量都是整数。我试图打印expr,但从未打印过。在有问题的情况下,这个过程也不容易终止。我必须通过关闭终端(ubuntu)来强制它 让我困惑的是,如果我通过从头声明变量和表达式来重新生成这个表达式,它就可以正常工作。 我错过了什么? 战术是否可以超时?您可以将超时与从战术中获得的

我有一个Python程序,其中我生成了不同的z3公式,然后我对其中一些公式进行了存在量化。我的程序过去运行得很好,但突然间,它开始停止尝试对一些表达式进行量词消除。代码不会返回并挂起这些示例。这是发生问题的输入之一。所有变量都是整数。我试图打印
expr
,但从未打印过。在有问题的情况下,这个过程也不容易终止。我必须通过关闭终端(ubuntu)来强制它

让我困惑的是,如果我通过从头声明变量和表达式来重新生成这个表达式,它就可以正常工作。 我错过了什么?
战术
是否可以超时?

您可以将超时与从战术中获得的解算器相关联:

从z3导入*
s=策略('qe_rec')。解算器()
s、 设置(“超时”,500)
不幸的是,根据我的经验,这并不是那么可靠:首先,并非所有的战术都支持超时,其次,实现似乎不可靠;也就是说,超时并不总是得到尊重。不幸的是,没有足够的文档说明如何正确地执行此操作

关于为什么量词消除可能令人窒息:如果不向代码中添加跟踪语句并在调试模式下运行它,就无法判断。显然,这不是一件容易的事情,也不容易找出根本原因

我建议在这里向z3的人提出一个问题:最好给他们一些他们至少可以运行和复制这个问题的东西,而不是像这样问一个一般性的问题。请报告你发现的情况

Exists([R_1_0, R__0, R_0_1, R__1, R_0_0, R_1_1],
       And(n >= 3,
           X == n,
           X_0_ + X_1_ == X,
           X_0_ >= 0,
           R_0_0 <= X_0_,
           R_0_0 >= 0,
           R_0_0 <= R__0,
           R_0_1 <= X_0_,
           R_0_1 >= 0,
           R_0_1 <= R__1,
           X_1_ >= 0,
           R_1_0 <= X_1_,
           R_1_0 >= 0,
           R_1_0 <= R__0,
           R_1_1 <= X_1_,
           R_1_1 >= 0,
           R_1_1 <= R__1,
           R__0 <= X,
           R__1 <= X,
           R_1_0 + R_0_0 == R__0,
           R_1_1 + R_0_1 == R__1,
           And(True,
               And(And(3*R__0 > 2*n, R_0_0 >= R_1_0),
                   3*R_0_0 <= 2*n),
               And(And(3*R__1 <= 2*n, 3*R_0_1 <= 2*n),
                   3*R_1_1 <= 2*n))))

z3_expr = And(*conjuncts)// a list of small expressions like R_0_0 >= 0 produced by the program
z3_expr = Exists(some_variables,z3_expr)
tactic = Then(Tactic('qe'),Tactic('simplify'),Tactic('solve-eqs'))      
expr=tactic(z3_expr).as_expr()//this line doesn't return in some cases