你可以简单地把它写在量化中作为一种暗示。我想你也把其中的一些变量弄混了。以下内容似乎抓住了您的意图:
from z3 import *
def f0(x0, x1, x, y):
return x1 * x1 * y + x0 * x0 * x
s = Solver()
p0, p1 = Reals('p0 p1')
x0, x1 = Reals('x0 x1')
s.add(ForAll([x0, x1], Implies(Or(x0 != 0, x1 != 0), f0(x0, x1, p0, p1) > 0)))
while True:
res = s.check()
print res
if res == sat:
m = s.model()
print m
s.add(Or(p0 != m[p0], p1 != m[p1]))
else:
print "giving up"
break
当然,z3不能保证为您找到任何解决方案;尽管它似乎可以做到:
$ python a.py
sat
[p1 = 1, p0 = 1]
unknown
giving up
一旦你使用了量词,所有的赌注都被取消了,因为逻辑变得半决定性。Z3在这里做得很好,返回了一个解决方案,然后就放弃了。我认为,除非您使用一些定制的决策程序,否则您不会期望有更好的结果。