更新 z3 变量或线性求解
Updating z3 Variable or Linear Solving
我是 Z3 的新手,所以这可能是个愚蠢的问题。我正在尝试对程序的执行流程进行建模。现在通过手动 z3 调用来执行此操作。也就是说,我最终尝试建模如下:
x = 1
x += 1
执行以下命令让我感到不满意,我明白为什么。
x = z3.Int('x')
s.add(x == 1)
s.add(x == x + 1)
在小范围内,手动将 x == 1 更改为 x == 2 可能是合理的。我的问题是,有没有办法在 z3 中执行此操作,而我不必返回并尝试修改我放入求解器的变量?方程式显然会变得比 +1 更麻烦,并且尝试手动完成该逻辑似乎容易出错且草率。
编辑:按照建议调整我的程序以使用 SSA 后,它现在工作起来非常容易。我确实选择保留变量的多个版本,但这并没有变成太多额外的工作。
您可以重命名变量,使其成为 SSA 形式 (https://en.wikipedia.org/wiki/Static_single_assignment_form)。
此外,您可能不需要为中间表达式引入名称。唯一的 Z3 变量应该是程序输入或类似的东西。
我是 Z3 的新手,所以这可能是个愚蠢的问题。我正在尝试对程序的执行流程进行建模。现在通过手动 z3 调用来执行此操作。也就是说,我最终尝试建模如下:
x = 1
x += 1
执行以下命令让我感到不满意,我明白为什么。
x = z3.Int('x')
s.add(x == 1)
s.add(x == x + 1)
在小范围内,手动将 x == 1 更改为 x == 2 可能是合理的。我的问题是,有没有办法在 z3 中执行此操作,而我不必返回并尝试修改我放入求解器的变量?方程式显然会变得比 +1 更麻烦,并且尝试手动完成该逻辑似乎容易出错且草率。
编辑:按照建议调整我的程序以使用 SSA 后,它现在工作起来非常容易。我确实选择保留变量的多个版本,但这并没有变成太多额外的工作。
您可以重命名变量,使其成为 SSA 形式 (https://en.wikipedia.org/wiki/Static_single_assignment_form)。 此外,您可能不需要为中间表达式引入名称。唯一的 Z3 变量应该是程序输入或类似的东西。