Z3Py:如何设置在列表中声明的布尔变量?

Z3Py: How do I set boolean variable declared in List?

我创建了一个布尔变量列表,如下所示:

lk=[Bool("a_0"), Bool("a_1"), Bool("a_2")]

我想将所有这些布尔变量初始化为 False
如果我写

for i in lk: i=False

它不会将变量 a_0, a_1, a_2 设置为 False

如何将 TrueFalse 值分配给在 Z3Py 中的列表中声明的变量?非常感谢这方面的帮助。

正确的做法是:

from z3 import *

lk = [Bool("a_0"), Bool("a_1"), Bool("a_2")]

s = Solver()

for i in lk:
  s.add(i == False)

print(s.check())
print(s.model())

请注意,我们直接告诉求解器您希望通过 s.add 调用将这些变量设置为 False。当我 运行 我得到:

sat
[a_0 = False, a_1 = False, a_2 = False]

但是,我怀疑您的实际意图是“初始化”这些变量,然后再更改它们的值。这在 z3py 中是不可能的;您不应该将值 a_0a_1 等视为可变变量,就像您在常规 Python 中所拥有的那样:z3py 是一个“函数式编程”环境,即,您不能改变声明的变量。 (当然,您可以对它们进行断言约束。)

如果您的目的是为一种编程语言建模,其中变量被声明、初始化和变异;您首先必须转换为所谓的 SSA(静态单一赋值)形式,请参阅:https://en.wikipedia.org/wiki/Static_single_assignment_form

关于 stack-overflow 的其他问题也处理类似的问题。看这个,例如: