我一直在努力解决一个包含某些术语绝对值的小问题。在z3中,不支持abs()函数。在python中有,但我最终必须将它传递给z3py。有什么方法可以通过它将绝对运算符的术语从python传递给z3,还是有其他方法吗?以下是一个小例子的代码。
`
x = Int('x')
y = Int('y')
x= abs(2-y)
s=Solver()
s.add(x>0)
s.add(y>0)
s.check()
m=s.model()
print m`
答案应该是y = 1,这是删除abs()时的情况。有没有办法用绝对值函数来解决这个问题? ABS()。或者有什么方法可以在python中解决它,然后我可以将它传递给z3。我也尝试过同情,但它不起作用。
答案 0 :(得分:6)
这是一种方法:
x = Int('x')
y = Int('y')
def abs(x):
return If(x >= 0,x,-x)
s=Solver()
s.add(x == abs(y-2))
s.add(x>0)
s.add(y>0)
s.check()
m=s.model()
print m
答案 1 :(得分:0)
绝对价值的想法很简单。你想知道从零开始的距离。这样做的一种方法是翻转所有否定词的标志。
if x<0:
x=-x
答案 2 :(得分:0)
您可以转换问题,因此不需要abs
。
在您的特定问题中'x = abs(2-y),x&gt; 0',所以'abs(2-y)&gt; 0' 。绝对值不能为负数,只剩下y!= 2。
所以你可以删除x定义和x相关的约束,只需添加'y!= 2' - 你就会遇到同样的问题。
如果你需要x的值,那么稍后在Python中从y的值得到它。