Вот очень простой экземпляр cnf в виде (x1 или x2 или x3)&(x1 или x2)&(x2 или x3), и формула определенно выполнима, решение x1 = x2 = x3 = 1, этого достаточно. Итак, мой вопрос заключается в том, как решатель создает задание с использованием DPLL или другой процедуры? Спасибо.
Как решатель SAT создает модель (назначение [я])?
Ответы (1)
Ну, в принципе, для случая CDCL
(Решатели CDCL SAT реализуют DPLL, но могут изучать новые предложения и возвращаться не в хронологическом порядке. Изучение предложений с помощью анализа конфликтов не влияет на надежность или полноту. Анализ конфликтов идентифицирует новые предложения с помощью операции разрешения. Поэтому каждое изученное предложение может быть выведено из исходных предложений и других изученных предложений с помощью последовательности шагов решения.Если cN является новым изученным предложением, то ϕ выполнимо тогда и только тогда, когда ϕ ∪ {cN} также выполнимо.Более того, модифицированный шаг возврата также не влияет на надежность или полноту, поскольку информация о возврате получается из каждого нового выученного предложения. (Источник: Википедия)
это работает следующим образом:
Сначала выберите переменную ветвления x1. Желтый кружок означает произвольное решение.
Теперь примените единичное распространение, в результате чего x4 должно быть равно 1 (т. е. True). Серый кружок означает принудительное присвоение переменной во время распространения модуля. Полученный граф называется графом импликации.
Произвольно выберите другую переменную ветвления, x3.
Примените единичное распространение и найдите новый граф импликации.
Здесь переменные x8 и x12 принудительно равны 0 и 1 соответственно.
Выберите другую переменную ветвления, x2.
Найдите граф импликации.
Выберите другую переменную ветвления, x7.
Найдите граф импликации.
Нашел конфликт!
Найдите разрез, ведущий к этому конфликту. Из разреза найдите конфликтующее условие.
Возьмите отрицание этого условия и сделайте его предложением.
Добавьте условие конфликта к проблеме.
Нехронологический прыжок назад на соответствующий уровень принятия решения.
Прыжок назад и установка значений переменных соответственно.
(Ответ полностью из Википедия: Conflict-Driven_Clause_Learning#Example)
Вот список (точно не полный) решателей, которые используют алгоритм CDCL, вы должны их проверить:
- MiniSAT.
- Zchaff SAT.
- Z3.
- ManySAT.