使用z3py API。从advanced examples读取每个例子都有一个通用量词。想用量词交替。
例如:
for_all X存在Y
我认为它有用的一个实例是(对于所有图形都存在一个函数......)。 我可以在Z3py中实现它吗?如果没有,我该怎么办?谢谢。
答案 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因不完整而无法确定其有效性,那么您也可能会得到“未知”作为答案。