"Человеческий мозг это пустой чердак. Дурак так и делает: тащит туда нужное и не нужное. И наконец наступает момент, когда самую необходимую вещь туда не запихнешь, или наоборот не достанешь..."
В.Б. Ливанов (из к/ф "Шерлок Холмс и доктор Ватсон")
Данное руководство не охватывает весь функционал SMT решателя. Оно написано для таких ситуаций, когда человеку срочно нужно вспомнить, подсмотреть как реализовать ту или иную его идею, не тратя много времени на поиск информации, отладку и т.д. Иными словами это руководство — шпаргалка, затрагивающая лишь часто применяемое.
Типы данных
x = Int('x')
y = Real('y')
z = Bool('z')
s = String('s')
x, y, z = Ints('x y z')
x, y, z = Reals('x y z')
x, y, z = Bools('x y z')
x, y, z = Strings('x y z')
v = BitVec('v', N) # N — размер бит-вектора
X = IntVector('X', N)
Y = RealVector('Y', N)
Z = BoolVector('Z', N)
A = Array('A', b, c) # b — область определения, с — диапазон
Select(A, i) # все равно что A[i]
Store('A', i, a) # возвращает массив A c a на i-ой позиции
Goal (цель) — это ограничения которые мы даем решателю. Обработка цели происходит в соответствии с тактикой. Тактика превращает цель в подцели. Цель решаема, если хотя бы одна подцель решаема.
g = Goal()
g.add(...)
Копирование Goal
c = Context()
g2 = g.translate(c)
Тактики
Тактика позволяет изменить набор ограничений для цели. Для создания тактик используются комбинаторы.
tactics() — посмотреть доступные тактики
tactic_description('tactic_name') — посмотреть описание тактики
Ex:
g = Goal()
x, y = Ints('x y')
g.add(x == y + 1)
t = With(Tactic('add-bounds'), add_bound_lower=0, add_bound_upper=10)
g2 = t(g)
print(g2.as_expr())
Out:
And(x == y + 1, x <= 10, x >= 0, y <= 10, y >= 0)