随后在不同的变量和公式上调用Z3py的Exists函数时,我得到完全相同的结果。这是某种Python问题还是在这里打破了Z3?怎么修?以下最小示例说明了问题:
from z3 import *
a, a0, a1, b, b0, b1 = Ints('a a0 a1 b b0 b1')
x, y = Bools('x y')
s = Solver()
formula = Implies(x, And(a>0,b1<0))
substitution1 = substitute(formula,(a1,a0),(b1,b0))
substitution2 = substitute(formula,(a1,a0),(b1,b0),(a,a1),(b,b1))
print substitution1
print substitution2
exist1 = Exists([a,b],substitution1)
exist2 = Exists([a1,b1],substitution2)
print exist1
print exist2
输出:
Implies(x, And(a > 0, b0 < 0))
Implies(x, And(a1 > 0, b0 < 0))
Exists([a, b], Implies(x, And(a > 0, b0 < 0)))
Exists([a, b], Implies(x, And(a > 0, b0 < 0)))
答案 0 :(得分:0)
感谢你的报道。事实上Z3对此是正确的,但输出令人困惑。在内部,Z3使用deBrujin指数,绑定变量的名称并不重要。当创建具有相同主体(和模式,no_patterns等)的量词时,使用之前看到的完全相同的表达式,以避免必须解决与之前相同的量化约束。这造成了令人困惑的情况,因为突然绑定变量的名称似乎已经改变。
在这里给出的例子中,两个量词的实体确实相同,变量的名称无关紧要。 Z3可以为这些变量使用任何名称,但它选择使用第一次创建量词时使用的名称。我们可以禁用它,例如,添加
compare_arrays(to_quantifier(n1)->get_decl_names(),
to_quantifier(n2)->get_decl_names(),
to_quantifier(n1)->get_num_decls()) &&
在src / ast / ast.cpp:470。然而,这可能会对Z3在某些基准测试中的表现产生负面影响,因此我不会做出这样的改变。如果您想使用它,您当然可以将它添加到Z3的本地副本中。