我是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后,它现在非常容易。我确实选择保留变量的多个版本,但这并没有变成额外的工作。
答案 0 :(得分:0)
您可以重命名变量,使其处于SSA格式(https://en.wikipedia.org/wiki/Static_single_assignment_form)。 此外,您可能不需要为中间表达式引入名称。唯一的Z3变量应该是程序输入或类似的东西。