Семинар 5.
1. Пусть у нас есть выражение в 2-CNF форме. Это значит, что выражение задано
в виде конъюнкции дизъюнкций, каждая из которых содержит ровно два литерала.
Задача SAT-2 состоит в нахождении такого набора значений булевых переменных,
что значение всего выражения становится истиной. Для начала, приведём задачу
к импликативной форме. Дизъюнкция (a ⋁ b) эквивалентна любой из импликаций:
(¬a ⇒ b) и (¬b ⇒ a).
2. Мы можем построить граф, соответствующий заданному выражению: вершинами графа
будут все переменные выражения, а так же их отрицания. Каждой импликации будет
соответствовать ребро. Таким образом, по выражению, содержащему n переменных и
состоящему из k 2-дизъюнкций, мы построим орграф, содержащий 2n вершин и 2k
рёбер. Граф этот будет кососимметричным: транспонированный граф изоморфен
исходному, причём при таком изоморфизме вершины перейдут в свои логические
дополнения. Другими словами, если есть ребро из a в b, то есть и ребро из
¬b в ¬a.
3. Предположим, что нам удалось назначить переменным такие значения, что они
удовлетворяют требованиям задачи SAT-2. Заметим тогда, что если в этом графе
есть путь из вершины a в вершину b, то из a следует b. Это означает, что
в любом пути нашего графа сначала идёт какое-то (возможно нулевое) число
значений "ложь", а оставшийся путь целиком состоит из значений "истина".
Отсюда следует, что в цикле все значения одинаковы. Другими словами, все
переменные лежащие в одной компоненте сильной связности принимают одно и
то же значение. Откуда сразу следует необходимое условие решаемости задачи
SAT-2: любая переменная должна лежать в компоненте отличной от той, в которой
лежит её отрицание. Оказывается, это условие является и достаточным.
4. Итак, ясно, что для успешного решения задачи, нужно назначать значения целиком
компонентам связности. Это даёт нам моральное право перейти от исходного графа
к его конденсации. Заметим, что конденсация также будет кососимметричной.
Так как конденсация не содержит циклов, то мы можем перебирать вершины в
топологическом порядке, каждой следующей вершине, которой ещё не присвоено
значение, мы присваиваем значение "ложь", а её дополнению — значение "истина".
(Или можно идти с конца и тогда присваивать новым вершинам значение "истина".)
Таким образом у нас ни на каком пути не будет перехода "истина ⇒ ложь".
Действительно, пусть у нас есть такой переход: a ⇒ b, это значит, что ¬a идёт
раньше a по топологическому порядку (так работает алгоритм), b идёт раньше ¬b,
a идёт раньше b (иначе не существовало бы ребра a ⇒ b), а ¬b идёт раньше ¬a
(существование ребра ¬b ⇒ ¬a следует из кососимметричности графа). Полученное
противоречие доказывает утверждение, а вместе с ним и то, что алгоритм строит
правильное решение задачи SAT-2.
5. Стоит заметить, что предложенный алгоритм, конечно, следует имплементировать
так, чтобы он работал за один проход. Для этого берётся тот же самый алгоритм
Тарьяна для нахождения компонент сильной связности, и в момент, когда из стека
вынимается очередная непомеченная компонента, входящим в её состав вершинам
приписывается значение "истина", а их дополнениям — "ложь".
<<