具有forall量词的公式的可满足性

时间:2016-06-08 15:14:23

标签: python z3 smt z3py first-order-logic

这是我的Python代码:

s = z3.Solver()

f = z3.Function('f', z3.IntSort(), z3.IntSort())
g = z3.Function('g', z3.IntSort(), z3.IntSort())
h = z3.Function('h', z3.IntSort(), z3.IntSort())

a, b, c = z3.Ints('a b c')

imp_a = z3.And(f(a) == b, g(a) == c)
imp_b = h(c) == b
ax = z3.ForAll(a, z3.Implies(imp_a, imp_b))

l = [
    ax,
    f(1) == 5,
    g(1) == 2,
    h(2) != 5
]
s.add(l)

if s.check() == z3.sat:
    print s.model()
else:
    print 'Unsat'

在这段代码中,我用Z3Py语法编写了以下公式:

forall a, (f(a) == b and g(a) == c) => h(c) == b

当我运行此脚本时,它会找到一个模型,而我认为它应该是unsat。怎么可能呢?我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

您忘记绑定bc

ax = z3.ForAll([a,b,c], z3.Implies(imp_a, imp_b))

绑定bc后,结果为unsat。如果你不绑定bc,那么它们将被视为自由常量,并且有一个公式模型。