如何计算z3或z3py中的绝对值

时间:2014-03-21 00:35:16

标签: python z3 sympy z3py

我一直在努力解决一个包含某些术语绝对值的小问题。在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。我也尝试过同情,但它不起作用。

3 个答案:

答案 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的值得到它。