Z3能否有效解决最大操作约束?

时间:2016-07-13 15:59:59

标签: z3 solver z3py

假设我想解决以下约束:deleteFlag。我能想到的是编码以下(在z3py接口中):y == max(x, 0)。我的问题是:

  1. Z3是否会在内部将上述表达式转换为两个约束:If(x > 0, y == x, y == 0)x > 0 /\ y == x,然后对其进行 OR ,并在两者中的任何一个时返回sat约束是否可以满足?
  2. 如果是这样,似乎约束的数量将随着x <= 0 /\ y == 0操作的数量呈指数增长。我有一个超过100 max的系统。是否有一种有效的解决方法,无论是在Z3还是其他解决方案中?
  3. 谢谢!

2 个答案:

答案 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接口的语法是什么。