z3py在循环中执行量词消除时停止

z3py在循环中执行量词消除时停止,z3,z3py,Z3,Z3py,我尝试在Python中应用以下量词消除。在第三次迭代中,z3没有返回并被卡住。我使用Python 2.7.17和Ubuntu 18.04.4 from z3 import * for i in range(0,10) : n,X_0_, X_1_= Ints('n X_0_ X_1_') R_0_0, R__0, R_1_0, R__1= Ints('R_0_0 R__0 R_1_0 R__1') all=[n >= 3, X_0_ + X_1_ =

我尝试在Python中应用以下量词消除。在第三次迭代中,z3没有返回并被卡住。我使用Python 2.7.17和Ubuntu 18.04.4

from  z3 import *

for i in range(0,10) :
      n,X_0_, X_1_= Ints('n X_0_ X_1_')
      R_0_0, R__0, R_1_0, R__1= Ints('R_0_0 R__0 R_1_0 R__1')
      all=[n >= 3, X_0_ + X_1_ == n,X_0_ >= 0,R_0_0 <= X_0_, R_0_0 >= 0]
      all.extend([R_0_0 <= R__0, X_1_ >= 0, R_1_0 <= X_1_, R_1_0 >= 0, R_1_0 <= R__0, R_0_0 + R_1_0 == R__0])
      all.extend([3*R__0 > 2*n, R_1_0 > R_0_0, 3*R_1_0 <= 2*n, 3*R__1 <= 2*n])
      expr = And(*all)
      expr = Exists([R_0_0, R__0, R_1_0, R__1],expr)
      print "before:",expr
      tactic = Then(Tactic('qe'),Tactic('simplify'),Tactic('solve-eqs'))     
      expr=tactic(expr).as_expr()
      print "after:",expr
      print i
从z3导入*
对于范围(0,10)内的i:
n、 X_0_uuu,X_1_uuuu=int('nx_0_uuuu1_uuu'))
R_0_0,R_0,R_1_0,R_1=int('R_0_0 R_0 R_0 R_1_0 R_1'))
all=[n>=3,X_0+X_1==n,X_0_>=0,R_0_0=0]

扩展([R_0_0=0,R_1_0=0,R_1_0 2*n,R_1_0>R_0,3*R_1_0这个问题和你以前问的有什么不同吗?这里:


但是,建议是完全相同的!如果这是一个不同的问题,请明确您这次试图实现的不同目标。

显然,战术
qe
不适合这个小表达式。相反,应该使用战术
qe2
进行更轻的可行性检查。此外,简化应该在排除量词之前完成

所以这行代码

tactic = Then(Tactic('qe'),Tactic('simplify'),Tactic('solve-eqs'))
应替换为以下行

tactic = Then(Tactic('simplify'),Tactic('qe2'),Tactic('solve-eqs'))

在这里,我提供了一个代码来重新解释错误。我也在你提到的链接中发布了它。我想知道这可能不是z3中的问题,而是我的实现中的问题。