【问题标题】:What is Z3Py FreshBool() function?什么是 Z3Py FreshBool() 函数?
【发布时间】:2021-02-16 19:48:22
【问题描述】:

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

我无法在此处提供代码的详细信息,因为它是我大学提供的课程中正在进行的作业的一部分。 尽管如此,如果这些信息还不够,我可以尝试在不相关的代码中重新创建,为您提供更好的示例来处理。 谢谢

【问题讨论】:

    标签: syntax z3 z3py sat sat-solvers


    【解决方案1】:

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

    也就是说,考虑一下:

    from z3 import *
    
    # These two are *different* variables even though they have the same name
    a = FreshBool("a")
    b = FreshBool("a")
    
    s = Solver();
    
    s.add(a != b)
    print(s.check())
    

    这将打印:

    sat
    

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

    但如果你尝试:

    from z3 import *
    
    # These two are the *same* variable, since they have the same name
    a = Bool("a")
    b = Bool("a")
    
    s = Solver();
    
    s.add(a != b)
    print(s.check())
    

    然后你会得到:

    unsat
    

    因为ab 是同一个变量,因为它们具有相同的名称。

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

    sat
    [a!0 = True, a!1 = False]
    

    显示内部创建的“新鲜”名称。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多