В z3py это будет просто:
from z3 import *
s = Solver()
a = Int('a')
s.add(a == 10)
print s.check()
print s.model()
, который печатает:
sat
[a = 10]
Назначение против равенства
Когда вы программируете в SMTLib или Z3pyлучше рассматривать равенство как сравнение, а не как задание. Когда вы говорите:
(assert (= a 10))
в SMTLib, вы не назначаете что-либо на a
. Все, что вы говорите, это то, что значение a
должно сравниваться равным 10
. На самом деле выражение (= a 10)
имеет тип Bool
, поэтому вы можете эквивалентно сказать:
(assert (= true (= a 10)))
, что было бы избыточным, но оно иллюстрирует суть.
Путаница в том,Конечно, «сравнение на равенство» в SMTLib называется =
, но в Python это ==
;и что еще хуже, =
имеет смысл в Python как присваивание;но это не значит, что ты пытаешься сказать. Если вы знакомы с функциональным программированием, подумайте о программах SMTLib / Z3Py как о совокупности переменных разных типов и утверждений об отношениях между ними.
Надеюсь, это поможет! Задавать конкретные вопросы всегда лучше, чем английская проза;не стесняйтесь размещать фрагменты кода, которые могут сбивать с толку.