FreshInt
/ FreshReal
и т. Д. Предназначены для создания внутренних переменных, которые не видны пользователю.Вместо этого вы должны использовать Int('name')
и Real('name')
для создания переменных уровня пользователя, которые будут отображаться в моделях.
Если вы действительно хотите увидеть значение, вы можете добавить функцию observer
и использовать ее следующим образомthis:
from z3 import *
def observeInt(s, a):
obs = Int('observer')
s.add(obs == a)
# might want to check the following really returns sat!
s.check()
print s.model()[obs]
s = Solver()
a = FreshInt()
s.add(a + FreshInt() > 0)
s.add(a > 12)
print s.check()
observeInt(s, a)
Это печатает:
sat
13
Очевидно, что это не дешево (поскольку включает вызов check
), но это безопасно и так долго, как используетсяв ситуациях отладки для сильной руки z3, как вы выразились, это должно сработать.