Z3发现模型与公理不一致

时间:2019-01-18 15:34:24

标签: python function z3 z3py forall

当使用z3-solver模块(4.8.0.0)在Python 3.6.7上运行此代码时,z3返回的模型对于公理似乎无效。

f = z3.Function('f', z3.IntSort(), z3.IntSort(), z3.IntSort())
x = z3.Int('x')
s = z3.Solver()
s.add(f(1, 10) == 42)
s.add(z3.ForAll([x], f(2, x) == f(1, x)))
s.check()
m = s.model()
print(m.eval(f(1, 10)))  # print 0
print(m.eval(f(2, 10)))  # print 0

为什么我们没有达到预期的42分?公理或函数有问题吗?

1 个答案:

答案 0 :(得分:1)

好像您的安装可能已失败,因为我无法复制此内容:

$ cat a.py
import z3
f = z3.Function('f', z3.IntSort(), z3.IntSort(), z3.IntSort())
x = z3.Int('x')
s = z3.Solver()
s.add(f(1, 10) == 42)
s.add(z3.ForAll([x], f(2, x) == f(1, x)))
print s.sexpr()
s.check()
m = s.model()
print(m.eval(f(1, 10)))  # print 0
print(m.eval(f(2, 10)))  # print 0

$ python a.py
(declare-fun f (Int Int) Int)
(assert (= (f 1 10) 42))
(assert (forall ((x Int)) (= (f 2 x) (f 1 x))))

42
42

请注意,我在您的代码中添加了print s.sexpr(),它很好地打印了生成的SMTLib。你看到一样吗?