Я пытаюсь получить все возможные модели для некоторой теории первого порядка с использованием Z3, решателя SMT, разработанного Microsoft Research. Вот минимальный рабочий пример:
(declare-const f Bool)
(assert (or (= f true) (= f false)))
В этом пропозициональном случае есть два удовлетворяющих назначения: f->true
и f->false
. Поскольку Z3 (и SMT-решатели в целом) будут пытаться найти только одну удовлетворяющую модель, найти все решения невозможно. Здесь я нашел полезную команду под названием (next-sat)
, но кажется, что последняя версия Z3 больше не поддерживает это. Это немного неудачно для меня, и в целом я думаю, что команда весьма полезна. Есть ли другой способ сделать это?