我从https://git01.codeplex.com/z3 (89c1785b)ctx-solver-simplify
的 master 分支中看到了相当令人惊讶的行为,其中 z3.And() 的参数顺序似乎很重要:
#!/usr/bin/python
import z3
a, b = z3.Bools('a b')
p = z3.Not(a)
q = z3.Or(a, b)
for e in z3.And(p, q), z3.And(q, p):
print e, '->', z3.Tactic('ctx-solver-simplify')(e)
产生:
And(Not(a), Or(a, b)) -> [[Not(a), Or(a, b)]]
And(Or(a, b), Not(a)) -> [[b, Not(a)]]
这是Z3的错误吗?