Z3中量词的变化?

时间:2017-06-11 04:03:38

标签: z3 z3py quantifiers

使用z3py API。从advanced examples读取每个例子都有一个通用量词。想用量词交替。

例如:

  

for_all X存在Y

我认为它有用的一个实例是(对于所有图形都存在一个函数......)。 我可以在Z3py中实现它吗?如果没有,我该怎么办?谢谢。

1 个答案:

答案 0 :(得分:2)

这确实可以用Z3 / Python实现。但请记住,当量词出现时,逻辑变为半可判定的:也就是说,Z3可能会或可能不会回答您的查询。 (它不会告诉你任何错误,但可能无法解决查询。)

这是算术的一阶逻辑的一个例子,它是微不足道的,但希望它说明了语法:

 (∀x∃y.f(x,y)) → (∀x∃v∃y.(y ≤ v ∧ f(x,y)))

以下是如何在Z3中编写代码,假设f是一个带有两个整数并返回布尔值的函数符号:

from z3 import *

f = Function('f', IntSort(), IntSort(), BoolSort())
x, y, v = Ints('x y v')

lhs = ForAll(x, Exists(y, f(x, y)))
rhs = ForAll(x, Exists([v, y], And(y <= v, f (x, y))))
thm = Implies(lhs, rhs)

print thm

solve(Not(thm))

请注意,在最后一行中,我们要求Z3 solve否定我们的定理:Z3检查是否满足;所以,如果它说unsat否定我们的定理,那么我们就会知道我们有一个证据。

这是我得到的输出:

Implies(ForAll(x, Exists(y, f(x, y))),
        ForAll(x, Exists([v, y], And(y <= v, f(x, y)))))
no solution

因此,在这种情况下,Z3能够建立定理。

然而,根据您的问题,如果事实证明Z3因不完整而无法确定其有效性,那么您也可能会得到“未知”作为答案。