Для проекта, который я начинаю, мне понадобится решатель SAT. Я использовал некоторые из них раньше, но в основном для экспериментов, а здесь основным ограничением для проекта является хорошая производительность. Я пытаюсь искать альтернативы и пытаюсь понять, как каждая альтернатива позиционируется в соответствии с моими конкретными требованиями. Особенно:
Мне нужно будет извлечь удовлетворительные назначения, а не только проверить выполнимость, и решатель должен позволить мне многократно решать одну и ту же формулу в поисках различных возможных удовлетворительных назначений, в конечном итоге эффективно выполняя итерацию по всем из них (например, без меня необходимо добавить пункт и начать все сначала).
Проект должен по-прежнему активно поддерживаться и быть достаточно качественным, а не отказываться от какого-то выигравшего конкурс исследовательского проекта после публикации (см.
picosat
).Более того, поскольку я использую C ++, решающая программа должна обеспечивать эффективный и (возможно) хорошо написанный интерфейс C ++.
Первым кандидатом, который я рассмотрел, был Z3, но я смущен документацией и не могу понять, поддерживается ли пункт 1. выше, и может ли это быть излишним, учитывая, что мне нужен только SAT, а не SMT. Интерфейс C ++ также кажется очень простым в использовании, но я не могу вынести того факта, что мне приходится называть переменные простыми строками (это очень плохо сочетается с моим окружающим алгоритмом. Разве этого нельзя избежать?).
Не могли бы вы дать мне какое-нибудь предложение по поводу того, какой решатель SAT использовать, или пролить свет на сомнения относительно Z3?
get-model
(1b) Извлечение различных моделей возможно, но требует написанного вручную цикла решения, ср. stackoverflow.com/questions/13395391 - person Malte Schwerhoff   schedule 09.12.2016minisat
хорош для экспериментов, я говорил именно о таком некомандированном исследовательском проекте. Он тоже довольно старый. - person gigabytes   schedule 09.12.2016