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
。
如何将 True
或 False
值分配给在 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_0
、a_1
等视为可变变量,就像您在常规 Python 中所拥有的那样:z3py 是一个“函数式编程”环境,即,您不能改变声明的变量。 (当然,您可以对它们进行断言约束。)
如果您的目的是为一种编程语言建模,其中变量被声明、初始化和变异;您首先必须转换为所谓的 SSA(静态单一赋值)形式,请参阅:https://en.wikipedia.org/wiki/Static_single_assignment_form
关于 stack-overflow 的其他问题也处理类似的问题。看这个,例如:
我创建了一个布尔变量列表,如下所示:
lk=[Bool("a_0"), Bool("a_1"), Bool("a_2")]
我想将所有这些布尔变量初始化为 False
。
如果我写
for i in lk: i=False
它不会将变量 a_0, a_1, a_2
设置为 False
。
如何将 True
或 False
值分配给在 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_0
、a_1
等视为可变变量,就像您在常规 Python 中所拥有的那样:z3py 是一个“函数式编程”环境,即,您不能改变声明的变量。 (当然,您可以对它们进行断言约束。)
如果您的目的是为一种编程语言建模,其中变量被声明、初始化和变异;您首先必须转换为所谓的 SSA(静态单一赋值)形式,请参阅:https://en.wikipedia.org/wiki/Static_single_assignment_form
关于 stack-overflow 的其他问题也处理类似的问题。看这个,例如: