【发布时间】:2021-09-24 10:46:56
【问题描述】:
我有一个要解决的非线性整数不等式系统。在其中我需要计算整数的绝对值以及两个整数的最大值/最小值。
这是一个玩具示例:
from z3 import *
set_option(verbose=10)
x, y, z, z1 = Ints('x y z z1')
def abs(x):
return If(x >= 0,x,-x)
def max(x, y):
return If(x>=y, x, y)
def min(x, y):
return If(x<=y, x, y)
s = Solver()
s.add(x**2 + y**2 >= 26)
s.add(min(abs(y), abs(x))> 5)
s.add(3*x**2 + 25*y**2 >= 100)
s.add(x*y - z*z1 < 10)
s.add(max(abs(z), abs(z1)) <= 10)
s.add(min(abs(z), abs(z1)) > 1)
s.check()
print(s.model())
我的真实系统更复杂,运行时间更长。
我不太了解 Z3 的底层工作原理,但我担心我使用 Python 函数定义 abs、max 和 min 的方式可能会使 Z3 难以解决不平等。有没有更好的方法可以让 Z3 更有效率?
【问题讨论】: