假设我想解决以下约束:deleteFlag
。我能想到的是编码以下(在z3py接口中):y == max(x, 0)
。我的问题是:
If(x > 0, y == x, y == 0)
和x > 0 /\ y == x
,然后对其进行 OR ,并在两者中的任何一个时返回sat约束是否可以满足?x <= 0 /\ y == 0
操作的数量呈指数增长。我有一个超过100 max
的系统。是否有一种有效的解决方法,无论是在Z3还是其他解决方案中?谢谢!
答案 0 :(得分:2)
使用python接口,您可以定义:
def mymax(x,y):
return If(x > y, x, y)
这不会产生指数数量的约束。
在许多情况下,只需强制执行max规定的不等式的一方就足够了。在这些情况下,引入一个新变量max_x_y和assert
max_x_y >= x, max_x_y >= y
当你还需要max_x_y&lt; = max(x,y)时,Z3的标准方法是使用mymax而不是引入新变量。
答案 1 :(得分:1)
如果所有最大操作都出现在y > max(x, 0)
形式的上下文中,我会将它们编码为(and (> y x) (> y 0))
(SMT-LIB),它没有分支。我不确定使用Python接口的语法是什么。