Syntax 什么是Z3Py FreshBool()函数?

Syntax 什么是Z3Py FreshBool()函数?,syntax,z3,z3py,sat,sat-solvers,Syntax,Z3,Z3py,Sat,Sat Solvers,z3.Bool()和z3.FreshBool()函数之间有什么区别? 当我使用Bool()时,python上z3中的代码失败(当不应该时,解算器返回unsat),但当我使用FreshBool()时,代码工作正常(观察到所需的行为) 我不能在这里给出代码的细节,因为它是我所在学院课程中正在进行的作业的一部分。 即使如此,如果这些信息还不够,我也可以尝试在一个不相关的代码中重新创建,为您提供更好的示例。 谢谢如果您使用FreshBool(),那么z3将创建系统中其他地方不存在的新变量。当您使用Boo

z3.Bool()和z3.FreshBool()函数之间有什么区别? 当我使用Bool()时,python上z3中的代码失败(当不应该时,解算器返回unsat),但当我使用FreshBool()时,代码工作正常(观察到所需的行为)

我不能在这里给出代码的细节,因为它是我所在学院课程中正在进行的作业的一部分。 即使如此,如果这些信息还不够,我也可以尝试在一个不相关的代码中重新创建,为您提供更好的示例。 谢谢

如果您使用
FreshBool()
,那么z3将创建系统中其他地方不存在的新变量。当您使用
Bool
并给它一个名称时,如果在其他地方创建,它将是相同的变量

也就是说,考虑一下:

从z3导入*
#这两个变量是*不同*的,即使它们有相同的名称
a=FreshBool(“a”)
b=FreshBool(“a”)
s=解算器();
s、 加上(a!=b)
打印(s.check())
这将打印:

sat
因为变量是不同的。(因此在模型中可以有不同的值。)

但如果你尝试:

从z3导入*
#这两个变量是*相同*的,因为它们具有相同的名称
a=布尔(“a”)
b=布尔(“a”)
s=解算器();
s、 加上(a!=b)
打印(s.check())
然后你会得到:

unsat
因为
a
b
是相同的变量,因为它们具有相同的名称

大多数最终用户代码应该简单地使用
Bool
,因为这是通常的预期语义:当您创建不同的变量时,使用它们的名称引用它们。但是在开发库时,您可能希望创建一个与系统中的任何其他变量不同的临时变量。在这些情况下,可以使用
FreshBool
。请注意,在后一种情况下,您提供的字符串用作前缀。如果在第一个程序末尾添加
print(get_model())
,它将打印:

sat
[a!0 = True, a!1 = False]
显示内部创建的“新”名称

z3还为其他类型提供类似的函数,如
Int()
vs
FreshInt()
Real()
vs
FreshReal()
等。;旨在以完全相同的方式使用