Что такое функция Z3Py FreshBool()?

В чем разница между функциями z3.Bool() и z3.FreshBool()? Мой код в z3 на python дает сбой, когда я использую Bool() (решатель возвращает unsat, когда он не должен), но отлично работает, когда я использую FreshBool() (наблюдается желаемое поведение).

Я не могу подробно рассказать здесь о коде, так как он является частью текущего задания в рамках курса, предлагаемого в моем колледже. Тем не менее, если этой информации недостаточно, я могу попытаться воссоздать ее в несвязанном коде, чтобы предоставить вам лучший образец для работы. Спасибо


person anon    schedule 16.02.2021    source источник


Ответы (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

потому что a и b - одна и та же переменная, так как они имеют одно и то же имя.

Большинство кодов конечных пользователей должны просто использовать Bool, так как это обычная предполагаемая семантика: вы ссылаетесь на разные переменные с их именами, когда вы их создаете. Но при разработке библиотек вы можете захотеть создать временную переменную, которая отличается от любой другой переменной в системе. В этих случаях вы используете FreshBool. Обратите внимание, что в этом последнем случае предоставленная вами строка используется в качестве префикса. Если вы добавите print(get_model()) в конце первой программы, она напечатает:

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

показывая внутренне созданные свежие имена.

z3 также предоставляет аналогичные функции для других типов, таких как Int() против FreshInt(), Real() против FreshReal() и т. д.; предназначены для использования точно таким же образом.

person alias    schedule 16.02.2021