Применение булевых функций для решения практических задач

advertisement
Федеральное государственное автономное образовательное
учреждение высшего профессионального образования
«Казанский (Приволжский) федеральный университет»
ИНСТИТУТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ
И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА СИСТЕМНОГО АНАЛИЗА И ИНФОРМАЦИОННЫХ
ТЕХНОЛОГИЙ
Михайлов В.Ю., Васильев А.В.
ПРИМЕНЕНИЕ БУЛЕВЫХ ФУНКЦИЙ
ДЛЯ РЕШЕНИЯ ПРАКТИЧЕСКИХ ЗАДАЧ
КАЗАНЬ - 2015
УДК 51-74
Учебное пособие публикуется по решению
учебно-методической комиссии Института вычислительной
математики и информационных технологий КФУ
Протокол № 6 от 11 марта 2015 г.
заседания кафедры системного анализа
и информационных технологий
Протокол № 8 от 13 мая 2015 г.
Авторы-составители
к.ф.-м.н. Михайлов В.Ю.
к.ф.-м.н. Васильев А.В.
Рецензент
к.ф.-м.н. Пшеничный П.В.
Применение булевых функций для решения практических задач: Учебное
пособие / Михайлов В.Ю., Васильев А.В. – Казань: Казанский университет,
2015. – 103 с.
Учебное пособие предназначено для студентов, изучающих курс
«Дискретная математика», а также для преподавателей, ведущих лекционные
занятия по данному курсу.
© Казанский университет, 2015
СОДЕРЖАНИЕ
Введение ................................................................................................................... 6
Глава 1. Краткое изложение теории булевых функций .................................... 10
1.1. Геометрическое представление булевых функций ................................. 10
1.2. Табличное представление булевых функций ........................................... 11
1.3. Формульное представление булевых функций........................................ 13
1.3.1. Булевы формулы ................................................................................... 13
1.3.2. Канонические формы задания булевых формул ............................... 15
1.3.3. Функционально полные системы ........................................................ 18
1.3.4. Полиномы Жегалкина .......................................................................... 18
1.4. Семантические деревья для булевых функций ........................................ 19
1.5. Булевы функции и логика высказываний. ................................................ 20
Глава 2. Булевская формализация и решение логических задач ..................... 22
2.1. Принцесса или тигр .................................................................................... 22
2.2. Инспекция психиатрических лечебниц .................................................... 24
2.3. Трансильвания ............................................................................................. 25
Глава 3. ВМ-подход к решению прикладных задач ......................................... 29
3.1. Хорновские вычислительные модели ....................................................... 29
3.2. Алгоритмы поиска решений задач на хорновских вычислительных
моделях................................................................................................................ 31
3.2.1. Алгоритм прямой волны ...................................................................... 31
3.2.2. Алгоритм со счётчиками ...................................................................... 33
3.2.3. Логическая полнота алгоритма со счетчиками для хорновских
моделей ............................................................................................................ 34
3.2.4. Замечание о содержательной полноте и принципах построения
систем, реализующих ВМ-подход ................................................................ 35
3.2.5. Концептуальное программирование ................................................... 35
3.3. Решение головоломок на квазихорновских моделях ............................. 36
3.3.1. Задача Эйнштейна................................................................................. 37
3.3.2. Судоку .................................................................................................... 48
3.4. Хорновские вычислительные модели арифметических операций ........ 56
3.4.1. Сложение чисел в двоичной системе счисления ............................... 56
3.4.2. Умножение чисел в двоичной системе счисления ............................ 57
Глава 4. SAT-подход к решению комбинаторных задач................................... 59
4.1. Краткие сведения об алгоритме DPLL ..................................................... 59
4.2. Формализация комбинаторных задач на графах ..................................... 63
4.2.1. Раскраска графа ..................................................................................... 63
4.2.2. Гамильтонов цикл ................................................................................. 63
4.3. Формализация задачи целочисленной оптимизации .............................. 64
4.3.1. Задача целочисленного линейного программирования .................... 64
4.3.2. Сложение чисел в двоичной системе счисления ............................... 65
4.3.3. Формализация целочисленных линейных неравенств...................... 66
4.4. Формализация задачи обращения дискретных функций ........................ 68
4.4.1. Автоматные функции ........................................................................... 68
4.4.2. Функции, вычислимые на машинах Тьюринга за время Т ............... 70
4.4.3. Логический криптоанализ .................................................................... 74
4.5. Определение класса комбинаторных (переборных) задач .................... 81
4.5.1. Недетерминированная машина Тьюринга ......................................... 81
4.5.2. Класс NP комбинаторных (переборных) задач .................................. 82
4.5.3. Булевская формализация ограниченной проблемы останова для
недетерминированной машины Тьюринга. NP-полнота задачи SAT. ...... 83
Глава 5. BDD – подход к решению практических задач ................................... 85
5.1. BDD-представление булевых функций .................................................... 85
5.1.1. Бинарные диаграммы решений ........................................................... 85
5.2. Основные операции над BDD-представлениями..................................... 87
5.2.2. Синтез BDD ........................................................................................... 87
5.3. Проблема верификации моделей программ и систем ............................. 88
5.3.1. Проблема "фермер, волк, коза и капуста" .......................................... 88
5.3.2. Модели дискретно-автоматных динамических систем .................... 91
5.3.3. Язык CTL ............................................................................................... 92
5.3.4. Верификация динамических систем методом Model Checking ....... 95
5.3.5. Предпосылки для символьной верификации ..................................... 98
5.3.6. Символьный алгоритм верификации .................................................. 98
5.4. BDD-подход к решению некоторых задач биоинформатики ............... 100
Введение
Курсы по тематике булевых функций читаются в российских университетах
уже почти 130 лет. Так, еще весной 1887 г. приват-доцент Казанского
Императорского университета Платон Сергеевич Порецкий объявил о
намерении читать математическую логику для студентов всех курсов
математического разряда Казанского университета. Этот предмет
объявлялся им в течение трех семестров, но в реальности он читал его один
семестр – осенью и зимой 1888 года по три часа по понедельникам. Это был
первый опыт чтения лекций по математической логике в России. Подробная
программа, составленная Порецким, включала в основном проблемы
операций с
логическими классами, булевыми функциями, теорию
логических равенств, вопросы приложения математической логики к
вычислению вероятностей. П.С. Порецкий советовал студентам пользоваться
трудами Дж. Буля, С. Джевонса, Э. Шредера, а также рекомендовал свою
работу «О способах решения логических равенств и обратном способе
математической логики», изданную в Казани в 1884 году. "Что нового
вносит математическая логика в логику умозрительную?" – задает вопрос
П.С. Порецкий. И отвечает: "Прежде всего, конечно… новый метод,
неизмеримо более совершенный, чем простое умозрение".
Первоначально булевы функции рассматривались как логические
формулы, были эффективным средством описания, а иногда и решения
различных логических задач и до середины двадцатого века представляли, в
основном, теоретический интерес. В 1938 г. К. Шеннон показал, каким
образом релейные схемы могут быть описаны с помощью булевых функций.
Булева алгебра стала математическим аппаратом для исследования релейноконтактных схем, а сами схемы к середине двадцатого века нашли
многочисленные применения в автоматической технике — в телефонии,
железнодорожной сигнализации, централизации и блокировке, релейной
защите, телемеханике, при проектировании быстродействующих ЭВМ. Затем
математические модели, описываемые на языке булевых функций, нашли
широкое применение в самых различных областях человеческой
деятельности. Помимо того, что булевы функции стали признанной моделью
для проектирования схем, применяемых в электронике, во второй половине
двадцатого века был открыт еще ряд важных применений теории булевых
функций в таких областях, как распознавание образов, теория кодирования и
криптография.
Мощное воздействие на развитие дискретной математики оказала
статья С.А. Кука 1975 года, где была показана центральная роль проблемы
определения выполнимости булевых формул, получившей название SAT–
проблемы, для решения широкого круга так называемых комбинаторных
задач, или NP-задач, среди которых оказалось много практически важных –
целочисленная оптимизация, задача коммивояжера, задача трассировки плат,
криптоанализ и др. Подход, основанный на сведении решения
комбинаторных задач к SAT-проблеме, получил название SAT–подхода. В
настоящее время в связи с развитием вычислительной техники и развитием
технологии параллельных вычислений этот подход позволяет решать
комбинаторные проблемы, размерность которых соответствует требованиям
практических приложений, в таких важных областях, как верификация и
синтез программ и систем в микроэлектронике, дискретная оптимизация,
задачи обращения дискретных функций, биоинформатика. Важными
элементами эффективного использования SAT-подхода являются, во-первых,
технологии построения булевых формул, описывающих комбинаторные
проблемы, и, во-вторых, эвристики организации и распараллеливания поиска
решения задачи выполнимости системы булевых формул.
В 1986 г. Рэнделл Брайант предложил новую очень эффективную
форму представления булевых функций, которая называется Binary Decision
Diagrams (BDD). BDD – это представление булевой функции в виде
направленного графа – решающей диаграммы, в которой нет избыточностей,
характерных для таблиц истинности и семантических деревьев. Для булевых
функций, представленных в виде BDD, многие задачи, включая SATпроблему и эквивалентность, решаются очень эффективно. При этом
оказалось, что многие практически важные булевы функции имеют
достаточно компактные BDD-представления. Подход к решению
комбинаторных проблем, основанный на представлении булевых формул в
виде BDD, получил название BDD-подхода. Особенно эффективным BDDподход оказался при реализации символьных алгоритмов верификации
программ и систем (технология model checking). Важными элементами
эффективного использования BDD-подхода являются, во-первых, технологии
построения компактных BDD-представлений булевых формул, и, во-вторых,
эффективные алгоритмы реализации различных операций над булевыми
функциями, представленными в виде BDD.
В середине 1980-х годов Тыугу Э.Х. предложил концепцию построения
так называемых вычислительных моделей прикладных областей в виде
набора содержательных отношений вычислимости, которые могут быть
описаны множеством хорновских формул (это булевы формулы
специального вида). Содержательным задачам в моделируемой предметной
области соответствует задача определения выполнимости набора хорновских
формул, которая имеет очень эффективный алгоритм решения. Кроме того,
Тыугу Э.Х. развил идею концептуального программирования, под которым
понимаются методы построения вычислительных моделей сложных объектов
и процессов через вычислительные модели более простых моделей и
процессов. Данный подход, который мы назовем ВМ-подходом, оказался
эффективным для построения программных систем, предназначенных для
решения практических расчетных инженерных задач во многих областях.
В настоящем пособии мы опишем применение теории булевых
функций при решении практических задач с использованием ВМ-подхода
(раздел 3), SAT-подхода (раздел 4) и BDD-подхода (раздел 5). В разделе 2,
отдавая дань исторической традиции, мы опишем применение теории
булевых функций при решении логических задач.
В настоящее время теория булевых функций как раздел учебной
дисциплины присутствует в дисциплинах «Математическая логика»,
«Дискретная математика», «Дискретная математика, математическая логика
и их приложения в информатике и компьютерных науках», которые
относятся к дисциплинам профессионального цикла. Эти дисциплины
изучаются на младших курсах университета и должны служить базой для
дальнейшего профессионального развития студента. Но, к сожалению, мы
наблюдаем такое явление: студенты младших курсов не знают о
существовании важных практических задач, при решении которых теория
булевых функций является основным аппаратом, и поэтому относятся к ней,
как чисто теоретической, «меловой» науке, а студенты старших курсов к
моменту изучения профессиональных дисциплин теорию булевых функций
успевают основательно забыть. Настоящее пособие по замыслу авторов
предназначено главным образом для студентов младших курсов, изучающих
дискретную математику и/или математическую логику, и призвано вызвать у
них отношение к теории булевых функций как к исключительно важной с
прикладной точки зрения науке.
Литература к введению.
1. В. А. Бажанов. Жизнь и научная деятельность пионера исследований в
области математической логики в России П. С. Порецкого // Вопросы
истории естествознания и техники. — 2005. — № 4. — С. 64-73.
2. Порецкий П.С. О способах решения логических равенств и об
обратном способе математической логики // Собрание протоколов
заседаний
секции
физико-математических
наук
общества
естествоиспытателей при Казанском университете. Казань, 1884/ Т. 2. –
XXIV, 170 С. (отдельный оттиск).
3. Кук С.А. Сложность процедур вывода теорем // Кибернетический сборник.
1975. Новая серия. Вып.12. С.5-15.
4. Bryant R.E. Graph-based algorithms for boolean function manipulation // IEEE
Transactions on Computers, 1986. Vol. 35(8). P. 677-691.
5. Тыугу Э.Х. Концептуальное программирование. «Наука». - Москва. -1984.
- 256 с.
Глава 1. Краткое изложение теории булевых функций
Булевы функции названы в честь английского математика ХIХ века Дж.
Буля, который впервые применил алгебраические методы для решения
логических задач. Они образуют самый простой нетривиальный класс
дискретных функций – их аргументы и значения могут принимать всего два
значения (если мощность множества значений функции равна 1, то это
тривиальная функция – константа). С другой стороны, этот класс достаточно
богат, и его функции имеют много интересных свойств. Булевы функции
находят применение в логике, электротехнике, многих разделах
информатики.
Обозначим через 𝐵 двухэлементное множество {0,1}. Тогда 𝐵𝑛 – это
множество всех двоичных последовательностей (наборов, векторов) длины 𝑛.
Определение. Булевой функцией от n переменных (аргументов) называется
любая функция 𝑓(𝑥1 , … , 𝑥𝑛 ): 𝐵𝑛 → 𝐵.
Каждый из ее аргументов 𝑥𝑖 , 1 ≤ 𝑖 ≤ 𝑛, может принимать одно из двух
значений 0 или 1, и значением функции на любом наборе из 𝐵𝑛 также может
быть 0 или 1. Обозначим через 𝑃2𝑛 множество всех булевых функций от n
переменных, а также будем использовать обозначение 𝑃2 для ⋃𝑛≥0 𝑃2𝑛 , т.е.
множества всех булевых функций.
Имеется
несколько
различных
способов
представления
и
интерпретации булевых функций. В этом разделе мы рассмотрим
геометрическое и табличное представления, а также представление с
помощью логических формул.
1.1. Геометрическое представление булевых функций
𝐵𝑛 можно рассматривать как единичный -мерный куб. Каждый набор из
нулей и единиц длины 𝑛 задает вершину этого куба. Ниже представлены
единичные кубы 𝐵𝑛 при 𝑛 = 2,3,4.
При этом существует естественное взаимно-однозначное соответствие
между подмножествами вершин -мерных единичных кубов и булевыми
функциями от 𝑛 переменных: подмножеству 𝑁 ⊆ 𝐵𝑛 соответствует его
характеристическая функция
1, если (𝑥1 , … , 𝑥𝑛 ) ∈ 𝑁
𝑓𝑁 (𝑥1 , … , 𝑥𝑛 ) = {
0, в противном случае.
Например, верхней грани куба 𝐵3 (ее вершины выделены на рисунке)
соответствует функция 𝑓: 𝑓(0,0,1) = 𝑓(0,1,1) = 𝑓(1,0,1) = 𝑓(1,1,1) = 1 и
𝑓(0,0,0) = 𝑓(0,1,0) = 𝑓(1,0,0) = 𝑓(1,1,0) = 0.
Очевидно,
что
указанное
соответствие
действительно
взаимнооднозначное: каждая булева функция 𝑓 от 𝑛 переменных задает
подмножество 𝑁𝑓 = {(𝑎1 , … , 𝑎𝑛 )| 𝑓(𝑎1 , … , 𝑎𝑛 ) = 1} вершин 𝐵𝑛 . Например,
функция, тождественно равная 0, задает пустое множество, а функция,
тождественно равная 1, задает множество всех вершин 𝐵𝑛 .
1.2. Табличное представление булевых функций
Булевы функции от небольшого числа аргументов удобно представлять с
помощью таблиц. Таблица для функции 𝑓(𝑥1 , … , 𝑥𝑛 ) имеет 𝑛 + 1 столбец. В
первых 𝑛 столбцах указываются значения аргументов 𝑥1 , … , 𝑥𝑛 , а в (𝑛 + 1)ом столбце значение функции на этих аргументах – 𝑓(𝑥1 , … , 𝑥𝑛 ).
𝑥1 𝑥2 … 𝑥𝑛 𝑓(𝑥1 , 𝑥2 , … , 𝑥𝑛 )
0 0 …0
𝑓(0, 0, … , 0)
0 0 …1
𝑓(0, 0, … , 1)
⋮ ⋮ ⋮ ⋮
⋮
1 1 …1
𝑓(1, 1, … , 1)
Если наборы рассматривать как записи чисел в двоичной системе
счисления, то 1-ая строка представляет число 0, 2-ая – 1, 3-ая – 2, а последняя
– (2𝑛 − 1). Наборы аргументов в строках обычно располагаются в
лексикографическом порядке (по возрастанию соответствующих двоичных
чисел).
При больших 𝑛 табличное представление становится громоздким,
например, для функции от 10 переменных потребуется таблица с 1024
строками. Но для малых 𝑛 оно достаточно наглядно.
Используя табличное представление, нетрудно подсчитать число
булевых функций от 𝑛 переменных и доказать справедливость следующего
утверждения.
𝑛
Утверждение. |𝑃2𝑛 | = 22 .
Рассмотрим примеры элементарных булевых функций. Для 𝑛 = 1:
𝑥 0 1 𝑥 ¬𝑥
0 0 1 0 1
1 0 1 1 0
Функция 0 называется константой ноль, 1 – константой единица, функция x тождественной, а функция ¬𝑥 – отрицанием 𝑥.
Для 𝑛 = 2:
𝑥𝑦 x&y 𝑥∨𝑦 𝑥 →𝑦 𝑥 ≡ 𝑦 𝑥⊕𝑦 𝑥 ∣ 𝑦 𝑥 ↓𝑦
0
0
1
1
0
1
1
00
0
1
1
0
1
1
0
01
0
1
0
0
1
1
0
10
1
1
1
1
0
0
0
11
Приведем принятые названия указанных функций:
 𝑥 & 𝑦 = 𝑥 ∧ 𝑦 = 𝑥 ⋅ 𝑦 = 𝑥 𝑦 – конъюнкция, логическое умножение,
логическое "и";
 𝑥 ∨ 𝑦 – дизъюнкция, логическое сложение, логическое "или";
 𝑥 → 𝑦 – импликация, логическое следование;
 (𝑥 ≡ 𝑦) = 𝑥 ∼ 𝑦 – эквивалентность;
 𝑥 ⊕ 𝑦 – сложение по модулю 2, неэквивалентность, исключающее
"или";
 𝑥 ∣ 𝑦 – штрих Шеффера, отрицание конъюнкции;
 𝑥 ↓ 𝑦 – стрелка Пирса, отрицание дизъюнкции.
Для n=3 рассмотрим функцию голосования m(x, y, z), значение которой
равно значению большинства аргументов. Эта функция задается следующей
таблицей:
𝑥 𝑦 𝑧 𝑚(𝑥, 𝑦, 𝑧)
0
000
0
001
0
010
1
011
0
100
1
101
1
110
1
111
Существенные и фиктивные переменные.
В обычной алгебре справедливо равенство x + y - y = x, несмотря на то,
что в левой части записана функция от двух переменных, а в правой – от
одной. Таким образом, функции от разного числа переменных могут быть
равными, что дает повод ввести понятие существенных и фиктивных
переменных.
Определение. Переменная 𝑥𝑖 называется существенной переменной
функции 𝑓(𝑥1 , … , 𝑥𝑛 ), если существуют такие 𝑎1 , … , 𝑎𝑖−1 , 𝑎𝑖+1 , … , 𝑎𝑛 ∈ 𝐵,
что 𝑓(𝑎1 , … , 𝑎𝑖−1 , 0, 𝑎𝑖+1 , … , 𝑎𝑛 ) ≠ 𝑓(𝑎1 , … , 𝑎𝑖−1 , 1, 𝑎𝑖+1 , … , 𝑎𝑛 ). В противном
случае переменная 𝑥𝑖 называется фиктивной.
Если 𝑥𝑖 – фиктивная переменная функции 𝑓, то функция 𝑓 однозначно
определяется некоторой функцией 𝑔(𝑥1 , … , 𝑥𝑖−1 , 𝑥𝑖+1 , … , 𝑥𝑛 ), при этом
𝑔(𝑎1 , … , 𝑎𝑖−1 , 𝑎𝑖+1 , … , 𝑎𝑛 ) = 𝑓(𝑎1 , … , 𝑎𝑖−1 , 0, 𝑎𝑖+1 , … , 𝑎𝑛 ) =
𝑓(𝑎1 , … , 𝑎𝑖−1 , 1, 𝑎𝑖+1 , … , 𝑎𝑛 )
для
любого
набора
значений
𝑎1 , … , 𝑎𝑖−1 , 𝑎𝑖+1 , … , 𝑎𝑛 ∈ 𝐵. Говорят, что 𝑔 получается из 𝑓 удалением
фиктивной переменной 𝑥𝑖 .
Кроме того, любую функцию можно дополнить произвольным числом
фиктивных переменных. При этом ее таблица дополняется соответствующим
числом новых строк и столбцов.
Определение. Две булевы функции называются равными, если одну из них
можно получить из другой путем добавления или удаления некоторого числа
фиктивных переменных.
1.3. Формульное представление булевых функций
К настоящему времени мы знакомы лишь с табличным представлением
булевых функций. Однако этот способ пригоден только для формул с
небольшим числом переменных. Уже для нескольких десятков и сотен
переменных он не годится из-за большого размера получающейся таблицы –
известно, что число 290 превосходит количество атомов во всей видимой
вселенной.
Рассмотрим формульное представление булевых функций.
1.3.1. Булевы формулы
Пусть задано некоторое множество булевых функций 𝐴 = {𝑓1 , 𝑓2 , … }.
Определим формулу над A следующим образом.
Определение. По индукции:
1) Любая функция из A является формулой над A.
2) Если 𝑓 ∈ 𝐴 и для любого 1 ≤ 𝑖 ≤ 𝑛 𝐻𝑖 – либо переменная, либо формула
над A, то выражение 𝑓(𝐻1 , 𝐻2 , … , 𝐻𝑛 ) также является формулой над
A.
3) Других формул нет.
Примеры. ((𝑥1 & 𝑥2 ) ∨ (𝑥1 → 𝑥3 )) является формулой, а (𝑥 & ∨ 𝑦) – нет.
Обычно принимаются следующие соглашения для сокращения записи
формул над множеством {¬, &, ∨, →, ⊕, ∼, ∣, ↓}:
 внешние скобки у формул можно опускать;
 ассоциативные скобки для &, ∨ и ⊕ можно опускать;
 формулу (𝐻1 & 𝐻2 ) можно записать в виде (𝐻1 ⋅ 𝐻2 ) или (𝐻1 𝐻2 );
 приоритет у связки ¬ выше, чем у любой двухместной связки;
 связка & имеет более высокий приоритет по сравнению с ∨, ⊕, ∼ и →.
Благодаря этому формулу (((x ⊕ (¬y)) ⊕ z) → ((x & y) ∨ z))) можно
записать в виде (x ⊕ ¬y ⊕ z) → (xy ∨ z).
По аналогии с определением формулы вводится понятие функции,
реализуемой формулой над A.
Определение. По индукции:
1) Если формула 𝐻 = 𝑓(𝑥1 , … , 𝑥𝑛 ) для некоторой функции 𝑓 ∈ 𝐴, то она
реализует функцию f.
2) Пусть 𝐻 = 𝑓(𝐻1 , … , 𝐻𝑛 ), 𝑓 ∈ 𝐴 и для любого 1 ≤ 𝑖 ≤ 𝑛 𝐻𝑖 – либо
переменная, либо формула над 𝐴. Тогда формула 𝐻 реализует
функцию 𝑓(𝑔1 , 𝑔2 , … , 𝑔𝑛 ), где 𝑔𝑖 – либо переменная, либо функция,
реализуемая формулой 𝐻𝑖 .
Определение. Две формулы 𝐻𝑓 и 𝐻𝑔 называются эквивалентными, если
реализуемые ими функции 𝑓 и 𝑔 равны, т.е. 𝐻𝑓 = 𝐻𝑔 , если 𝑓 = 𝑔.
Замечание. Для отношения эквивалентности формул мы не вводим
специальный знак, а используем тот же, что и для равенства функций.
Основные эквивалентности.
1) Коммутативность:
𝑥∘𝑦 = 𝑦∘𝑥
для ∘ ∈ {&, ∨, ⊕, ∼, ∣, ↓}
2) Ассоциативность:
(𝑥 ∘ 𝑦) ∘ 𝑧 = x ∘ (y ∘ z)
для ∘ ∈ {&, ∨, ⊕, ∼}
3) Дистрибутивность:
(𝑥 ∨ 𝑦)𝑧 = 𝑥𝑧 ∨ 𝑦𝑧
(𝑥 𝑦) ∨ 𝑧 = (𝑥 ∨ 𝑧)(𝑦 ∨ 𝑧)
(𝑥 ⊕ 𝑦)𝑧 = 𝑥𝑧 ⊕ 𝑦𝑧
4) Законы поглощения:
𝑥∨ 𝑥⋅𝑦 = 𝑥
𝑥 ⋅ (𝑥 ∨ 𝑦) = 𝑥
5) Закон обобщенного склеивания:
7) 𝑥 ∨ 𝑥 = 𝑥
𝑥⋅𝑥 = 𝑥
𝑥⊕𝑥 =0
𝑥 ∨ ¬𝑥 = 1
𝑥 ⋅ ¬𝑥 = 0
𝑥 ⊕ ¬𝑥 = 1
𝑥∨1= 1
𝑥⋅1= 𝑥
𝑥 ⊕ 1 = ¬𝑥
𝑥∨0= 𝑥
𝑥⋅0= 0
𝑥⊕0=𝑥
8) ¬¬𝑥 = 𝑥
𝑥 ∣ 𝑦 = ¬(𝑥 ⋅ 𝑦)
𝑥𝑦 ∨ ¬𝑥𝑧 = 𝑥𝑦 ∨ ¬𝑥𝑧 ∨ 𝑦𝑧
6) Законы де Моргана:
¬(𝑥 ∨ 𝑦) = ¬𝑥 ⋅ ¬𝑦
¬(𝑥 ⋅ 𝑦) = ¬𝑥 ∨ ¬𝑦
𝑥 ↓ 𝑦 = ¬(𝑥 ∨ 𝑦)
𝑥 → 𝑦 = ¬𝑥 ∨ 𝑦
𝑥 ∼ 𝑦 = (𝑥 → 𝑦)(𝑦 → 𝑥) = 𝑥𝑦 ∨ ¬𝑥 ⋅ ¬𝑦
𝑥 ⊕ 𝑦 = ¬(𝑥 ∼ 𝑦) = 𝑥 ⋅ ¬𝑦 ∨ ¬𝑥 ⋅ 𝑦
1.3.2. Канонические формы задания булевых формул
Разложение булевой функции
Введем в рассмотрение следующую функцию 𝑥 в степени 𝜎.
𝑥, 𝜎 = 1
𝑥𝜎 = {
¬𝑥, 𝜎 = 0
𝜎
или, что то же самое, 𝑥 = 𝑥 ⋅ 𝜎 ∨ ¬𝑥 ⋅ ¬𝜎.
Очевидно, что 𝑥 𝜎 = 1 тогда и только тогда, когда 𝑥 = 𝜎.
Утверждение. Для любой булевой функции 𝑓(𝑥1 , … , 𝑥𝑛 ) и любого целого
𝑘 (1 ≤ 𝑘 ≤ 𝑛) справедливо следующее равенство:
𝑓(𝑥1 , … , 𝑥𝑛 ) =
¬𝜎1
⋀
(𝑥1
¬𝜎2
∨ 𝑥2
¬𝜎𝑘
∨ … ∨ 𝑥𝑘
∨ 𝑓(𝜎1 , … , 𝜎𝑘 , 𝑥𝑘+1 , … , 𝑥𝑛 ))
(𝜎1 ,…,𝜎𝑘 )∈𝐵𝑘
Это равенство называется разложением булевой функции по (первым)
𝑘 переменным.
Следствие. Разложение произвольной булевой функции по одной (первой)
переменной имеет вид:
𝑓(𝑥1 , … , 𝑥𝑛 ) = (𝑥1 ∨ 𝑓(0, 𝑥2 , … , 𝑥𝑛 ))(¬𝑥1 ∨ 𝑓(1, 𝑥2 , … , 𝑥𝑛 )) .
Следствие. Для любой булевой функции, отличной от константы единица,
справедливо следующее представление:
⋀
¬𝜎1
(𝑥1
¬𝜎2
∨ 𝑥2
¬𝜎𝑛
∨ … ∨ 𝑥𝑛
) .
(𝜎1 ,…,𝜎𝑛 )|𝑓(𝜎1 ,…,𝜎𝑛 )=0
Такое представление булевой функции называется ее совершенной
конъюнктивной нормальной формой (СКНФ). Оно позволяет по таблице
построить формулу, реализующую данную функцию.
Пример.
𝑥𝑦 𝑥→𝑦
1
00
1
01
0
10
1
11
¬1
¬0
𝑥 → 𝑦 = 𝑥 ∨ 𝑦 = 𝑥 0 ∨ 𝑦1 = ¬𝑥 ∨ 𝑦
Утверждение. Для любой булевой функции, отличной от константы ноль,
справедливо следующее представление:
𝜎
𝜎
𝜎
(𝑥1 1 ⋅ 𝑥2 2 ⋅ … ⋅ 𝑥𝑛𝑛 ) .
⋁
(𝜎1 ,…,𝜎𝑛 )|𝑓(𝜎1 ,…,𝜎𝑛 )=1
Такое представление булевой функции является двойственным к
СКНФ и называется совершенной дизъюнктивной нормальной формой
(СДНФ) функции.
𝑥𝑦 𝑥→𝑦
1
00
1
01
0
10
1
11
0
0
0
1
1
𝑥 → 𝑦 = 𝑥 ⋅ 𝑦 ∨ 𝑥 ⋅ 𝑦 ∨ 𝑥 ⋅ 𝑦1 = ¬𝑥¬𝑦 ∨ ¬𝑥𝑦 ∨ 𝑥𝑦
Заметим, что СКНФ является частным случаем представления булевой
функции в конъюнктивной нормальной формы (КНФ), которая играет
особую роль при решении практических задач при помощи SAT-подхода.
Определим формально данный вид формул.
Определение. Элементарной дизъюнкцией 𝐷 над множеством переменных
𝑋𝑛 = {𝑥1 , … , 𝑥𝑛 } назовем формулу вида
𝜎𝑖1
𝐷 = (𝑥𝑖
1
𝜎𝑖2
∨ 𝑥𝑖
2
𝜎
∨ … ∨ 𝑥𝑖 𝑖𝑟 ),
𝑟
т.е. дизъюнкцию различных переменных или их отрицаний.
Число переменных 𝑟, входящих в элементарную дизъюнкцию,
называется рангом элементарной дизъюнкции.
Определение. Конъюнктивной нормальной формой (КНФ) над множеством
переменных 𝑋𝑛 назовем конъюнкцию различных элементарных дизъюнкций
над 𝑋𝑛 :
𝐷1 & 𝐷2 & … &𝐷𝑚 .
Число элементарных конъюнкций 𝑚, входящих в КНФ, называется
длиной КНФ.
Замечание. Рассмотренная ранее СКНФ является частным случаем КНФ,
когда все элементарные дизъюнкции имеют ранг 𝑛 (число переменных).
Замечание. Для одной и той же булевой функции может существовать
несколько КНФ.
Ввиду важности КНФ, рассмотрим методы ее построения для
произвольной булевой функции. В случае, когда булева функция 𝑓 задана
таблицей (вектором значений), можно применить описанный выше подход
для построения совершенной КНФ. Поэтому далее будем считать, что 𝑓
задана в виде формулы 𝐹 над множеством {¬, &, ∨, →, ⊕, ∼, ∣, ↓}.
1. Стандартный метод, использующий основные эквивалентности.
Для того чтобы построить по заданной формуле 𝐹 эквивалентную ей
КНФ необходимо:
1. Выразить все булевы связки через дизъюнкцию, конъюнкцию и
отрицание;
2. Применять, пока возможно, законы де Моргана для того, чтобы
отрицания стояли лишь над элементарными переменными;
3. Применять, пока возможно, закон дистрибутивности дизъюнкции
относительно конъюнкции 𝑥 ∨ (𝑦&𝑧) = (𝑥 ∨ 𝑦)&(𝑥 ∨ 𝑦) для того,
чтобы ни одна конъюнкция не находилась в области действия
дизъюнкции;
4. Применять (на каждом этапе) упрощающие эквивалентности.
Замечание. Этот метод может оказаться не очень эффективным, т.к. при
применении законов дистрибутивности размер формулы может удваиваться
и строящаяся нормальная форма может оказаться очень длинной. Чтобы
убедиться в этом, достаточно взять в качестве исходной формулы формулу,
находящуюся в дизъюнктивной нормальной форме. Другим примером
булевых формул, имеющим длинные КНФ, являются формулы вида 𝑥1 ⊕
𝑥2 ⊕ … ⊕ 𝑥𝑛 .
2. Метод дедуктивно эквивалентных преобразований формул.
Определение.
Булевы формулы 𝐹 и 𝐺 называются дедуктивно
эквивалентными, если формула 𝐹 выполнима тогда и только тогда, когда
выполнима формула 𝐺.
Обозначение: 𝐹 ↔ 𝐺.
Используемое упрощающее дедуктивно эквивалентное преобразование
формул: 𝐹(𝐴) ↔ (𝑋  𝐴) & 𝐹(𝑋), где 𝑋 – новая булева переменная, а 𝐴 –
подформула формулы 𝐹, содержащая только одну логическую связку.
Рассмотрим все возможные случаи.
1) 𝐴 = 𝑌&𝑍. Тогда преобразование будет выглядеть так
𝐹(𝐴) ↔ (¬𝑋 ∨ 𝑌) & (¬𝑋 ∨ 𝑍) & (𝑋 ∨ ¬𝑌 ∨ ¬𝑍) & 𝐹(𝑋) .
2) 𝐴 = 𝑌 ∨ 𝑍. Тогда преобразование будет выглядеть так
𝐹(𝐴) ↔ (¬𝑋 ∨ 𝑌 ∨ 𝑍) & (𝑋 ∨ ¬𝑌) & (𝑋 ∨ ¬𝑍) & 𝐹(𝑋) .
3) 𝐴 = 𝑌 → 𝑍. Тогда преобразование будет выглядеть так
𝐹(𝐴) ↔ (¬𝑋 ∨ ¬𝑌 ∨ 𝑍) & (𝑋 ∨ 𝑌) & (𝑋 ∨ ¬𝑍) & 𝐹(𝑋) .
4) 𝐴 = 𝑌 ⊕ 𝑍. Тогда преобразование будет выглядеть так
𝐹(𝐴) ↔ (¬𝑋 ∨ 𝑌 ∨ 𝑍)&(¬𝑋 ∨ ¬𝑌 ∨ ¬𝑍)&(𝑋 ∨ 𝑌 ∨ ¬𝑍)&(𝑋 ∨ ¬𝑌 ∨ 𝑍)&𝐹(𝑋) .
5) 𝐴 = ¬𝑌. Тогда преобразование будет выглядеть так
𝐹(𝐴) ↔ (¬𝑋 ∨ ¬𝑌)&(𝑋 ∨ 𝑌)&𝐹(𝑋) .
Утверждение. Для любой булевой формулы 𝐹 можно построить дедуктивно
эквивалентную КНФ 𝐺, причем размер 𝐺 будет линейно зависеть от
размера 𝐹.
1.3.3. Функционально полные системы
Определение. Множество булевых функций 𝐴 = {𝑓1 , 𝑓2 , … } называется
функционально полной системой (в 𝑃2 ), если любую функцию из 𝑃2 можно
представить в виде формулы над 𝐴.
Утверждение. Система 𝐴 = {∧, ∨, ¬} является полной.
Следующее утверждение показывает, как можно свести доказательство
полноты произвольной системы булевых функций к некоторой системе,
полнота которой уже доказана.
Утверждение. Если система 𝐴 = {𝑓1 , 𝑓2 , … } полна, и любая функция из 𝐴
может быть представлена в виде формулы над некоторой системой 𝐵 =
{𝑔1 , 𝑔2 , … }, то система 𝐵 также полна.
Примеры полных систем.
1. 𝐴 = 𝑃2
2. 𝐴 = {&, ∨, ¬}
3. 𝐴 = {&, ¬}
4. 𝐴 = {∨, ¬}
5. 𝐴 = {&, ⊕, 1}
6. 𝐴 = {→, 0}
7. 𝐴 = {∣}
8. 𝐴 = {↓}
1.3.4. Полиномы Жегалкина
Полином Жегалкина — многочлен над кольцом ℤ2 , то есть полином с
коэффициентами вида 0 и 1, где в качестве произведения берется
конъюнкция, а в качестве сложения — исключающее или. Полином был
предложен в 1927 году Иваном Жегалкиным в качестве удобного средства
для представления булевых функций. В зарубежной литературе
представление в виде полинома Жегалкина обычно называется
алгебраической нормальной формой (АНФ).
Введем формальное определение полинома Жегалкина.
Определение. Монотонной конъюнкцией над множеством переменных 𝑋𝑛 =
{𝑥1 , … , 𝑥𝑛 } называется любое выражение вида 𝑥𝑖1 ⋅ 𝑥𝑖2 ⋅ … ⋅ 𝑥𝑖𝑟 где 1 ≤ 𝑟 ≤ 𝑛,
1 ≤ 𝑖𝑗 ≤ 𝑛 для любого 𝑗 ∈ {1, … , 𝑛}, и все переменные различны, т.е. 𝑖𝑗 =
𝑖𝑘 ⟺ 𝑗 = 𝑘.
Определение. Полиномом Жегалкина над множеством переменных 𝑋𝑛 =
{𝑥1 , … , 𝑥𝑛 } называется выражение вида
𝐾1 ⊕ 𝐾2 ⊕ … ⊕ 𝐾𝑙 ⊕ 𝜎,
где 𝑙 ≥ 0, а все 𝐾𝑗 – это различные монотонные конъюнкции над
множеством переменных 𝑋𝑛 .
Другими словами, полиномом Жегалкина – это сумма конъюнкций
различных переменных и, возможно, константа.
Утверждение. Любая булева функция 𝑓(𝑥1 , … , 𝑥𝑛 ) может быть
единственным образом представлена в виде полинома Жегалкина над
множеством переменных 𝑋𝑛 = {𝑥1 , … , 𝑥𝑛 }.
1.4. Семантические деревья для булевых функций
Семантическое дерево – это двоичное дерево, корень которого помечен
булевой функцией от 𝑛 переменных, из каждого узла идут по два ребра: одно
соответствует нулевому значению соответствующей переменной (будем его
изображать штриховой линией), а другое – единичному значению этой
переменной (оно изображается сплошной линией). Таким образом, с каждой
ветвью от корня до листа сопоставляется набор значений переменных, а
листья помечаются соответствующими значениями функции.
Семантическое дерево соответствует вычислению булевой функции
путем разбора случаев и в общем случае размер такого представления даже
превосходит размер таблицы для той же функции.
Пример. Семантическое дерево для функции голосования, заданной
формулой 𝑚(𝑥, 𝑦, 𝑧) = 𝑥𝑦 ∨ 𝑥𝑧 ∨ 𝑦𝑧:
x
y
y
z
0
z
0
0
z
z
1
0
1
1
1
Отметим, что, как правило, используются некоторые приемы,
позволяющие сократить размер семантического дерева путем устранения
избыточностей, таких как одинаковые поддеревья или фиктивные вершины,
из которых оба ребра приводят в одну и ту же вершину. Описанные приемы
еще больше сближают рассматриваемое представление с бинарными
диаграммами решений. Более того, последние в редуцированном виде
являются семантическими деревьями без избыточностей.
1.5. Булевы функции и логика высказываний.
Как уже отмечалось, Дж. Буль ввел булевы функции для решения
логических задач. В логике под высказыванием понимают некоторое
повествовательное предложение, относительно которого можно сказать,
истинно оно или ложно. Логика высказываний занимается выяснением
истинности тех или иных высказываний, связью между истинностью
различных высказываний и т.п.
Булевы функции могут служить полезным инструментом при решении
многих логических задач.
Каждую переменную можно рассматривать как некоторое
элементарное высказывание, принимающее одно из двух значений: 1
(истина) или 0 (ложь). Сложным высказываниям соответствуют формулы,
построенные из элементарных высказываний с помощью логических связок.
Вычисляя значения задаваемых ими функций, можно устанавливать
зависимости истинностных значений сложных высказываний от значений
входящих в них элементарных высказываний.
Важную роль в логике играют понятия тождественно истинной и
выполнимой формулы.
Определение. Булева формула H называется тождественно истинной
(тождественно ложной), если она истинна (ложна) при любых значениях
входящих в нее переменных, т.е. функция fH тождественно равна 1
(тождественно равна 0).
Определение. Булева формула H называется выполнимой, если существует
такой набор значений переменных, на котором она истинна, т.е. функция f H
равна 1 хотя бы на одном наборе аргументов.
Как проверить тождественную истинность или выполнимость формулы
H. На первый взгляд, кажется, что ответ прост – построим по H таблицу для
функции fH, и, если в столбце значений стоят только единицы, то заключаем,
что H тождественно истинна, если там есть хоть одна единица, то H
выполнима. К сожалению, этот способ пригоден только для формул с
небольшим числом переменных. Уже для нескольких десятков и сотен
переменных он не годится из-за большого размера получающейся таблицы.
В математической логике построены аксиоматические системы,
позволяющие формализовать человеческие рассуждения о выводимости
одних тождественно истинных формул из других. В некоторых случаях они
позволяют доказать тождественную истинность достаточно длинных формул,
имеющих регулярную структуру. Но в общем случае они практически не
применимы для произвольных формул с большим числом переменных.
В теории сложности алгоритмов имеется ряд результатов, которые
свидетельствуют о том, что эффективных алгоритмов для проверки
выполнимости или тождественной истинности произвольной булевой
формулы не существует, если 𝑃 ≠ 𝑁𝑃. Вместе с тем для некоторых
подклассов формул эти задачи решаются достаточно эффективно.
Литература к главе 1.
1) Яблонский С.В. Введение в дискретную математику. - М.: Высш. шк.,
2001.
2) Гаврилов Г.П., Сапоженко А.А. Задачи и упражнения по курсу
дискретной математики: - М.: Наука, 1992.
3) Дискретная математика и математические вопросы кибернетики. Т. 1. М.: Наука, 1974.
4) http://www.intuit.ru/studies/courses/1084/192/info
5) T.П. Тюрина, В.И. Емельянов. Дискретная математика (часть 3).
Учебное пособие. – Новомосковск. – 2004
6) Wikipedia
Глава 2. Булевская формализация и решение логических
задач
В занимательной книге Р. Смаллиана «Принцесса или тигр» приведены
ряд задач, решение которых требует от читателя некоторой смекалки и так
называемого логического мышления. Сейчас мы опишем способ решения
этих задач, основанный на стандартном подходе, принятом в математике, и
который здесь мы будем называть булевской формализацией. По условиям
каждой задачи мы будем составлять булевские уравнения, решения которых
будут соответствовать решению исходной задачи.
2.1. Принцесса или тигр
Во всех задачах этой группы узник помещается в комнату, в которой
имеются две двери, за каждой из которых может находиться либо принцесса,
либо тигр. Вполне может статься, что в обеих комнатах сидят тигры или там
окажутся одни лишь принцессы (считается, что в первом случае узнику не
повезло и никакая смекалка ему не поможет). Узник должен угадать, в какой
комнате находится принцесса, а в какой — тигр. На двери каждой комнаты
висит по одной табличке с некоторой информацией, а заключенному кое-что
говорится об истинности этих сведений. Если узник не глуп и способен
рассуждать логически, он сумеет сохранить себе жизнь и в придачу
заполучить прелестную невесту.
1.1.1. Узник заходит в комнату и на дверях видит таблички следующего
содержания:
Т1 : В этой комнате находится принцесса, а в другой
комнате сидит тигр
Т2 : В одной из этих комнат находится принцесса; кроме
того, в одной из этих комнат сидит тигр
Далее узнику говорится, на одной табличке сведения верные, на другой
– нет.
Какую дверь должен открыть узник? (Конечно, если он предпочитает
принцессу тигру.)
Решение.
Введем две булевы переменные П1 и П2 .
Считаем, что П1 будет принимать значение 1, если высказывание «В
первой комнате находится принцесса» истинно, и 0, если это высказывание
ложно. П2 будет принимать значение 1, если высказывание «Во второй
комнате находится принцесса» истинно, и 0, если это высказывание ложно.
Заметим, что в этом случае истинность логической формулы ¬П1
будет соответствовать истинности высказывания «В первой комнате
находится тигр», а истинность формулы ¬П2 – истинности высказывания
«Во второй комнате находится тигр».
Значение переменных П1 и П2 мы должны определить.
Информация, записанная на первой табличке, может быть описана
логической формулой Т1 = П1 &¬П2 , а информация на второй табличке –
формулой Т2 = П1 ⊕ П2 .
Тогда по условию задачи формула Т1 ⊕ Т2 должна принимать
значение 1.
Таким образом, решив логическое уравнение
(П1 &¬ П2 ) ⊕ (П1 ⊕ П2 ) = 1 ,
т.е. найдя подходящие значения переменных П1 и П2 , мы найдем решение
исходной задачи.
Существует несколько способов решения подобных логических
уравнений.
Самым простым в данном случае будет разбор всех возможных
вариантов значений переменных П1 и П2, которые могут быть сведены в
одну таблицу, которую принято называть таблицей истинности формулы:
П1 П2 П1 &¬ П2 П1 ⊕ П2 (П1 &¬ П2 ) ⊕ (П1 ⊕ П2 )
0 0
0
0
0
0 1
0
1
1
1 0
1
1
0
1 1
0
0
0
Таким образом,
у данного уравнения существует единственное
решение П1 = 0 и П2 = 1, а это означает, что в первой комнате сидит тигр, а
во второй – принцесса.
1.1.2. Узник заходит в комнату и на дверях видит таблички, на которых
написано:
Т1 : Что выбрать — большая разница
Т2 : Лучше выбрать другую комнату
Относительно первой комнаты узнику было сказано: «Если в этой
комнате находится принцесса, то утверждение на табличке истинно, если же
тигр, ложно». Относительно второй комнаты было сказано: утверждение на
табличке ложно, если в комнате находится принцесса, и истинно, если в
комнате сидит тигр.
Какую дверь должен выбрать узник?
Решение.
Аналогично решению предыдущей задачи введем две булевы
переменные П1 и П2 , с теми же значениями.
Тогда содержание первой таблички может быть описано формулой
Т1 = П1 ⊕ П2 (что означает, что содержимое комнат разное), а
содержание второй таблички – формулой Т2 = П1 &¬П2 (единственный
вариант, при котором надо предпочесть первую комнату, соответствует
случаю, когда в первой комнате находится принцесса, а во второй – тигр).
По условию задачи две следующие формулы должны быть истинными:
Т1 ≡ П1 и Т2 ≡ ¬П2 .
Таким образом, нам необходимо решить систему из двух логических
уравнений: ((П1 ⊕ П2 ) ≡ П1 ) = 1 и ((П1 &¬П2 ) ≡ ¬П2 ) = 1
В данном случае также самым простым будет разбор всех возможных
вариантов значений переменных П1 и П2 :
П1 П2 (П1 ⊕ П2 ) ≡ П1 (П1 &¬П2 ) ≡ ¬П2
0 0
1
0
0 1
0
1
1 0
1
1
1 1
0
1
Мы видим, что единственным решением этой системы будет П1 = 1,
П2 = 0, т.е. принцесса находится в первой комнате.
2.2. Инспекция психиатрических лечебниц
В задачах этой группы инспектор проверяет состояния психиатрических
лечебниц. В каждой из лечебниц единственными обитателями являются
пациенты и врачи — причем последние составляют весь персонал этих
медицинских учреждений. Каждый обитатель лечебницы, будь то пациент
или врач, либо находится в здравом уме, либо лишен рассудка. Кроме того,
нормальные обитатели на сто процентов уверены в том, что они говорят, они
твердо знают, что все истинные утверждения действительно являются
истинными, а все ложные — на самом деле ложными. В то же время
безумные
обитатели
лечебниц
придерживаются
совершенно
противоположных представлений: все истинные утверждения они считают
ложными, а все ложные утверждения — истинными.
Лечебница признается хорошей, если все ее врачи – нормальные, а все
пациенты – сумасшедшие.
1.2.1. В некоторой лечебнице один из ее обитателей сообщил
инспектору нечто такое, из чего тот смог сделать вывод, что говоривший был
пациентом, но во вполне здравом уме, и потому его нужно было выпускать
оттуда. Инспектор сразу же предпринял шаги для его освобождения.
Необходимо предложить пример такого сообщения.
Решение.
Введем две булевы переменные П и С. Считаем, что П будет принимать
значение 1, если высказывание «Говорящий является пациентом» истинно,
и 0, если это высказывание ложно. Переменная С будет принимать значение
1, если высказывание «Говорящий является сумасшедшим» истинно, и 0,
если это высказывание ложно. Искомую фразу Ф будем искать в виде
некоторой формулы Ф(П, С) с переменными П и С.
Исходя из условия задачи, уравнение (Ф ≡ ¬С) = 1 имеет
единственное решение, т.е. формула Ф ≡ ¬С истинна только в одном случае,
когда П = 1 и С = 0 (т.е. когда говоривший является здоровым пациентом).
П С Ф ≡ ¬С
0 0
0
0 1
0
1 0
1
1 1
0
По этой таблице восстановим таблицу для формулы Ф:
П С Ф ≡ ¬С ¬С Ф
0 0
0
1 0
0 1
0
0 1
1 0
1
1 1
1 1
0
0 1
Отсюда заключаем, что формула Ф имеет вид П ∨ С, что на русском языке
может соответствовать, например, фразе «Я пациент или я сумасшедший».
2.3. Трансильвания
Известно, что одну часть населения Трансильвании составляют люди, а
другую — упыри, причем люди всегда говорят то, что думают, а упыри
умышленно лгут. Ситуация в этой стране осложняется еще и тем, что
половина всех жителей Трансильвании лишена рассудка и придерживается
совершенно превратных представлений об окружающем их мире: так, все
истинные суждения они считают ложными, а все ложные утверждения —
истинными. Другая половина жителей психически здорова и абсолютно
безупречна в своих суждениях, а именно: все истинные утверждения, по их
мнению, являются истинными, про ложные же утверждения они знают, что
те ложны.
Поэтому трансильванская логика оказывается сложнее, чем в
лечебницах для душевнобольных. Люди в здравом уме и упыри, лишившиеся
рассудка, изрекают только истины; люди, лишившиеся рассудка, и упыри,
находящиеся в здравом уме, всегда лгут. К примеру, если вы спросите у
жителя Трансильвании, круглая ли Земля (или она плоская), то человек в
здравом уме, зная, что Земля круглая, так и скажет. Человек же, лишившийся
рассудка, считает, что Земля не является круглой, и потому, правдиво
высказывая свое мнение, будет утверждать, что Земля плоская. Упырь в
здравом уме знает, что Земля круглая, но поскольку он всегда лжет, то будет
говорить, что это вовсе не так. В то же время лишившийся рассудка упырь
уверен, будто Земля плоская и поскольку он всегда лжет, то станет
утверждать, что Земля круглая. Таким образом, ответы упыря, лишившегося
рассудка, совпадают с высказываниями нормального человека, в то время как
утративший разум человек будет отвечать на задаваемые ему вопросы точно
так же как и упырь, находящийся в здравом уме.
1.3.1. Вы попадаете в некоторую семью, в которой живут муж и жена.
Вы знаете, что в Трансильвании людям и упырям запрещено законом
вступать в браки между собой, следовательно, описываемая семейная пара
состоит либо из обычных людей, либо из упырей.
На вашу просьбу рассказать что-нибудь о семье, вы услышали
следующее:
Жена: Мой муж — человек.
Муж: Моя жена — упырь.
Жена: Один из нас вполне нормален, а другой сошел с ума.
Вам надо определить, кто они — люди или упыри?
Решение.
В этом случае мы введем четыре булевых переменных:
 Ч1 , которая будет принимать значение 1, если высказывание
«Первый персонаж (жена) является человеком» истинно, и
значение 0, если оно ложно;
 С1 , которая будет принимать значение 1, если высказывание
«Первый персонаж (жена) является сумасшедшей» истинно, и
значение 0, если оно ложно;
 Ч2 , которая будет принимать значение 1, если высказывание
«Второй персонаж (муж) является человеком» истинно, и
значение 0, если оно ложно;
 С2 , которая будет принимать значение 1, если высказывание
«Второй персонаж (муж) является сумасшедшим» истинно, и
значение 0, если оно ложно.
По условию задачи значение переменных Ч1 и Ч2 совпадают.
Напомним логику жителей Трансильвании. Правду говорят только
здоровые люди и сумасшедшие упыри.
Поэтому условия задачи можно записать в виде системы из трех
логических уравнений:
1) (Ч2 ≡ (Ч1 &¬С1 ⋁ ¬ Ч1 &С1 )) = 1.
Действительно, жена говорит, что муж – человек, и это истинно, когда она
является здоровым человеком или сумасшедшим упырем. Пользуясь тем, что
Ч2 ≡ Ч1 , и стандартными эквивалентностями булевых формул, мы запишем
это уравнение короче: (Ч1 ≡ (Ч1 ⊕ С1 )) = 1.
2) Фразе мужа, с учетом трансильванской логики, соответствует уравнение:
(¬Ч1 ≡ (Ч1 ⊕ С2 )) = 1.
3) Второй фразе жены, с учетом трансильванской логики, соответствует
уравнение ((С1 ⊕ С2 ) ≡ (Ч1 ⊕ С1 )) = 1.
Опять решим данную систему логических уравнений разбором всех
возможных случаев, которые выпишем в виде таблицы:
Ч1 С1 С2 Ч1 ≡ (Ч1 ⊕ С1 ) ¬Ч1 ≡ (Ч1 ⊕ С2 ) (С1 ⊕ С2 ) ≡ (Ч1 ⊕ С1 )
0 0 0
1
0
1
0 0 1
1
1
0
0 1 0
0
0
1
0 1 1
0
1
0
1 0 0
1
0
0
1 0 1
1
1
1
1 1 0
0
0
0
1 1 1
0
1
1
Таким образом, данная система имеет единственное решение Ч1 =1,
С1 =0, С2 =1, что соответствует тому, что это семья людей, в которой жена
здорова, а муж сошел с ума.
Мы видим, что булевская формализация позволяет решать широкий
класс логических задач, опираясь на навыки записи содержательных условий
в виде булевских уравнений и методы их решения. Этот подход не требует
так называемой «смекалки» и подтверждает слова великого Л. Эйлера
«знание метода уравнивает способности». Что касается методов решения
булевских уравнений, то здесь мы использовали только самый простой –
метод построения таблиц истинности. Чтобы осознать его низкую
эффективность при решении практических задач, достаточно представить
себе, что в задачах типа «Принцесса или тигр» будет задействовано 100
дверей. Тогда размер соответствующей таблицы будет астрономически
большим, и метод построения таблиц истинности окажется практически
бесполезным. Следующие разделы посвящены методам, позволяющим
эффективно использовать булевскую формализацию в решении задач,
размерность которых соответствует
потребностям практических
приложений.
Литература к разделу 1.
1. Рэймонд М. Смаллиан. Принцесса или тигр?. – М:«Мир». - 1985. - 221с.
Глава 3. ВМ-подход к решению прикладных задач
Понятие вычислительной модели появилось в работах эстонского учёного
Э.Х.Тыугу и подробно описано в его книге «Концептуальное
программирование».
3.1. Хорновские вычислительные модели
Для наших целей достаточно определить вычислительную модель как пару
М=<V, R>, где V – это множество булевых переменных, а R – множество
так называемых отношений вычислимости над переменными из V.
Например, в качестве вычислительной модели понятия «треугольник»
можно взять модель М, в которой
V= {a,b,c, α, β, γ,S, p, ha, hb, hc, ma, mb, mc, ta, tb, tc , r1,r2},
где a,b,c - соответствуют сторонам треугольника; α, β, γ – внутренним
углам; S – площади, p – периметру, ha, hb, hc – высотам, ma, mb, mc –
медианам, ta, tb, tc – биссектрисам, r1 – радиусу вписанной окружности, r2 –
радиусу описанной окружности. Содержательный смысл каждой переменной
следующий: она принимает значение 1, когда соответствующий элемент
треугольника может быть вычислен.
Отношения вычислимости из R = {R1,…,Rn} могут задаваться многими
способами. Наиболее естественный для понятия «треугольник» способ
состоит в записи булевых функций, соответствующих известным
математическим
формулам, связывающим величины элементов
треугольника.
Например, отношение R1 соответствует математической формуле
p=a+b+c, которая в вычислительной модели преобразуется в 4 булевы
формулы a&b&c →p, a&b&p →c, a&p&c →b, p&b&c →a.
Смысл этих булевых формул интуитивно ясен – если известны
значения элементов треугольника, соответствующие булевым переменным,
стоящим в посылке импликации, то может быть вычислен элемент
треугольника, соответствующий переменной, стоящей в заключении
импликации.
Отношение R2 соответствует математической формуле α+β+γ=180,
которая в вычислительной модели преобразуется в 3 булевы формулы
α&β→γ, α& γ →β, β & γ → α.
Отношение R3 соответствует математической формуле S= (1/2)*a* ha,
которая в вычислительной модели преобразуется в 3 булевы формулы
a&
ha → S, S&a → ha , S & ha → a.
Отношение
R4
соответствует
математической
формуле
S=(1/2)*a*b*sin(γ) , которая в вычислительной модели преобразуется в 4
булевых формулы a & b & γ → S, a & b & S → γ, a & S & γ →b,
S
& b & γ →a и т.д.
Таким образом, последовательно рассматривая содержательные
отношения из R в виде математических формул, мы построим
вычислительную модель М треугольника, которая будет являться
множеством булевых формул вида:
(1)
 x11 &  & x1n1  Y 1

     
x N & & x N  Y N
nN
 1
Каждой конкретной вычислительной задаче на треугольнике
соответствует булева формула того же вида:
x10 &  & xn00  Y 0 .
(2)
Так, например, задаче по известным трем сторонам вычислить высоту
ha будет соответствовать булева формула a &b &c → ha.
Спрашивается, является ли формула (2), соответствующая
содержательной задаче, логическим следствием формул (1), являющихся
вычислительной моделью треугольника. Если формула (2) является
логическим следствием формул (1), то содержательная вычислительная
задача имеет решение, и мы сможем определить последовательность
вычислений, составляющих суть этого решения. Если же мы определим, что
формула (2) не является логическим следствием формул (1), то мы сможем
заключить, что либо содержательная задача не имеет решения, либо у нас не
хватает информации для его нахождения, т.е. вычислительная модель должна
быть пополнена новыми отношениями (новыми «знаниями»).
В общем случае в вычислительную модель могут входить булевы
формулы более сложной структуры. Но здесь такие модели мы
рассматривать не будем.
Формулы вида (1) и (2) имеют вид импликаций, в посылке которых
могут стоять только конъюнкции n переменных (n≥0), а в заключении –
только переменные. Такие булевы формулы принято называть хорновскими
формулами.
Поэтому вычислительные модели с отношениями вычислимости вида
(1) мы будем называть хорновскими моделями.
3.2. Алгоритмы поиска
вычислительных моделях
решений
задач
на
хорновских
3.2.1. Алгоритм прямой волны
Пусть М=<V,R> - хорновская вычислительная модель, где
V={z1,…,zm} – список всех переменных M, R={R1,…,RN}- список всех
отношений, представленных хорновскими формулами:
 x11 & x12 &  & x1n1  Y 1
R1


     
x N & x N & & x N  Y N
RN
2
nN
 1
Пусть Z – содержательная задача, которая сводится к выяснению,
справедлива ли на M формула
x10 & x20 &  & xn00  Y 0
(Z)
т.е. является ли формула (Z) логическим следствием формул R1,…,RN.
Решением задачи будем называть последовательность переменных из V вида
v1,…,vk , где vk совпадает с заключением формулы Z и для каждого i=1,…,k
переменная vi либо принадлежит посылке формулы Z, либо совпадает с
заключением некоторой формулы Rj, все переменные из посылки которой
входят в список переменных v1,…,vi-1.
Очевидно, что если решение задачи Z на модели M существует, то на любом
наборе значений булевых переменных {z1,…,zm}, на котором все формулы
R1,…,RN принимают значение 1, формула Z также будет принимать значение
1.
Рассмотрим сначала частный случай. Предположим, что все ni=1.
Рассмотрим список всех различных переменных модели V= {z1,…, zm}.
Тогда данная хорновская вычислительная модель может быть описана
ориентированным графом. Каждой переменной из V соответствует вершина
графа.
• z1
•Y0
•z4
•z2
X0•
•z3
Если в модели имеется формула X→Y, то проводим ребро из
вершины, соответствующей переменной X, в вершину, соответствующую
переменной Y. Очевидно, что выводимость на модели формулы X0→ Y0
равносильна ответу на вопрос, есть ли путь в графе между вершинами,
соответствующими X0 и Y0. Таким образом, наша задача в этом случае
сводится к поиску пути в ориентированном графе.
Данная задача решается с помощью следующего алгоритма, который
называется алгоритмом прямой волны.
Источником F0 назовем вершину, соответствующую X0 (отсюда ищем
путь). Выписываем все переменные F1, в которые можно перейти из X0 за
один шаг (фронт волны). Если фронт F1 пустой, то задача не имеет решения.
Если Y0 попадает во фронт, то задача решена положительно. Если Y0 не
попадает во фронт, то продолжаем работу алгоритма.
Строим второй фронт волны F2, куда попадают переменные,
соответствующие вершинам, в которые можно перейти из
вершин,
соответствующим переменным из F1 за один шаг. При этом переменные уже
входящие в F0 и F1 в фронт F2 не включаются. Если фронт F2 пустой, то
задача не имеет решения. Если Y0 попадает во фронт, то задача решена
положительно. Если Y0 не попадает во фронт, то продолжаем работу
алгоритма.
И так далее последовательно строим новые фронты прямой волны
F3,…,Fk.




0
X




F 0 _ F1








F2









Fk
k<m
Очевидно, что алгоритм прямой волны в этом частном случае всегда
закончит свою работу.
Описанный алгоритм прямой волны легко переносится на общий
случай, когда ni принимают произвольные значения.
0
В качестве источника F0 берется множество всех переменных X i из
посылки формулы Z.
На i-том шаге алгоритма просматриваем все формулы A1,…,AN из
модели. Если все посылки некоторой формулы Aj уже включены во фронты
F1,…,Fi, то переменную из ее заключения включаем в новый фронт Fi+1,
если, конечно, она уже не попала во фронты F1,…,Fi.
Если фронт Fi+1 пустой, то задача не имеет решения. Если Y0 попадает
во фронт Fi+1, то задача решена положительно. Если Y0 не попадает во
фронт, то продолжаем работу алгоритма.
Временная сложность описанного алгоритма прямой волны:
O(mL)  O( L ) , где
2
n
n
i 0
i
 L , 𝑚 – число этапов (число фронтов волны, которое
может по порядку быть сравнимо с L). В таком случае говорят, что алгоритм
прямой волны является квадратичным по времени от размера L
вычислительной модели.
Сейчас мы опишем алгоритм, являющийся модификацией алгоритма
прямой волны, который будет закачивать работу за O(L) шагов, т.е. будет
линейным по времени от размера L вычислительной модели.
3.2.2. Алгоритм со счётчиками
Пусть М – хорновская вычислительная модель.
Пусть V={z1,…,zm} – список всех переменных M, R1,…,RN– список всех
булевых формул модели M и Z-задача на модели М.
Для каждой формулы Ri заводим счётчик Si , который на каждом этапе будет
равен количеству ещё «не выведенных» переменных в посылке этой
формулы.
В начале работы
S1  n1; S2  n2 ;; S N  nN
Заведем следующие массивы:
1) ПЕР_В_ЛЕВ_Ч [1:m] , где значение i-ой компоненты - список номеров
формул модели, в левую часть которых входит переменная zi ;
2) ПЕР_ПРАВ_Ч [1:N], где значение i-ой компоненты – номер переменной,
которая является заключением формулы Ri;
3) ВЫВ_П [1:m] – булевский массив, в котором i-ая компонента равна 1,
если переменная zi выведена, и равна 0, если переменная zi еще не выведена.
4) П_В_СПИСКЕ [1:m] – булевский массив, в котором i- тая компонента
равна 1, если переменная zi выведена, но не «обработана» и включена в
список для «обработки», и равна 0, если переменная zi не находится в списке
для обработки.
Алгоритм:
Составляем список S для обработки переменных, куда в начало помещаем
переменные X10 ,, X n0 .
0
Отметим их в массиве П_В_СПИСКЕ [1:m], что они включены в список
для «обработки», и в массиве ВЫВ_П [1:m] , что они уже выведены.
Берём последнюю переменную p из списка S и «обрабатываем» ее, т.е.
находим в массиве ПЕР_В_ЛЕВ_Ч номера формул модели, в левую часть
которых она входит, и уменьшаем на 1 соответствующие счётчики. Если
некоторый счетчик Sj становится равным 0, то берём переменную q из правой
части формулы Rj (ее номер равен ПЕР_ПРАВ_Ч [j] ). Если q нет в списке
для обработки, то метим ее, как выведенную, и помещаем в список для
обработки. После этого переменная p исключается из списка S, и т.д.
Алгоритм работает, пока список S не станет пустым.
Если по окончании алгоритма переменная Y0 помечена как выведенная в
массиве ВЫВ_П [1:m] , то «успех», иначе – «неудача».
Время работы этого алгоритма равно по порядку числу вхождений всех
переменных в левую часть всех формул модели  ni  L .
i
3.2.3. Логическая полнота алгоритма со счетчиками для хорновских
моделей
Таким образом, алгоритм со счетчиками за линейное время от размера
модели остановится. Возможны два случая.
1. Успех. По окончании алгоритма переменная Y0 помечена как выведенная в
массиве ВЫВ_П [1:m].
Легко заметить, что выписывая переменные в порядке их попадания в
массив ВЫВ_П [1:m] в качестве выведенных переменных, мы построим
последовательность v1,…,vk , являющуюся решением задачи.
2. Неудача. В этом случае рассмотрим следующий набор значений
переменных модели zi = ВЫВ_П [i].
Очевидно, что если значение счетчика Sj, соответствующего формуле Rj , по
окончании работы алгоритма равно нулю, то все переменные из посылки
этой формулы принимают значение 1, и переменная из заключения также
принимает значение 1, а, следовательно, и вся формула принимает значение
1. Если же значение Sj не равно нулю, то некоторые переменные из посылки
формулы Rj не попали в массив ВЫВ_П [i], следовательно, принимают
значение 0, и поэтому вся формула Rj также примет значение 1.
Отсюда следует, что при данном наборе значений переменных z1,…,zm все
формулы R1,…,RN принимают значение 1, а формула Z принимает значение
0. В таком случае принято говорить, что формула Z не является логическим
следствием формул R1,…,RN .
Следовательно, для любой конкретной задачи Z на хорновской
вычислительной модели M можно за линейное время O(L), где L – размер
вычислительной модели M, определить, имеет она решение на модели, или
нет.
3.2.4. Замечание о содержательной полноте
построения систем, реализующих ВМ-подход
и
принципах
Легко заметить, что булевская вычислительная модель некоторого объекта
строится исходя из наших содержательных знаний об этом объекте. Таким
образом, если, например, мы не знаем, что для треугольников справедлива
формула Герона, то в нашу булевскую вычислительную модель не попадут
следующие хорновские формулы
a&b&c&p→S S&b&c&p→a
a&S&c&p→b a&b&S&p→c ,
а, следовательно, для некоторых задач о треугольнике, имеющих
содержательное решение, на построенной хорновской модели решение
может не найтись.
Отсюда можно сделать вывод, что построение хорновской модели
определенного объекта зависит от наших знаний об этом объекте, а
построенная модель в общем случае не гарантирует «содержательной
полноты», т.е. что любая содержательная задача, имеющая решение, будет
решаться и на построенной хорновской модели.
3.2.5. Концептуальное программирование
Суть концептуального программирования состоит в построении
вычислительных моделей сложных объектов и процессов, используя уже
построенные вычислительные модели более простых объектов и процессов.
Так, например, используя вычислительную модель треугольника, легко
построить последовательно модели четырехугольника, параллелограмма,
прямоугольника, ромба, квадрата и т.д.
В книге Э.Х. Тыугу
«Концептуальное программирование» и в ряде работ последних лет описаны
процессы построения вычислительных моделей различных объектов в
различных областях, таких как геометрия, радиоэлектроника, военное дело и
др.
Данный подход в силу ряда причин не получил пока очень широкого
распространения. Однако сейчас идеи концептуального программирования
вновь набирают все большую популярность, в том числе и за рубежом
(например, язык программирования XL). К этим идеям относятся следующие
аспекты:
- программирование в терминах предметной области решаемых задач,
- разработка так называемых малых языков или языков предметной области
(domain specific language - DSL),
- использование компьютера уже на этапе постановки задач.
Близость подхода, применяемого в DSL и концептуальном
программировании,
заключается
в
тенденции
приблизить
язык
программирования
(или,
говоря
в
терминах
концептуального
программирования, язык описания вычислительной модели) к естественному
языку. Это позволяет, в конечном счете, не только максимально облегчить
труд программиста, но и привлечь к такому "программированию" бизнесаналитиков, незнакомых с обычными языками программирования и
средствами разработки.
3.3. Решение головоломок на квазихорновских моделях
Понятие квазихорновской вычислительной модели.
При построении булевских вычислительных моделей мы будем использовать
следующий прием. Для каждой переменной zi модели литеру ¬zi мы будем
рассматривать как самостоятельную переменную, независимую от zi.
Поэтому все отношения вычислимости будут иметь как бы хорновский вид,
несмотря на то, что в их посылки будут входить переменные с отрицаниями.
На построенной модели будут
решаться задачи, с использованием
линейного алгоритма со счетчиками. В качестве специальных отношений
вычислимости будут добавлены формулы вида zi & ¬zi → F для всех
i=1,…,m. Таким образом, число переменных в строящихся вычислительных
моделях возрастет почти в два раза (так как не для всех переменных будут
использоваться их отрицания). Такие модели, в которых на этапе поиска
решения литеры вида ¬zi рассматриваются как самостоятельные переменные,
а не как отрицания переменной zi, мы будем называть квазихорновскими
моделями.
Важно иметь в виду, что для квазихорновских вычислительных
моделей рассмотренный нами алгоритм со счетчиками не будет обладать
свойством логической полноты. Поясним это. Пусть алгоритм со счетчиками
закончился неудачей.
Все выведенные переменные мы объявляем
истинными. Очевидно, что если значение счетчика Sj, соответствующего
формуле Rj , по окончании работы алгоритма равно нулю, то все переменные
из посылки этой формулы принимают значение 1, и переменная из
заключения также принимает значение 1, а, следовательно, и вся формула
принимает значение 1. Если же значение Sj не равно нулю, то значит
некоторые переменные из посылки формулы Rj не попали в массив
ВЫВ_П [i]. Но в этом случае мы не можем им автоматически присвоить
значение 0 (как в случае хорновских моделей), т.к. среди таких переменных в
других формулах Rk c ненулевым значением счетчика Sk могут оказаться и
их формальные отрицания.
Таким образом, мы не можем доказать, что в случае неудачи
алгоритма со счетчиками на квазихорновской модели, формула Z не будет
логическим следствием формул R1,…,RN .
Тем не менее, алгоритм со счетчиками позволяет решать задачи
больших размерностей на квазихорновских моделях, построенных для
практически значимых областей. В этом пособии мы ограничимся
построением квазихорновских моделей для двух логических головоломок.
3.3.1. Задача Эйнштейна
Задача
Эйнштейна
—
известная логическая задача,
по
легенде
созданная Альбертом Эйнштейном в годы его детства.
Иногда
автором головоломки называют Льюиса Кэрролла. Бытует мнение, что эта
задача использовалась Эйнштейном для проверки кандидатов в ассистенты
на способность к логическому мышлению. Некоторые приписывают
Эйнштейну рассуждение, в котором тот утверждает, что лишь два процента
населения земного шара способны оперировать в уме закономерностями,
связанными сразу с пятью признаками. Как частное следствие этого,
приведённая головоломка может быть решена без использования бумаги
лишь теми, кто принадлежит к этим двум процентам. Однако не существует
никаких документальных свидетельств того, что Эйнштейн когда-либо
утверждал подобное.
В своём самом сложном варианте задача предполагает решение в уме,
без использования каких-либо записей или средств сохранения информации.
Без этих ограничений головоломка заметно теряет в сложности, поскольку
может быть решена простым составлением таблицы с исключением заведомо
противоречивых вариантов, и, следовательно, мало что говорит о
способностях испытуемого.
Условие: Есть 5 домов разного цвета, стоящие в ряд. В каждом доме живет
по одному человеку отличной от других национальности. Каждый жилец
пьет только один определенный напиток, курит определенную марку сигарет
и держит определенное животное. Никто из пяти человек не пьет одинаковые
напитки, не курит одинаковые сигареты и не держит одинаковых животных.
Известно, что:
Англичанин живет в красном доме
Швед держит собаку
Датчанин пьет чай
Зеленый дом стоит слева от белого
Жилец зеленого дома пьет
Человек, который курит Pallmall, держит птицу
Жилец среднего дома пьет
Жилец из желтого дома курит Dunhill
Норвежец живет в первом
Курильщик Marlboro живет около того, кто держит кошку
Человек, который содержит лошадь, живет около того, кто курит
Dunhill
(12) Курильщик Winfield пьет пиво
(13) Норвежец живет около синего дома
(14) Немец курит Rothmans
(15) Курильщик Marlboro живет по соседству с человеком, который пьет
воду
Вопрос: У кого живет рыба?
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
Покажем, как можно построить адекватную квазихорновскую
вычислительную модель для решения этой задачи. Термин «квазихорновская
вычислительная модель» будет объяснен немного позже.
Введем следующие булевы переменные:
1) Ni,j , которая будет принимать значение 1, если высказывание «в доме с
номером i живет человек национальности j» будет истинным, и 0, если
данное высказывание будет ложным; здесь i=1,2,…,5; j Є{1- англичанин, 2датчанин, 3- немец, 4- норвежец, 5 -швед}. Всего будет 25 таких булевых
переменных.
2) Сi,j , которая будет принимать значение 1, если высказывание «дом с
номером i имеет цвет j» будет истинным, и 0, если данное высказывание
будет ложным; здесь i=1,2,…,5; j Є{1- белый, 2- желтый, 3-зеленый, 4красный, 5 -синий}. Всего будет 25 таких булевых переменных.
3) Si,j , соответствующие высказываниям «в доме с номером i живет
человек, курящий сигареты j»; здесь i=1,2,…,5; j Є{1- Dunhill, 2- Marlboro, 3Pallmall, 4-Rothmans, 5 -Winfield }; j Є {1- данхил, 2-мальборо, 3-пал мал, 4ротманс, 5-винфилд }. Всего будет 25 таких булевых переменных.
4) Di,j , соответствующие высказываниям «в доме с номером i живет
человек, предпочитающий напиток j»; i=1,2,…,5;
j Є{1-вода, 2-кофе, 3молоко, 4-пиво, 5-чай}; Всего будет 25 таких булевых переменных;
5) Аi,j , соответствующие высказываниям «в доме с номером i живет
животное j; i=1,2,…,5; j Є{1- кошка, 2- лошадь, 3-птица, 4-собака, 5-…
рыбка}. Всего 25 таких булевых переменных.
6) PNi , i = 1,…,5 – соответствующие высказыванию «национальность
человека, проживающего в i-том, доме определена»;
PCi , i = 1,…,5 - соответствующие высказыванию «цвет i-того дома
определен»;
PDi , i = 1,…,5 - соответствующие высказыванию « напиток, который пьет
человек, проживающий в i-том доме, определен»;
PSi , i = 1,…,5 - соответствующие высказыванию «сорт сигарет, который
курит человек, проживающий в i-том доме, определен»;
PАi, i = 1,…,5 - соответствующие высказыванию «животное, которое
содержит человек, проживающий в i-том доме, определено»;
Всего 25 таких булевых переменных.
7) Переменные Р и F.
P соответствует высказыванию «полное решение задачи найдено»,
F соответствует высказыванию «решение задачи содержит противоречие».
Таким образом, общее количество
вычислительной модели равно 152.
булевых
переменных
в
Обозначим через
U1(x1,…,xn) следующий набор формул,
описывающий отношение
«одна и только одна булева переменная из
множества {x1,…,xn} принимает значение 1»:
¬x2&…&¬xn → x1,
¬x1&…&¬xi-1&¬xi+1&…&¬xn → xi , для всех i =2,…,n-1
¬x1&…&¬xn-1 → xn,
xi →¬xj , для всех i,j=1,…,n, i≠j,
Легко подсчитать, что в этом наборе 𝑛 + 𝑛(𝑛 − 1) формул, общая
длина которых равна 𝑛 ∗ 𝑛 + 2𝑛(𝑛 − 1) = 𝑂(𝑛2 ).
Формулы строящейся вычислительной модели разобьем на три группы.
1) Формулы, описывающие общие условия задачи:
U1(Ni,1 ,
U1(Ci,1 ,
U1(Si,1 ,
Ni,2 , Ni,3 , Ni,4 , Ni,5) , i=1,2,3,4,5.
Ci,2 , Ci,3 , Ci,4 , Ci,5) , i=1,2,3,4,5.
Si,2 , Si,3 , Si,4 , Si,5) , i=1,2,3,4,5.
U1(Di,1 , Di,2 , Di,3 , Di,4 , Di,5) , i=1,2,3,4,5.
U1(Ai,1 , Ai,2 , Ai,3 , Ai,4 , Ai,5) , i=1,2,3,4,5.
2) Формулы, строящиеся для каждого дополнительного условия.
Условия (1)-(15) можно разбить на следующие однотипные группы.
Группа 1. Условия вида «если дом обладает свойством А, то он обладает
свойством В».
2.1) Условию « Англичанин живет в красном доме» соответствуют формулы
Ni,1 →Ci,4
i=1,2,3,4,5.
Ci,4 → Ni,1
i=1,2,3,4,5.
¬Ci,4 → ¬Ni,1
i=1,2,3,4,5.
¬Ni,1 →¬Ci,4
i=1,2,3,4,5.
2.2) Условию «Швед держит собаку» соответствуют формулы
Ni,5 →Ai,4
i=1,2,3,4,5.
Ai,4 →Ni,5
i=1,2,3,4,5.
¬Ai,4 →¬Ni,5
i=1,2,3,4,5.
¬Ni,5 →¬Ai,4
i=1,2,3,4,5.
2.3) Условию «Датчанин пьет чай» соответствуют формулы
Ni,2 →Di,5
i=1,2,3,4,5.
Di,5 → Ni,2
i=1,2,3,4,5.
¬Di,5 → ¬Ni,2
i=1,2,3,4,5.
¬Ni,2 →¬Di,5
i=1,2,3,4,5.
2.5) Условию «Жилец зеленого дома пьет кофе» соответствуют формулы
Сi,3 →Di,2
i=1,2,3,4,5.
Di,2 → Сi,3 i=1,2,3,4,5.
¬Di,2 → ¬Сi,3 i=1,2,3,4,5.
¬Сi,3 →¬Di,2
i=1,2,3,4,5.
2.6) Условию «Человек, который курит Pallmall, держит птицу»
соответствуют формулы
Si,3 → Ai,3
i=1,2,3,4,5.
Ai,3 → Si,3 i=1,2,3,4,5.
¬Ai,3 → ¬Si,3 i=1,2,3,4,5.
¬Si,3 → ¬Ai,3
i=1,2,3,4,5.
2.8) Условию « Жилец из желтого дома курит Dunhill» соответствуют
формулы
Сi,2 → Si,1
i=1,2,3,4,5.
Si,1 → Ci,2 i=1,2,3,4,5.
¬Si,1 → ¬Ci,2 i=1,2,3,4,5.
¬Сi,2 → ¬Si,1
i=1,2,3,4,5.
2.12) Условию «Курильщик Winfield пьет пиво» соответствуют формулы
Si,5 → Di,4
i=1,2,3,4,5.
Di,4 → Si,5
i=1,2,3,4,5.
¬Di,4 → ¬Si,5 i=1,2,3,4,5.
¬Si,5 → ¬Di,4
i=1,2,3,4,5.
2.14) Условию «Немец курит Rothmans» соответствуют формулы
Ni,3 → Si,4
i=1,2,3,4,5.
Si,4 → Ni,3 i=1,2,3,4,5.
¬Si,4 → ¬Ni,3 i=1,2,3,4,5.
¬Ni,3 → ¬Si,4
i=1,2,3,4,5.
Группа 2. Условия вида «дом, обладающий свойством А, находится слева
(справа) от дома, обладающего свойством В».
2.4) Условию « Зеленый дом стоит слева от белого» соответствуют формулы
Сi,1 →Ci-1,3
i= 2,3,4,5.
¬Ci-1,3→ ¬Сi,1
i= 2,3,4,5.
Сi,3 →Ci+1,1
i= 1,2,3,4.
¬Ci+1,1→ ¬Сi,3
i= 1,2,3,4.
¬С1,1
¬C5,3
Группа 3. Условия вида «дом, обладающий свойством А, находится рядом с
домом, обладающим свойством В».
2.10) Условию «Курильщик Marlboro живет около того, кто держит кошку»
Si,2 & ¬Ai-1,1 → Ai+1,1 i=2,3,4.
Si,2 & ¬Ai+1,1 → Ai-1,1 i=2,3,4.
¬Ai-1,1& ¬Ai+1,1 → ¬Si,2 i=2,3,4.
S1,2 → A 2,1
¬A 2,1 → ¬S1,2
S5,2 → A 4,1
¬A 4,1→ ¬S5,2
Ai,1 & ¬Si-1,2 → Si+1,2 i=2,3,4.
Ai,1 & ¬Si+1,2 → Si-1,2 i=2,3,4.
¬Si-1,2& ¬Si+1,2 → ¬Ai,1 i=2,3,4.
A1,1 → S 2,2
¬S 2,2 → ¬A1,1
A5,1 → S 4,2
¬S 4,2 → ¬A5,1
2.11) Условию «Человек, который содержит лошадь, живет около того, кто
курит Dunhill» соответствуют формулы
Si,1 & ¬Ai-1,2 → Ai+1,2 i=2,3,4.
Si,1 & ¬Ai+1,2 → Ai-1,2 i=2,3,4.
¬Ai-1,2 & ¬Ai+1,2 → ¬Si,1 i=2,3,4.
S1,1 → A 2,2
¬A 2,2 → ¬S1,1
S5,1 → A 4,2
¬A 4,2 → ¬S5,1
Ai,2 & ¬Si-1,1 → Si+1,1 i=2,3,4.
Ai,2 & ¬Si+1,1 → Si-1,1 i=2,3,4.
¬Si-1,1 & ¬Si+1,1 → ¬Ai,2 i=2,3,4.
A1,2 → S 2,1
¬S 2,1 → ¬A1,2
A5,2 → S 4,1
¬S 4,1 → ¬A5,2
2.13) Условию «Норвежец живет около синего дома» соответствуют
формулы
Ni,4 & ¬Ci-1,5 → Ci+1,5 i=2,3,4.
Ni,4 & ¬Ci+1,5 → Ci-1,5 i=2,3,4.
¬Ci-1,5 & ¬Ci+1,5 → ¬Ni,4 i=2,3,4.
N1,4 → C 2,5
¬C 2,5 → ¬N1,4
N5,4 → C 4,5
¬C 4,5 → ¬N5,4
Ci,5 & ¬Ni-1,4 → Ni+1,4 i=2,3,4.
Ci,5 & ¬Ni+1,4 → Ni-1,4 i=2,3,4.
¬Ni-1,4 & ¬Ni+1,4 → ¬Ci,5 i=2,3,4.
C1,5 → N 2,4
¬N 2,4 → ¬C1,5
C5,5 → N 4,4
¬N 4,4 → ¬C5,5
2.15) Условию «Курильщик Marlboro живет по соседству с человеком,
который пьет воду» соответствуют формулы
Si,2 & ¬Di-1,1 → Di+1,1 i=2,3,4.
Si,2 & ¬Di+1,1 → Di-1,1 i=2,3,4.
¬Di-1,1 & ¬Di+1,1 → ¬Si,2 i=2,3,4.
S1,2 → D2,1
¬D2,1 → ¬S1,2
S5,2 → D4,1
¬D4,1 → ¬S5,2
Di,1 & ¬Si-1,2 → Si+1,2 i=2,3,4.
Di,1 & ¬Si+1,2 → Si-1,2 i=2,3,4.
¬Si-1,2 & ¬Si+1,2 → ¬Di,1 i=2,3,4.
D1,1
¬S2,2
D5,1
¬S4,2
→ S2,2
→ ¬D1,1
→ S4,2
→ ¬D5,1
Группа 4. Условия вида «конкретный дом обладает свойством А».
2.7) Условию «Жилец среднего дома пьет молоко» соответствует формула
D3,3
2.9) Условию «Норвежец живет в первом доме» соответствует формула
N1,4
3). Формулы, описывающие полноту и противоречивость решения.
3.1) Формулы, описывающие полноту решения.
Ni,j → PNi для всех i,j = 1,…,5
Ci,j
Di,j
Si,j
Ai,j
→ PCi
→ PDi
→ PSi
→ PAi
для всех i,j = 1,…,5
для всех i,j = 1,…,5
для всех i,j = 1,…,5
для всех i,j = 1,…,5
PN1 & PN2 & PN3 & PN4 & PN5 & PC1 & PC2 & PC3 & PC4 & PC5 &
PD1 & PD2 & PD3 & PD4 & PD5 & PS1 & PS2 & PS3 & PS4 & PS5 &
PA1 & PA2 & PA3 & PA4 & PA5 → P
3.2) Формулы, описывающие противоречивость решения.
Ni,j & ¬Ni,j → F для всех i,j = 1,…,5
Ci,j & ¬Ci,j → F для всех i,j = 1,…,5
Di,j & ¬Di,j → F для всех i,j = 1,…,5
Si,j & ¬Si,j → F для всех i,j = 1,…,5
Ai,j & ¬Ai,j → F для всех i,j = 1,…,5
Вычислительная модель M нами построена.
Легко видеть, что в нашей вычислительной модели используются 277
переменных V={ Ni,j , Ci,j , Si,j , Di,j , Ai,j, ¬Ni,j , ¬Ci,j , ¬Si,j , ¬Di,j , ¬Ai,j ,
PNi , PCi , PDi , PSi , PАi , P, F}, где i,j = 1,…,5, и несколько сот
квазихорновских формул.
Задача Z на этой модели состоит в определении истинности формулы
P. При этом нас интересую не все решения этой задачи, а только те, в
которых переменная F не выводима. Такие решения будем называть
непротиворечивыми решениями.
Заметим, что если мы найдем непротиворечивое решение задачи Z на
построенной квазихорновской модели, и то мы найдем и искомое
содержательное решение задачи Эйнштейна.
Покажем сейчас, как описанный выше линейный алгоритм решения
задачи Z на построенной модели найдет интересующее нас решение задачи
Эйнштейна. Для удобства разделим работу алгоритма на несколько шагов. В
конце каждого шага будем приводить частичное решение в «человеческом»
виде.
Ниже выражение {x1,…,xn}:=1 означает, что каждой переменной хi
присваивается значение 1.
Шаг 1.
Из формулы 2.9 {N1,4 }:= 1 – норвежец живет в первом доме.
формул 2.13 следует, что { С2,5 }:=1, т.е. второй дом синий, а,
следовательно, из формул вида 1
{ ¬C1,5 , ¬С3,5 , ¬С4,5, ¬С5,5}:=1 и { ¬C2,1 , ¬С2,2 , ¬С2,3, ¬С2,5}:=1
Из формул 2.4 следует {¬C1,1 , ¬С1,3 }:=1.
Из
Из формул 2.1 следует { ¬С1,4 }:=1.
Таким образом, все переменные из {¬C1,1 , ¬С1,3 , ¬С1,4, ¬С1,5} принимают
значение1.
Тогда отсюда и из формул вида 1 следует, что { С1,2 }=1, т.е. первый дом
жёлтый.
Следовательно, по формулам 2.8. { S 1,1 } :=1, т.е. в первом доме курят
«Данхил», а по формулам 2.11 { A2,2 }:=1 , т.е. во втором доме держат
лошадь.
Теперь из формул 2.3. { ¬D1,5 }:=1, из формул 2.5 { ¬D1,2 }:=1, из формул 2.7.
{ ¬D1,3 }:=1 и из формул 2.12 { ¬D1,4 }:=1.
Отсюда из формул вида 1 { D1,1 }:=1, т.е. живущий в 1-ом доме норвежец
пьет воду.
Из формул 2.15 следует, что { S2,2 }:=1, т.е. человек, живущий во втором,
синем, доме, курит «Мальборо».
Полученные
значения
переменных
можно
свести
в
таблицу:
ДОМ
1
2
3
45
ЦВЕТ
желтый синий
НАЦИОНАЛЬНОСТЬ норвежец
НАПИТОК
вода
молоко
СИГАРЕТЫ
данхил
мальборо
ЖИВОТНОЕ
лошадь
Шаг 2.
Из формулы вида 2.9. и формул вида 1 следует { ¬N2,4 }:=1.
Из формул 2.1 { ¬N2,1 }:=1.
Из формул 2.2. { ¬N2,5 }:=1
Из формул 2.14 { ¬N2,3 }:=1
Тогда из формул вида 1{ N2,2 }:=1, т.е. во втором доме живёт датчанин,
а из формул 2.3 { D2,5 }:=1, т.е. он пьет чай.
ДОМ
1
2
3
45
ЦВЕТ
желтый синий
НАЦИОНАЛЬНОСТЬ норвежец датчанин
НАПИТОК
вода
чай
молоко
СИГАРЕТЫ
данхил
ЖИВОТНОЕ
лошадь
Шаг 3.
Из формул 2.5. получаем { ¬C3,3 }:=1
Из формул 2.4 { ¬C5,3 }:=1
Ранее на шаге 1 нами было установлено { ¬C1,3, ¬C2,3 }:=1
Следовательно, по формулам вида 1 { C4,3 }:=1, т.е. зеленый дом —
четвёртый.
Отсюда по формулам 2.4 { C5,1 }:=1, т.е. белый дом – пятый.
Т.о. мы получили, что все переменные из { C1,2, C2,5, C4,3, C5,1 } =1.
Отсюда по формулам вида 1 следует, что { ¬C3,2, ¬C3,5, ¬C3,3, ¬C3,1 }:=1, и
что { C3,4} :=1, т.е. третий дом – красный.
По формулам 2.1 получаем, что { N3,1}, т.е. в третьем доме живет
англичанин.
По формулам 2.5 получим, что { D4,2}:=1, т.е. в четвертом доме пьют кофе.
Таким образом, все переменные из {D1,1, D2,5, D3,3, D4,2 } =1.
Отсюда по формулам вида 1 следует, что {¬D5,1, ¬D5,5, ¬D5,3, ¬D5,2}:=1, и
что {D5,4} :=1, т.е. в пятом доме пьют пиво.
Из формул 2.12 следует, что { S5,5}:=1, т.е. в пятом доме курят «Винфилд».
ДОМ
1
2
3
4
5
ЦВЕТ
желтый синий
красный
зеленый белый
НАЦИОНАЛЬНОСТЬ норвежец датчанин англичанин
НАПИТОК
вода
чай
молоко
кофе
пиво
СИГАРЕТЫ
данхил мальборо
винфилд
ЖИВОТНОЕ
лошадь
Шаг 4.
Из { S5,5}=1 по формулам вида 1 следует, что { ¬S5,3}:=1.
Тогда из формул 2.14 следует, что { ¬N5,3}:=1.
Тогда из формул вида 1 следует сначала {¬N1,3, ¬N2,3, ¬N3,3, ¬N5,3}:=1,
а затем { N4,3}:=1, т.е. в четвертом доме живет немец.
По формулам 2.14 получаем { S4,4}:=1, т.е. в четвертом доме курят Ротманс.
Тогда из формул вида 1 следует сначала {¬S1,3, ¬S2,3, ¬S4,3, ¬S5,3}:=1,
а затем { S3,3}:=1, т.е. Пал Мал курят в третьем доме.
Из формул 2.6 следует, что { A3,3}:=1, т.е. в третьем доме разводят птицу.
ДОМ
1
2
3
4
5
ЦВЕТ
желтый синий
красный
зеленый белый
НАЦИОНАЛЬНОСТЬ норвежец датчанин англичанин немец
НАПИТОК
вода
чай
молоко
кофе
пиво
СИГАРЕТЫ
данхел мальборо пал мал
ротманс винфилд
ЖИВОТНОЕ
лошадь птицы
Шаг 5.
Из формул вида 1 следует сначала {¬N1,5, ¬N2,5, ¬N3,5, ¬N4,5}:=1,
а затем { N5,5}:=1, т.е. в пятом доме живет швед.
Из формул вида 2.2 следует, что { A5,4}:=1, т.е. в пятом доме живет собака.
Из формул вида 1 получаем { ¬A3,1}:=1, а затем по формулам 2.10 { A1,1}:=1,
а значит, кошка живет в первом доме.
Из формул вида 1 следует сначала {¬A1,5, ¬A2,5, ¬A3,5, ¬A5,5}:=1,
а затем { A4,5}:=1, т.е. рыбок разводят в четвертом доме, в котором живет
немец.
Отсюда из формул вида 3.1 следует {PN1,…,PN5, PC1,…,PC5, PD1,…,PD5,
PS1,…,PS5, PA1,…,PA5}:=1 и {P}:=1.
Полное решение задачи:
ДОМ
1
2
3
4
5
ЦВЕТ
желтый синий
красный
зеленый белый
НАЦИОНАЛЬНОСТЬ норвежец датчанин англичанин немец швед
НАПИТОК
СИГАРЕТЫ
ЖИВОТНОЕ
вода
данхил
кошка
чай
молоко
мальборо пал мал
лошадь птицы
кофе
пиво
ротманс винфилд
рыбка собака
Построенное решение задачи – непротиворечиво, т.к. ни одна
переменная не выводится вместе со своим отрицанием.
Замечание (о масштабируемости). Мы столь подробно разобрали эту
задачу, чтобы подчеркнуть две особенности построения хорновских и
квазихорновских вычислительных моделей. Во-первых, отношения
вычислимости в этих моделях, как правило, соответствуют определенным
содержательным зависимостям между элементами исходной задачи, и,
вследствие этого, решение, построенное на хорновской или квазихорновской
модели, легко может быть объяснено в содержательных терминах. Эта
особенность очень важна при разработке программных систем, обладающих
возможностями объяснения найденных решений. Во-вторых, очевидно, что
описанный механизм построения булевской вычислительной модели легко
масштабируется, т.е. мы совершенно аналогично можем построить
вычислительную модель, если у нас будет иметься k объектов, обладающих k
различными свойствами, и на которые наложены ограничения в виде условий
описанных выше типов.
3.3.2. Судоку
Судоку – известная логическая игра, состоящее в правильном заполнении
таблицы размером 9х9, клетки которой разбиты еще на 9 блоков.
5
8
2
7
6
6
4
2 1
1
8
9
7
8
4
5
3
9
2
9 1
6
1
2
8
8
7
7
5
При заполнении таблицы должны соблюдаться следующие правила:
1. В каждой ячейке должно находится одно из чисел {1,…,9}.
2. В каждой строке таблицы все числа должны быть разные.
3. В каждом столбце таблицы все числа должны быть разные.
4. В каждом блоке таблицы все числа должны быть разные.
Обычно содержимое определенного количества ячеек задается.
Решение головоломки – правильное заполнение всех оставшихся ячеек.
Могут возникнуть следующие ситуации:
1) решения не существует, т.е. начальная разметка не может быть
расширена до полной разметки правильным образом;
2) существует несколько правильных расширений начальной разметки
до полной правильной разметки;
3) существует единственное правильное полное расширение начальной
разметки.
Первые два случая обычно не рассматриваются, и соответствующие
начальные разметки считаются некорректными.
Т.е. типовым случаем считается третий, когда человек, решающий
судоку, предполагает, что решение существует и оно единственное.
Вычислительная модель M1.
Построим сначала самую простую вычислительную модель M1 для
решения задач судоку.
Введем булевы переменные C<i,j,k>, которые соответствуют
истинности высказывания «в ячейке, расположенной в i-той строке и в j-том
столбце, находится число k» для всех i,j,k=1,…,9. Добавим к ним следующие
вспомогательные переменные PC<i,j>, i,j,k=1,…,9,
смысл которых
соответствует высказыванию «значение числа в ячейке, расположенной в iтой строке и в j-том столбце, определено», а также две переменные P и F.
P означает, что «определены числа, находящиеся в каждой ячейке», т.е.
задача решена полностью, а F означает, что в решении задачи есть
противоречие.
Формулы модели M1 разобьем на три группы.
1) Формулы, описывающие правильное заполнение доски судоку.
1.1) U1( C<i,j,1>,…C<i,j,9>) для всех
i,j=1,…,9. Эта группа формул
утверждает, что в каждой ячейке находится ровно одно из чисел 1,…,9.
1.2) U1( C<i,1,k>,…C<i,9,k>) для всех
i,k=1,…,9. Эта группа формул
утверждает, что в каждой строке каждое из чисел встречается ровно один раз.
1.3) U1( C<1,j,k>,…C<9,j,k>) для всех
j,k=1,…,9. Эта группа формул
утверждает, что в каждом столбце каждое из чисел встречается ровно один
раз.
1.4) Для каждого блока записывается формула, утверждающая, что в каждую
ячейку этого блока каждое из чисел входит ровно один раз.
Выпишем формулы для двух первых блоков:
U1( C<1,1,k>, C<1,2,k>,C<1,3,k>, C<2,1,k>,C<2,2,k>, C<2,3,k>,C<3,1,k>,
C<3,2,k>,C<3,3,k>) для всех k=1,…,9.
U1( C<1,4,k>, C<1,5,k>,C<1,6,k>, C<2,4,k>,C<2,5,k>, C<2,6,k>,C<3,4,k>,
C<3,5,k>,C<3,6,k>) для всех k=1,…,9, и т.д.
2) Формулы, описывающие начальную разметку.
Если в начальной разметке в ячейке, расположенной в i-той строке и в j-том
столбце, находится число k, то добавляем в модель элементарную формулу
C<i,j,k>.
3) Формулы, описывающие полноту и возможную противоречивость
решения.
3.1) Формулы, описывающие полноту решения:
C<i,j,k> → PC<i,j> для всех i,j,k = 1,…,9
PC<1,1>&…&PC<1,9>&PC<2,1>&…&PC<2,9> &
PC<9,1>&…& PC<9,9> → P
3.2) Формулы, описывающие противоречивость решения:
C<i,j,k> & ¬ C<i,j,k> → F для всех i,j,k = 1,…,9
Вычислительная модель M1 нами построена.
Задача Z на этой модели состоит в определении истинности формулы
P.
Причем нас опять интересует только непротиворечивое решение
задачи, при котором переменная F не выводима.
Очевидно, что по непротиворечивому решению задачи Z на
построенной модели M1 легко построить содержательное решение исходной
задачи судоку.
Замечание. Модель М1 по существу моделирует решение задачи судоку с
помощью нескольких простых стратегий, известных под названиями
«последний герой», «выбора нет», «кто, если не я». Естественно, что не все
задачи судоку могут быть решены с использованием только этих стратегий.
Вычислительная модель M2.
Рассмотрим фрагмент доски судоку.
8
4
2 6
1
3
5
4 9
?
8
1
7
Можно заметить, что на вычислительной модели M1, где используются
только переменные C<i,j,k>, вычислить заполнение пустых клеток этого
фрагмента невозможно. Но использование «пар переменных», или, как
говорят,
дуплетов
позволяет
вычислить
значение
переменных,
соответствующих ячейке помеченной «?». Действительно, про дуплет,
соответствующий ячейкам, помеченным a,b можно сказать, что его значение
равно 2, а отсюда легко выводится, что значение переменных,
соответствующих ячейке, помеченной «?», определяется и соответствует
значению 2.
8
1
4
2 6
a
5
3
b
4 9
?
8
1
7
Обозначение. Пусть {F1,…,Fm} некоторое множество булевых формул.
Ниже через &({F1,…,Fm}) будем обозначать формулу F1&…&Fm .
Обозначим через U2(x1,…,xn) следующий набор формул над переменными
{x1,…,xn, ¬x1,…,¬xn , Y12,…, Yij,…,Y(n-2)n, Y(n-1)n} , где i,j=1,..n, i<j :
¬x2&…&¬xn → x1,
¬x1&…&¬xi-1&¬xi+1&…&¬xn → xi , для всех i =2,…,n-1
¬x1&…&¬xn-1 → xn,
xi →¬xj , для всех i,j=1,…,n, i≠j,
& ( {¬x1,…,¬xn } \ {¬xi,¬xj }) → Yij, для всех i,j =1,…,n, i<j
Yij →¬xr, для всех i,j,r =1,…,n, i<j, r≠i, r≠j.
Переменную Yij будем называть дуплетом переменных xi и xj. Ее
содержательный смысл следующий: одна и только одна их переменных xi и
xj принимает значение 1.
Легко подсчитать, что в этом наборе n+n(n-1)+n(n-1)/2 + (n-2)*n(n-1)/2
формул, общая длина которых O(n3).
Формулы модели M2 разобьем на три группы.
1) Формулы, описывающие правильное заполнение доски судоку.
1.1) U2( C<i,j,1>,…C<i,j,9>) для всех
i,j=1,…,9. Эта группа формул
утверждает, что в каждой ячейке находится ровно одно из чисел 1,…,9.
1.2) U2( C<i,1,k>,…C<i,9,k>) для всех
i,k=1,…,9. Эта группа формул
утверждает, что в каждой строке каждое из чисел встречается ровно один раз.
1.3) U2( C<1,j,k>,…C<9,j,k>) для всех
j,k=1,…,9. Эта группа формул
утверждает, что в каждом столбце каждое из чисел встречается ровно один
раз.
1.4) Для каждого блока записывается формула, утверждающая, что в каждую
ячейку этого блока каждое из чисел входит ровно один раз.
Выпишем формулы для двух первых блоков:
U2( C<1,1,k>, C<1,2,k>,C<1,3,k>, C<2,1,k>,C<2,2,k>, C<2,3,k>,C<3,1,k>,
C<3,2,k>,C<3,3,k>) для всех k=1,…,9.
U2( C<1,4,k>, C<1,5,k>,C<1,6,k>, C<2,4,k>,C<2,5,k>, C<2,6,k>,C<3,4,k>,
C<3,5,k>,C<3,6,k>) для всех k=1,…,9, и т.д.
Примечание. Дуплет любой пары переменных xi и xj во всех вхождениях в
формулы вида 1.1-1.4 обозначается одной и той же переменной Yij.
2) Формулы, описывающие начальную разметку.
Если в начальной разметке в ячейке, расположенной в i-той строке и в j-том
столбце, находится число k, то добавляем в модель элементарную формулу
C<i,j,k>.
3) Формулы, описывающие полноту и возможную противоречивость
решения.
3.1) Формулы, описывающие полноту решения:
C<i,j,k> → PC<i,j> для всех i,j,k = 1,…,9
PC<1,1>&…&PC<1,9>&PC<2,1>&…&PC<2,9> &
PC<9,1>&…& PC<9,9> → P
3.2) Формулы, описывающие противоречивость решения:
C<i,j,k> & ¬ C<i,j,k> → F для всех i,j,k = 1,…,9
Вычислительная модель M2 нами построена.
Задача Z на этой модели состоит в определении истинности формулы
P. Нас будут интересовать только непротиворечивые решения, в которых не
выводится переменная F.
Очевидно, что по любому непротиворечивому решению задачи Z, мы
построим содержательное решение исходной задачи судоку.
Замечание. Модель М2 является расширением модели М1 и по существу
моделирует решение задачи судоку с помощью простых стратегий,
соответствующих модели М1, и нескольких более продвинутых, известных
под названиями «голая пара», «скрытая пара». Можно показать, что не все
задачи судоку могут быть решены с использованием только этих стратегий.
Вычислительная модель M3.
Рассмотрим фрагмент доски судоку.
9
4
3
7 1
8
9
4
2
?
6
3
3
7
Можно заметить, что на вычислительных моделях M1 и M2, где
используются только переменные и дубли переменных, вычислить
заполнение пустых клеток этого фрагмента невозможно. Но использование
«троек переменных», которые называются триплетами переменных,
позволяет вычислить значение переменных, соответствующих ячейке
помеченной «?». Действительно, про триплет переменных, соответствующих
9
4
3
7 1
a
b
c
8
9
4
2
?
6
3
3
7
ячейкам, помеченным a,b,c, можно сказать, что его значение равно 2, а
отсюда легко выводится, что значение переменных, соответствующих
ячейке, помеченной «?», определяется и соответствует значению 2.
Обозначим через U3(x1,…,xn) хорновскую вычислительную модель с
переменными {x1,…,xn, ¬x1,…,¬xn , Y12,…, Yij,…,Y(n-2)n, Y(n-1)n, Z123, Z124,…,
Zijr,…,Z(n-3) (n-2)n, Z(n-2)(n-1)n} , где 1<=i<j<r<=n,
и следующим набором
формул:
¬x2&…&¬xn → x1,
¬x1&…&¬xi-1&¬xi+1&…&¬xn → xi , для всех i =2,…,n-1
¬x1&…&¬xn-1 → xn,
xi →¬xj , для всех i,j=1,…,n, i≠j,
& ( {¬x1,…,¬xn } \ {¬xi,¬xj }) → Yij, для всех i,j =1,…,n, i<j
Yij →¬xr, для всех i,j,r =1,…,n, i<j, r≠i, r≠j,
& ( {¬x1,…,¬xn } \ {¬xi,¬xj,¬xr }) → Zijr, для всех i,j,r =1,…,n, i<j<r
Zijr →¬xs,
для всех i,j,r,s =1,…,n, i<j<r, s≠i, s≠j, s≠r.
Переменную Zijr будем называть триплетом переменных xi , xj и xr . Ее
содержательный смысл следующий: одна и только одна их переменных xi , xj
и xr принимает значение 1.
Легко подсчитать, что в этом наборе O(n3) формул, общая длина которых
O(n4).
Аналогично предыдущим моделям формулы модели M3 разобьем на три
группы.
1) Формулы, описывающие правильное заполнение доски судоку.
1.1) U3( C<i,j,1>,…C<i,j,9>) для всех
i,j=1,…,9. Эта группа формул
утверждает, что в каждой ячейке находится ровно одно из чисел 1,…,9.
1.2) U3( C<i,1,k>,…C<i,9,k>) для всех
i,k=1,…,9. Эта группа формул
утверждает, что в каждой строке каждое из чисел встречается ровно один раз.
1.3) U3( C<1,j,k>,…C<9,j,k>) для всех
j,k=1,…,9. Эта группа формул
утверждает, что в каждом столбце каждое из чисел встречается ровно один
раз.
1.4) Для каждого блока записывается формула, утверждающая, что в каждую
ячейку этого блока каждое из чисел входит ровно один раз.
Выпишем формулы для двух первых блоков:
U3( C<1,1,k>, C<1,2,k>,C<1,3,k>, C<2,1,k>,C<2,2,k>, C<2,3,k>,C<3,1,k>,
C<3,2,k>,C<3,3,k>) для всех k=1,…,9.
U3( C<1,4,k>, C<1,5,k>,C<1,6,k>, C<2,4,k>,C<2,5,k>, C<2,6,k>,C<3,4,k>,
C<3,5,k>,C<3,6,k>) для всех k=1,…,9, и т.д.
Примечание. Дуплет любой пары переменных xi и xj во всех вхождениях в
формулы вида 1.1-1.4 обозначается одной и той же переменной Yij. Триплет
любой тройки переменных xi , xj и xr во всех вхождениях в формулы вида
1.1-1.4 обозначается одной и той же переменной Zijr .
2) Формулы, описывающие начальную разметку.
Если в начальной разметке в ячейке, расположенной в i-той строке и в j-том
столбце, находится число k, то добавляем в модель элементарную формулу
C<i,j,k>.
3) Формулы, описывающие полноту и возможную противоречивость
решения.
3.1) Формулы, описывающие полноту решения:
C<i,j,k> → PC<i,j> для всех i,j,k = 1,…,9
PC<1,1>&…&PC<1,9>&PC<2,1>&…&PC<2,9> &
PC<9,1>&…& PC<9,9> → P
3.2) Формулы, описывающие противоречивость решения:
C<i,j,k> & ¬ C<i,j,k> → F для всех i,j,k = 1,…,9
Вычислительная модель M3 нами построена.
Задача Z на этой модели состоит в определении истинности формулы
P. Нас будут интересовать только непротиворечивые решения, в которых не
выводится переменная F.
Очевидно, что по любому непротиворечивому решению задачи Z на
модели M3, мы построим содержательное решение исходной задачи судоку.
Замечание. Модель М3 является расширением моделей М1 и M2 и по
существу моделирует решение задачи судоку с помощью простых стратегий,
соответствующих модели М1, и нескольких более продвинутых,
соответствующих модели М2,
и нескольких продвинутых стратегий,
известных под названиями «голые тройки», «скрытые тройки»,
«нерезиновые» и т.п. Известно, что в общем случае (N строк, N столбцов, N
блоков, N чисел для размещения) задача судоку является NP-трудной (этот
класс комбинаторных задач точно будет определен позже). Поэтому
естественно, что не все задачи судоку могут быть решены с использованием
упомянутых выше стратегий. Но вполне правдоподобно, что каждую хорошо
сформулированную стратегию решений судоку можно формализовать в
виде определенного набора хорновских формул.
3.4. Хорновские вычислительные модели арифметических
операций
3.4.1. Сложение чисел в двоичной системе счисления
Пусть нам заданы два натуральных числа, записанные в двоичной системе
счисления, первое слагаемое x1 x2 ... xn-1 xn , где каждое xi ϵ {0,1}и второе
слагаемое y1 y2 … yn-1 yn , где каждое yi ϵ {0,1}. Необходимо найти число
равное их сумме, записанное также в двоичной системе счисления. В общем
случае это число будет иметь вид z0z1z2…zn-1 zn , где каждое zi ϵ {0,1}. Для
хранения
единиц
переполнения
разрядов
будем
использовать
арифметические переменные с0,с1,с2,…,cn, где каждое сi ϵ {0,1}.
Таким
образом, множество переменных V нашей вычислительной модели составят
булевы переменные
{x1, х2, ... , хn-1, хn, y1, y2, … , yn-1,с0, с1, с2,…, cn, z0, z1, z2, … , zn-1, zn}.
Значение булевых переменных следущее.
Булева переменная xi ( соответственно yi, сi, zi) принимает значение истина,
если значение арифметической двоичной переменной xi (соответственно yi,
сi, zi) может быть вычислено.
Хорошо известен алгоритм сложения столбиком
x1 х2 … хn-1xn
+
y1 y2 … yn-1 yn
_____________________
z0 z1 z2 … zn-1 zn
с0 с1 с2 … сn-1 сn
Отсюда множество содержательных отношений между арифметическими
двоичными переменными будут следующими:
(R1) cn=0
(R2) zi = (xi+yi+ci)mod2 , i=1,…,n
(R3) ci-1 = 1, если xi+yi+ci >= 2 и
ci-1 = 0, если xi+yi+ci < 2
, i=1,…,n
(R4) z0=c0
Здесь мы используем обычные арифметические операции - сложение и
остаток от деления на 2, и обычные отношения сравнения между
натуральными числами.
Хорновская формула, соответствующая соотношению R1: cn.
Хорновские формулы, соответствующие соотношениям R2:
xi&yi&ci → zi ; zi&yi&ci → xi; xi&zi&ci → yi; xi&yi&zi → ci , i=1,…,n.
Хорновские формулы, соответствующие соотношениям R3:
xi&yi&ci → ci-1 ; ci-1 &yi&ci → xi; xi& ci-1 &ci → yi; xi&yi& ci-1 → ci , i=1,…,n.
Хорновские формулы, соответствующие соотношению R4: z0→c0; c0→z0.
Назовем построенную вычислительную модель
ADD2(x1, х2, ... , хn-1, хn, y1, y2, … , yn-1,с0, с1, с2,…, cn, z0, z1, z2, … , zn-1, zn).
Замечание. Аналогично можно построить вычислительную модель для
сложения чисел в десятичной системе. В этой модели каждая переменная из
{x1, х2, ... , хn-1, хn, y1, y2, … , yn-1,с0, с1, с2,…, cn, z0, z1, z2, … , zn-1, zn} будет
принимать значения из множества {0,1,2,3,4,5,6,7,8,9}.
Множество содержательных отношений между переменными будут
следующими:
(R’1) cn=0
(R’2) zi = (xi+yi+ci)mod10 , i=1,…,n
(R’3) ci-1 = 1, если xi+yi+ci >= 10 и
ci-1 = 0, если xi+yi+ci < 10
, i=1,…,n
(R’4) z0=c0
А множество хорновских формул будет точно таким же, как и в модели
ADD2.
3.4.2. Умножение чисел в двоичной системе счисления
Пусть нам заданы два натуральных числа, записанные в двоичной системе
счисления, первый сомножитель x1 х2 ... хn-1 хn и второй сомножитель
y1 y2 … yn-1 yn. Необходимо найти число равное их произведению,
записанное также в двоичной системе счисления. В общем случае это число
будет иметь вид z0 z1 … zn+(n-2) zn+(n-1) .
Легко заметить, что эта задача умножения сводится к сложению
следующих n чисел, записанных в двоичной системе счисления.
m1= (x1*yn) (х2*yn) ... (хn-1*yn)(хn*yn)
m2= (x1*yn-1) (х2*yn-1) ... (хn-1*yn-1)(хn*yn-1) 0
m3= (x1*yn-2) (х2*yn-2) ... (хn-1*yn-2)(хn*yn-2) 00
mi= (x1*yn-i+1) (х2*yn-i+1) ... (хn-1*yn-i+1)(хn*yn-i+1) 0i-1 , т.е.
число mi состоит из n+i-1 разрядов и оканчивается (i-1) нулями.
mn = (x1*y1) (х2*y1) ... (хn-1*y1)(хn*y1) 0n-1 .
В качестве булевых переменных модели выберем следующие:
mij – значение j-того разряда числа mi может быть вычислено, здесь i=1,…,n,
j=1,…,n+(i-1);
sij - значение j-того разряда i-той промежуточной суммы может быть
вычислено, здесь i=0,…,n, j=0,…,n+(i-1);
cij - значение j-того разряда i-того промежуточного вектора переполнения
разрядов может быть вычислено, здесь i=0,…,n, j=0,…,n+(i-1);
xi – значение i-того разряда первого сомножителя может быть вычислено,
здесь i=1,…,n;
yi – значение i-того разряда второго сомножителя может быть вычислено,
здесь i=1,…,n;
zi – значение i-того разряда произведения может быть вычислено, здесь
i=0,…,n+(n-1);
Модель построим как объединение моделей
ADD2(si-10, si-11, ... , , si-1n+i-2, mi1, mi2, … , min+(i-1),сi0, сi1, сi2,…, cin+(i-1), si0, si1, si2,
… , sin-1, sin+(i-1)) для всех i=1,…,n.
Добавим к полученной модели следующие хорновские отношения
вычислимости:
1) s0i – все компоненты нулевой промежуточной суммы известны (и равны
0), i=0,1,…,n-1.
2) sni → zi ; zi →sni , i=0,1,…,n+(n-1) , т.е. компоненты n-ой промежуточной
суммы совпадают с компонентами произведения.
3) x1&yn-i+1 → mi1; x2&yn-i+1 → mi2; xn&yn-i+1 → min; mij ,j=n+1,…,n+(i-1). Эти
отношения определяют значения компонент чисел mi через компоненты
сомножителей, i=1,…,n.
Назовем построенную модель MULT2.
Литература к разделу 3.
1. Тыугу Э.Х. Концептуальное программирование. «Наука». Москва. 1984.
256 с.
2. Стюарт Рассел, Питер Норвиг. Искусственный интеллект: современный
подход. 2-ое издание. ISBN 5-8459-0887-6. Издательство "Вильямс". 2006.
1424 с.
3. http://habrahabr.ru/post/173795/ - электронный ресурс о судоку.
Глава 4. SAT-подход к решению комбинаторных задач
4.1. Краткие сведения об алгоритме DPLL
Этот алгоритм часто называют алгоритмом Дэвиса-Патнем в честь авторов
оригинальной статьи, в которой он был опубликован, Мартина Дэвиса и
Хилари Патнем. Затем он фактически стал одной из версий алгоритмов,
описанных Дэвисом, Логеманом и Лавлендом, поэтому он обычно
называется DPLL по первым буквам фамилий всех четырех авторов.
Алгоритм DPLL принимает на входе некоторую формулу в
конъюнктивной нормальной форме, представленную как множество
дизъюнктов. На выходе он выдает набор значений переменных, при котором
исходная формула выполнима, если такой набор существует, и «нет», если
таких наборов нет.
Произвольный набор значений переменных, входящих в исходную
формулу будем называть моделью. Модель может быть полной (если в нее
входят все переменные рассматриваемой формулы) и частичной.
Алгоритм DPLL на семантическом дереве производит поиск
выполняющей
модели данной КНФ.
Фактически он осуществляет
рекурсивный перебор в глубину всех возможных моделей с возвратом в
последнюю точку ветвления в случае неудачи. При этом в DPLL
реализованы три описанных ниже усовершенствования.
1. Раннее завершение. Алгоритм на каждом этапе поиска пытается
определить, является ли данная КНФ истинной или ложной, уже на
построенной частичной модели. Элементарный дизъюнкт является
истинным, если истинен любой его литерал, даже при том, что для других
литералов еще не определены истинностные значения; поэтому об
истинности всей КНФ в целом можно судить еще до того, как модель будет
составлена полностью. Например, КНФ (AvB)&(AvC) является истинной,
если истинен литерал А, независимо от значений литералов В и С.
Аналогичным образом, КНФ является ложной, если ложен любой ее
элементарный дизъюнкт, а это происходит, если каждый литерал какого-то
дизъюнкта является ложным. Опять-таки, такая ситуация может возникнуть
задолго до того, как модель будет полностью составлена. Раннее завершение
позволяет обойтись без исследования целых поддеревьев в пространстве
поиска.
2. Эвристика чистого символа. Чистым символом называется символ,
который всегда появляется с одним и тем же "знаком" во всех дизъюнктах.
Например, в трех дизъюнктах (Av¬B), (¬Bv¬C), (CvA) символ А является
чистым, поскольку он появляется только в виде положительных литералов;
чистым можно также считать символ B, который появляется только в виде
отрицательных литералов, а символ С считается нечистым.
Можно легко показать, что если некоторая КНФ имеет выполняющую
модель и А – чистый символ, то имеется выполняющая модель, в которой
символу А присвоено значение true, если все его вхождения положительны и
присвоено значение false, если все его вхождения отрицательны. Следует
отметить, что при определении чистоты символа алгоритм может
игнорировать выражения, в отношении которых уже известно, что они
истинны в модели, составленной до сих пор. Например, если модель
содержит присваивание B= false, то дизъюнкт (¬Bv¬C) уже является
истинным, а символ С становится чистым, поскольку присутствует только в
дизъюнкте (CvA).
3. Эвристика единичного дизъюнкта. Единичный дизъюнкт это
дизъюнкт с одним литералом. В контексте алгоритма DPLL единичные
дизъюнкты возникают из дизъюнктов, в которых в построенной частичной
модели всем литералам, кроме одного, уже было присвоено значение false.
Например, если модель содержит присваивание B=false, то дизъюнкт
(Bv¬C) становится единичным дизъюнктом, поскольку становится
эквивалентным дизъюнкту ¬С. Очевидно, для того, чтобы этот дизъюнкт
принял истинное значение, литералу С должно быть присвоено значение
false. Эвристика единичного дизъюнкта предусматривает присваивание
значений всем входящим в них символам до того, как произойдет переход к
обработке оставшейся части КНФ. Следует отметить, что присваивание
значения одному единичному дизъюнкту может привести к созданию еще
одного единичного дизъюнкта; например, после присваивания символу С
значения false единичным становится дизъюнкт (CvA), что влечет за собой
присваивание истинного значения символу A=true. Такое "каскадное"
распространение
форсированных
присваиваний
называется
распространением единичных дизъюнктов. Оно напоминает процесс прямого
логического вывода (прямой волны) с применением хорновских формул. В
действительности, если рассматриваемая формула в конъюнктивной
нормальной форме содержит только хорновские выражения, то алгоритм
DPLL по сути сводится к алгоритму прямого логического вывода.
Архитектура современных эффективных SAT-решателей. SATрешателями называют программы, решающие проблему выполнимости
булевых формул. Здесь мы кратко опишем основные особенности
архитектуры наиболее эффективных SAT-решателей.
Подавляющее
большинство современных SAT-решателей, показывающих высокие
результаты на специализированных конкурсах, использует в качестве ядра
алгоритм DPLL.
В некоторых случаях в процессе поиска выполняющей модели могут
возникать (и возникают) так называемые конфликты. Конфликтом
называется ситуация, когда из угаданных на текущий момент значений
переменных для некоторой другой булевой переменной 𝑥 выводятся
одновременно 𝑥 = 0 и 𝑥 = 1. Если такое происходит, то вступает в действие
процедура разрешения конфликта.
Переменные, значения которых угадываются, называют переменными
уровней решений (decision level), уровни решений при этом нумеруются. На
самом деле иерархию уровней решений можно представить в виде бинарного
дерева, корнем которого служит первый уровень, помечаемый
соответствующей булевой переменной. Потомки корня соответствуют
переменным, значения которых угадываются или индуцируются на
последующих уровнях. Ветви, выходящие из произвольной вершины,
помечаются значениями соответствующей переменной. Листья дерева
помечаются как sat, либо как conflict. Путь из корня в лист, помеченный как
sat, определяет (совместно с индуцированными на данном пути
присвоениями) набор, выполняющий исходную КНФ. Путь из корня в лист,
помеченный как conflict, определяет последовательность угадываний, из
которой по правилу единичного дизъюнкта был выведен конфликт.
Несложно понять, что если КНФ выполнима, то для некоторой альтернативы,
исходящей из корня данного дерева, найдется путь в лист, помеченный как
sat. Если же КНФ невыполнима, то все пути из любой альтернативы корня
будут оканчиваться листьями, помеченными как conflict. Очевидно, что для
дерева поиска необходимо определить процедуры отсечения его
поддеревьев, в которых любой путь из корня оканчивается листом,
помеченным как conflict. Возможности нетривиальных отсечений приводят к
сокращению перебора. Первоначально в DPLL был принят элементарный
механизм разбора конфликтов — хронологический бэктрекинг. При
хронологическом бэктрекинге разрешение конфликта происходит за счет
изменения решения на последнем (перед конфликтом) уровне — значение
угаданной на этом уровне переменной меняется на противоположное. Позже
была сформулирована концепция нехронологического бэктрекинга (или
бэкджампинга), которая привела к созданию по-настоящему скоростных
SAT-решателей. Ключевой механизм бэкджампинга — процедура Clause
Learning (далее — CL-процедура), позволяющая запоминать информацию о
конфликтах. В общем случае использование CL-процедуры позволяет точно
выявлять присвоения, ответственные за конфликт, вследствие чего возможны
откаты не к последнему уровню принятого решения (как в хронологическом
бэктрекинге), а к более ранним (в иерархии угадываний) уровням. В этом и
состоит основной конструктивный момент нехронологического бэктрекинга
(бэкджампинг). Следует отметить, что использование CL-процедуры
приводит к росту объема памяти, задействуемой SAT-решателем. Помимо
перечисленных, важнейшими компонентами современных эффективных
SAT-решателей являются эвристики выбора переменных и специальные
структуры данных, позволяющие совершать возвраты, оперируя при этом
минимальным объемом информации. Эвристики выбора позволяют при
выборе очередной переменной уровня решения руководствоваться
некоторыми “разумными” предположениями. Первые эвристики выбора не
использовали информации о ходе поиска и получили название статических.
Позже были введены динамические эвристики, используемые в настоящее
время в большинстве эффективных SAT-решателей. Первая динамическая
эвристика выбора переменной на определенном уровне решения получила
название VSIDS (Variable State Independent Decaying Sum). Основная ее идея
заключается в присвоении переменным специальных индексов активности —
активность переменной тем выше, чем чаще данная переменная принимает
участие в конфликтах. Обычно динамические эвристики выбора переменных
применяются в сочетании с рестартами. Согласно данной концепции,
процесс поиска разбивается рестартами на фрагменты (этапы). После
каждого рестарта угадывание переменных уровней решения происходит в
соответствии с построенной на предыдущих этапах поиска таблицей
активности переменных (таблица активности в каждом фрагменте поиска
модифицируется). Описанный подход позволяет сохранять и эффективно
использовать предысторию поиска. Были также разработаны так называемые
быстрые структуры данных, предназначенные для эффективной реализации
стратегии распространения булевых ограничений и организации возвратов с
наименьшими вычислительными затратами. Можно увидеть, что после
включения всех описанных выше усовершенствований алгоритм DPLL,
несмотря на свой почтенный возраст, становится одним из самых быстрых
алгоритмов проверки выполнимости, которые когда-либо были разработаны.
В частности, реализация zchaff этого алгоритма используется для решения
задач проверки качества аппаратного обеспечения с миллионом переменных.
Проблематика построения эффективных программных SAT-решателей
становится в последние годы весьма интенсивно развивающимся
направлением. В Internet регулярно проводятся конкурсы SAT-решателей и
обновляются библиотеки тестовых примеров. Наиболее эффективные на
данный момент SAT-решатели — это minisat, zchaff, berkmin.
4.2. Формализация комбинаторных задач на графах
Напомним, что неориентированный граф 𝐺 это пара < 𝑉, 𝑅 >, где 𝑉 =
{𝑣1 , … , 𝑣𝑛 } – множество вершин графа, 𝑅 = {𝑟1 , … , 𝑟𝑚 } – множество ребер
графа. Каждое ребро 𝑟 графа это пара вершин {𝑣𝑖 , 𝑣𝑗 }, которые называются
смежными.
Ориентацией ребра 𝑟 = {𝑣𝑖 , 𝑣𝑗 }, назовем упорядоченную пару вершин
𝑒(𝑟) =< 𝑣𝑖 , 𝑣𝑗 >. Будем говорить, что ориентированное ребро 𝑒(𝑟) начинается
в вершине 𝑣𝑖 и заканчивается в вершине 𝑣𝑗 .
4.2.1. Раскраска графа
Дан граф 𝐺 =< 𝑉, 𝑅 > и число 𝑘. Раскрасить граф в 𝑘 цветов – это
значит поставить в соответствие каждой его вершине 𝑣 некоторое число 𝑐(𝑣)
– цвет вершины, 1 ≤ 𝑐(𝑣) ≤ 𝑘, так чтобы смежные вершины были
покрашены в разные цвета.
Для произвольного графа 𝐺 и произвольного числа 𝑘 построим булеву
формулу Ф такую, что Ф выполнима тогда и только тогда, когда 𝐺
раскрашивается в 𝑘 цветов.
Введем булевы переменные:
С < 𝑖, 𝑗 > – переменная, соответствующая истинности высказывания «тая вершина графа покрашена в 𝑗-тый цвет», 𝑖 = 1, … , 𝑛, 𝑗 = 1, … , 𝑘.
Пусть 𝑈(𝑥1 , 𝑥2 , … , 𝑥𝑛 ) = (𝑥1 ∨ 𝑥2 ∨ … ∨ 𝑥𝑛 ) & ⋀𝑖,𝑗=1,…,𝑛; 𝑖≠𝑗 ¬(𝑥𝑖 &𝑥𝑗 );;
Построим формулы
Ф1 = ⋀𝑖=1,…,𝑛 𝑈(𝐶 < 𝑖, 1 >, … , 𝐶 < 𝑖, 𝑘 >), которая утверждает, что
каждая вершина графа должна быть покрашена ровно в один цвет.
Ф2 = ⋀𝑟={𝑣 ,𝑣 } ⋀𝑠=1,…,𝑘(𝐶 < 𝑖, 𝑠 >→ ¬𝐶 < 𝑗, 𝑠 >), которая утверждает, что
𝑖
𝑗
все смежные вершины должны быть покрашены в разные цвета. Здесь
внешняя конъюнкция берется по всем ребрам графа 𝐺.
Обозначим Ф = Ф1 &Ф2 .
Утверждение. Булева формула Ф выполнима тогда и только тогда, когда
граф 𝐺 раскрашивается в 𝑘 цветов.
4.2.2. Гамильтонов цикл
Определение. Гамильтоновым циклом в графе G называется
последовательность вершин w=<w1,w2,…,wn>, в которую каждая вершина
графа G входит ровно один раз и где {wn,w1} и {wi , wi+1} –смежные вершины
для всех i=1,…,n-1.
Граф G называется гамильтоновым, если в нем существует
гамильтонов цикл.
Для произвольного графа G построим булеву формулу Ф такую, что
Ф выполнима тогда и только тогда, когда G содержит гамильтонов цикл.
Введем булевы переменные:
С<i,j> - переменная, соответствующая истинности высказывания «i-тая
вершина графа стоит в гамильтоновом цикле на j-том месте», i,j=1,…,n.
Построим формулы
Ф1 = &[i=1,…,n]U(C<i,1>,…, C<i,n>) , которая утверждает, что каждая
вершина графа должна входить в гамильтонов цикл ровно один раз.
Ф2 = & [s,r=1,…,n] ((C<n,s>& C<1,r>→ gsr)& [i=1,…,n-1] (C<i,s>& C<i+1,r>→
gsr)), которая утверждает, что все соседние и крайние вершины гамильтонова
цикла должны быть смежными. Здесь gsr =1, если вершины vs и vr – смежные,
и gsr =0, в противном случае.
Ф=Ф1&Ф2.
Утверждение. Булева формула Ф выполнима тогда и только тогда, когда
граф G содержит гамильтонов цикл.
Замечание об эйлеровых циклах и эйлеровых графах. Эйлеровым циклом
в графе G называется последовательность ориентаций ребер графа e=<e(ri1),
e(ri2),…, e(rim)>, в которую каждое ребро графа G входит ровно один раз, где
ориентация ребра e(rim) заканчивается в вершине, с которой начинается
ориентация ребра e(ri1), и для всех j=1,…,m-1 ориентация ребра e(rij)
заканчивается в вершине, с которой начинается ориентация ребра e(rij+1).
Граф, содержащий Эйлеров цикл, называется Эйлеровым.
Для произвольного графа G легко построить булеву формулу Ф
такую, что Ф выполнима тогда и только тогда, когда G содержит эйлеров
цикл.
Но в отличие от задачи нахождения гамильтонова цикла задача
нахождения в графе Эйлерова цикла легко решается с помощью простого
критерия, и поэтому применение к ее решению SAT-подхода является
нецелесообразным.
4.3. Формализация задачи целочисленной оптимизации
4.3.1. Задача целочисленного линейного программирования
Рассмотрим задачу целочисленного программирования в стандартной
постановке. Дана система неравенств 𝐴 ∗ 𝒙 ≤ 𝒃, где 𝐴 – матрица размерности
(𝑚 × 𝑛) с целочисленными компонентами, 𝒃 - вектор длины 𝑚, состоящий из
натуральных чисел, 𝒙 – вектор переменных 𝑥1 , … , 𝑥𝑛 . Предполагается, что
переменные 𝑥𝑖 , 𝑖 = 1, … , 𝑛, принимают значения из множества целых чисел
{0,1}. Множество решений данной системы неравенств называется
допустимым множеством.
Распознавательный вариант задачи целочисленного программирования
подразумевает ответ на вопрос, верно ли что допустимое множество не
пусто?
В оптимизационном варианте требуется минимизировать на
допустимом множестве целевую функцию 𝑐1 ∗ 𝑥1 + ⋯ + 𝑐𝑛 ∗ 𝑥𝑛 , где 𝑐1 , … 𝑐𝑛 –
заданные целочисленные коэффициенты. Мы будем рассматривать
распознавательный вариант задачи целочисленного программирования.
Процесс сведения данной задачи к SAT состоит в преобразовании
каждого линейного неравенства из исходной системы неравенств во
множество булевых формул.
4.3.2. Сложение чисел в двоичной системе счисления
Пусть нам заданы два натуральных числа, записанные в двоичной системе
счисления, первое слагаемое представляется как набор булевых переменных
x1 х2 ... хn-1 хn
и второе слагаемое представляется как набор булевых
переменных y1 y2 … yn-1 yn . Необходимо найти число равное их сумме,
записанное также в двоичной системе счисления. В общем случае это число
будет представляться набором булевых переменных z0z1z2…zn-1 zn . Для
хранения единиц переполнения разрядов будем использовать набор булевых
переменных с0,с1,с2,…,cn.
Хорошо известен алгоритм сложения столбиком
x1 х2 … хn-1xn
+
y1 y2 … yn-1 yn
_____________________
z0 z1 z2 … zn-1 zn
с0 с1 с2 … сn-1 сn
Отсюда множество содержательных отношений между переменными
будет следующим:
(R1) cn=0
(R2) zi = xi ⊕ yi⊕ci
i=1,…,n
(R3) ci-1 = xi &yi v xi&ci v yi&ci i=1,…,n
(R4) z0=c0
Обозначим построенные формулы через
ADD2(x1, х2, ... , хn-1, хn, y1, y2, … , yn-1,с0, с1, с2,…, cn, z0, z1, z2, … , zn-1, zn).
Добавив соотношение
(R5) z0=0,
мы получим формулы для сложения без переполнения. Обозначим их через
ADD*2(x1, х2, ... , хn-1, хn, y1, y2, … , yn-1,с0, с1, с2,…, cn, z0, z1, z2, … , zn-1, zn).
4.3.3. Формализация целочисленных линейных неравенств
Рассмотрим произвольное целочисленное линейное неравенство, входящее в
исходную систему ограничений
(*)
a1*x1 +a2*x2+ …+ an*xn ≤ b .
Здесь a1, …, an – произвольные целые числа, b-натуральное число, а x1,
… , xn – переменные, принимающие значения из числового множества {0,1}.
Мы можем ограничиться неравенствами, в которых все коэффициенты
ai >0.
Действительно, если некоторое ai <0, то проведя замену переменных
x’i=1-xi мы из неравенства (*) получим эквивалентное неравенство, в котором
коэффициент при x’i будет положительным. Эквивалентность неравенств
означает, что между наборами значений переменных, удовлетворяющих этим
неравенствам, существует очевидное взаимно однозначное соответствие.
Например, пусть неравенство (*) конкретно выглядит так 5x1 -3x2 –
2x3≤ 6.
Проведем замены x’2 =1-x2 и x’3=1-x3. Получим эквивалентное
неравенство
5x1 + 3x’2 + 2x’3 ≤ 11.
Теперь мы будем рассматривать числовые переменные x1, … , xn , x’1,
… , x’n как булевы. Очевидно, что в этом случае переменная x’i будет
эквивалентна формуле ¬xi.
Пусть a^ =max{b,a1,…,an}, и k=log2 (a^).
Пусть <ai1,…, aik> - двоичная запись числа ai длины k (при
необходимости добавляем спереди незначащие нули).
Определим набор длины k из элементарных булевых формул,
соответствующий i-ому слагаемому из левой части неравенства (*). Будем
обозначать его mi.
Если i-тая переменная имеет вид xi, то mi = (xi & ai1 хi & ai2 ... хi & aik),
а если i-переменная имеет вид x’i, то mi = (x’i& ai1 х’i& ai2 ... х’i & aik).
Например, для неравенства 5x1 + 3x’2 + 2x’3 ≤ 11
m1= (0 x1 0 x1), m2= (0 0 x’2 x’2), m3= (0 0 x’3 0).
Легко заметить, что эта задача вычисления левой части неравенства (*)
сводится к сложению без переполнения чисел m1, m2,…, mn , записанных в
двоичной системе счисления.
Обозначим mij – значение j-того разряда числа mi, здесь i=1,…,n,
j=1,…,k;
В качестве дополнительных булевых переменных выберем следующие:
sij - значение j-того разряда i-той промежуточной суммы, здесь i=0,…,n,
j=0,…,k;
cij - значение j-того разряда i-того промежуточного вектора
переполнения разрядов, здесь i=0,…,n, j=0,…,k;
Множество формул M1, описывающих вычисление левой части
неравенства (*), является объединением формул
ADD2*(si-11, ... , , si-1k, mi1, mi2, … , mik, сi0, сi1, сi2,…, cik, si0, si1, si2, … , sik)
для всех i=1,…,n.
Добавим к полученному множеству следующие формулы
1) s0i =0 все компоненты нулевой промежуточной суммы известны (и
равны нулю), i=0,1,…,k.
2) sni ≡ zi, i=0,1,…,k , т.е. компоненты n-ой промежуточной суммы
совпадают с компонентами итоговой суммы.
Получим множество булевых формул M2.
Пусть <b1,…,bk> двоичная запись числа b длины k.
Чтобы завершить построение множества M* булевых формул,
описывающих все возможные решения неравенства (*), осталось добавить в
M2 булеву формулу, описывающую лексико-графическое отношение ≤
между двоичными наборами <z1 z2 … zn> и <b1,…,bk>. Эта формула имеет
вид:
¬𝑧1 & 𝑏1 ∨ (𝑧1 ≡ 𝑏1)&(¬𝑧2 &𝑏2 ∨ (𝑧2 ≡ 𝑏2 )&(… .∨ (𝑧𝑘−1 ≡ 𝑏𝑘−1 )&(¬𝑧𝑘 &𝑏𝑘 ) … ).
Обозначим через ФМ* – конъюнкцию всех формул из множества M*, а
через Ф^ - конъюнкцию всех формул ФМ*, построенных для каждого
неравенства из исходной системы неравенств.
Утверждение. По любому элементу допустимого множества исходной
системы неравенств можно построить выполняющий набор значений
переменных для формулы Ф^, причем разным элементам допустимого
множества соответствуют разные выполняющие наборы. И, наоборот, по
любому выполняющему набору булевых переменных формулы Ф^ можно
построить элемент допустимого множества исходной системы
неравенств.
4.4. Формализация задачи обращения дискретных функций
4.4.1. Автоматные функции
Конечный автомат – это устройство, которое работает со словами,
записанными на ленте, разделенной на ячейки. В каждой ячейке записаны
символы из некоторого конечного алфавита
A={a1,…,an}, который
называется внешним алфавитом автомата. Автомат состоит из считывающейзаписывающей головки и блока управления. Автомат работает по тактам,
которые мы будем называть моментами времени.
Головка автомата
обозревает в каждый момент одну ячейку ленты и сообщает блоку
управления ее содержимое, т.е. некоторый символ из алфавита А. Блок
управления в каждый момент времени находится в одном из состояний из
конечного множества Q={q1,…,qm}, который называется
внутренним
алфавитом автомата.
Можно считать, что ячейки ленты пронумерованы натуральными
числами.
В начальный (первый) момент времени на ленте записано некоторое
входное слово ai1 ai2 … aiN , т.е. в первой ячейке записан символ ai1, во второй
– символ ai1, в N-ой – символ aiN . Будем считать, что во всех остальных
ячейках ленты находится некоторый выделенный символ Ʌ из алфавита А,
который обычно называется «пусто».
ai1 ai2 …
… aiN Ʌ
q1
В начальный момент времени автомат обозревает первую ячейку и
находится в состоянии q1, которое называется начальным состоянием.
Работа конечного детерминированного одностороннего автомата
описывается конечным множеством команд P={p1,…,pk}, k=n*m.
Каждая команда p из P имеет вид:
qi aj → azqs . Смысл команды
следующий: если в t-ый момент времени автомат (его блок управления)
находится в состоянии qi и обозревает на ленте (в ячейке с номером t) символ
aj , то следующий момент времени t+1 автомат запишет в обозреваемую
ячейку символ az , перейдет в состояние qs и сдвинет считывающуюзаписывающую головку в следующую ячейку ленты (т.е. сдвинет головку на
ленте на одну позицию вправо).
Систему команд автомата обычно представляют в виде таблицы:
q1
…
qi
…
qm
a1
…
aj
…
an
az q s
В этой таблице клетка, стоящая в j-той строке и в i-том столбце
соответствует команде с левой частью qi aj и заполняется правой частью этой
команды – символом az и состоянием qs.
В множестве Q выделяется некоторое состояние qr , которое называется
заключительным состоянием автомата, придя в которое он останавливается.
Считается также, что если в любом состоянии qi автомат будет обозревать
символ Ʌ, то он перейдет в заключительное состояние qr и остановится.
Мы будем говорить, что автомат К перерабатывает слово v= ai1 ai2 …
aiN , в слово w= aj1 aj2 … ajN если в заключительном состоянии на ленте
автомата будет записано слово w= aj1 aj2 … ajN.
Таким образом, с каждым конечным автоматом K связано семейство
дискретных функций fK= { fKN : N=1,2,3,…}. Каждая функция fKN имеет
область определения dom (fKN) =A x A x… x A=AN ,область значения
range(fKN) =A x A x … x A=AN , и вычисляется следующим образом: на ленту
автомата K в начальный момент записывается произвольное слово
x= x1 x2 … xN и определяется слово y= y1 y2 … yN , в которое
перерабатывается слово x. Будем записывать y=fKN (x).
Проблемой обращения произвольной функции fKN из семейства fK
называется следующая задача: по произвольному y ϵ range(fKN) и известному
алгоритму вычисления fKN (программе автомата K) требуется найти x ϵ dom
(fKN), такой что fKN (x)=y.
Булевская формализация вычисления автоматной функции.
Введем булевы переменные:
S<t,i> - в момент времени t автомат находится в состоянии qi , для всех
t=1,…,N , i=1,…,m.
C<t,i,j> - в момент времени t в ячейке с номером i находится символ aj,
для всех t=1,…,N , i=1,…,N, j=1,…,n.
Для конечного автомата очевидно, что в момент времени t, 1≤t ≤N, он
будет обозревать ячейку с номером t.
Построим следующие формулы.
Ф1 =&[t=1,…,N+1]
U(S<t,1>, S<t,2>, …, S<t,m>).
Эта формула
утверждает, что в каждый момент времени t автомат находится ровно в
одном состоянии.
Ф2 = &[t=1,…,N+1 ] &[i=1,…,N+1 ] U(C<t,i,1>, C<t,i,2>, …, C<t,i,n>). Эта
формула утверждает, что в каждый момент времени в каждой ячейке ленты
записан ровно один символ входного алфавита.
Ф3 = &[pϵP] &[t=1,…,N+1] (S<t,i> & C<t,t,j> → S<t+1,s>& C<t+1,t,z>) .
Эта формула описывает изменение состояний автомата и содержимого
ячеек ленты во времени согласно командам автомата. Внешняя конъюнкция
строится по всем командам p: qi aj → az qs автомата K.
Ф4= S<1,1> & (S<2,r>V…V S<N+1,r>) &[t=1,…,N+1] C<t,N+1,i0> . Здесь
i0 - номер символа Ʌ в алфавите A.
Ф5 = C<1,1, i1> & C<1,2,i2>& … & C<1,N,iN >. Эта формула описывает
содержимое ленты в начальный момент времени.
Ф6 = C<N+1,1, j1> & C<N+1,2,j2>& … & C<N+1,N,jN>. Эта формула
описывает содержимое ленты в заключительный (N+1-ый) момент времени.
Рассмотрим формулу
ФK= Ф1 & Ф2 & Ф3 & Ф4 & Ф5 & Ф6.
Утверждение. Конечный автомат К перерабатывает слово v= ai1 ai2 … aiN
в слово w= aj1 aj2 … ajN тогда и только тогда, когда формула ФK –
выполнима.
Очевидно, что задаче обращения автоматной функции fKN в точке
y= aj1 aj2 … ajN соответствует задача проверки выполнимости формулы
Ф’K= Ф1 & Ф2 & Ф3 & Ф4 & Ф6.
4.4.2. Функции, вычислимые на машинах Тьюринга за время Т
Детерминированная машина Тьюринга МТ (ДМТ) – это устройство,
которое также работает со словами, записанными на ленте, разделенной на
ячейки. В случае ДМТ лента считается бесконечной в обе стороны, все
ячейки ленты пронумерованы целыми числами. В каждой ячейке записаны
символы из некоторого конечного алфавита
A={a1,…,an}, который
называется внешним алфавитом машины Тьюринга.
Управляющее
устройство ДМТ состоит из считывающей-записывающей головки и блока
управления.
ДМТ работает по тактам, которые мы будем называть
моментами времени. Считывающая-записывающая головка обозревает в
каждый момент одну ячейку ленты и сообщает блоку управления ее
содержимое, т.е. некоторый символ из алфавита А. Блок управления в
каждый момент времени находится в одном из состояний из конечного
множества Q={q1,…,qm}, который называется
внутренним алфавитом
автомата.
Работа ДМТ описывается конечным множеством команд P={p1,…,pk},
k=n*m.
Каждая команда p из P имеет вид:
qi aj → az qs{R,L}. Смысл этой
команды следующий: если в некоторый момент времени t автомат (его блок
управления) находится в состоянии qi и головка обозревает на ленте символ
aj , то в следующий момент времени t+1 в обозреваемую ячейку записывается
символ az,
управляющее устройство переходит в состояние qs и
считывающая-записывающая головка сдвигается на ленте на одну позицию
вправо или влево, в зависимости от сдвига, указанного в команде (Rозначает сдвиг вправо, L-сдвиг влево).
Систему команд МТ обычно представляют в виде таблицы:
q1
a1
…
aj
…
an
…
qi
…
qm
azqsR
В этой таблице клетка, стоящая в j-той строке и в i-том столбце
соответствует команде с левой частью qi aj и заполняется правой частью этой
команды – символом az, состоянием qs и сдвигом R или L.
В начальный (первый) момент времени на ленте записано некоторое
входное слово ai1 ai2 … aiN , т.е. в первой ячейке записан символ ai1, во второй
– символ ai1, в N-ой – символ aiN . Будем считать, что во всех остальных
ячейках ленты находится некоторый выделенный символ Ʌ из алфавита А,
который обычно называется «пусто».
… Ʌ … Ʌ ai1 ai2 … … aiN Ʌ … … Ʌ …
q1
В начальный момент времени ДМТ обозревает первую ячейку и
находится в состоянии q1, которое называется начальным состоянием.
Данная конфигурация машины Тьюринга называется стандартной
начальной конфигурацией.
В множестве Q выделяется некоторое состояние qr , которое называется
заключительным
состоянием машины. Считается, что когда машина
приходит в состояние qr, то она останавливается, обозревает также первую
ячейку, а на ленте записано слово aj1 aj2 … ajP
… Ʌ … Ʌ aj1 aj2 … … ajP Ʌ … …
qr
Ʌ
…
Данная конфигурация машины Тьюринга называется стандартной
заключительной конфигурацией.
Мы будем говорить, что ДМТ перерабатывает слово v= ai1 ai2 … aiN в
слово w= aj1 aj2 … ajP за время T, если после начала работы в стандартной
начальной конфигурации
со словом v на ленте ДМТ приходит в
стандартную заключительную ситуацию со словом w на ленте не более чем
за T тактов своей работы..
Таким образом, с каждой машиной Тьюринга М связано семейство
дискретных функций fМ= { fMN : N=1,2,3,…}. Каждая функция fMN имеет
область определения dom (fMN) =A x A x… x A=AN ,область значения
range(fMN) =A x A x … x A x …=A* , и вычисляется следующим образом: на
ленту машины в начальный момент записывается произвольное слово
x= x1 x2 … xN и определяется слово y= y1 y2 … yP , в которое
перерабатывается слово x. Будем записывать y=fMN (x).
Проблемой обращения произвольной функции fMN из семейства fM
называется следующая задача: по произвольному y ϵ range(fMN) и известному
алгоритму вычисления fMN (программе машины M) требуется найти x ϵ dom
(fMN), такой что fMN (x)=y.
Булева формализация функции, вычислимой на машине Тьюринга за время
Т.
Введем булевы переменные:
S<t,i> - в момент времени t ДМТ находится в состоянии qi, для всех
t=1,…,T , i=1,…,m.
C<t,i,j> - в момент времени t в ячейке с номером i находится символ aj,
для всех t=1,…,T , i=-T,…,-1,0,1,…,T, j=1,…,n. Очевидно, что за T тактов
своей работы ДМТ может обозревать только ячейки с номерами от –Т до Т.
L<t,i> - в момент времени t машина обозревает ячейку с номером i, для
всех t=1,…,T , i=-T,…,-1,0,1,…,T.
Построим формулы:
Ф1 = &[t=1,…,T ] U(S<t,1>, S<t,2>, …, S<t,m>). Эта формула утверждает,
что в каждый момент времени ДМТ находится ровно в одном состоянии.
Ф2 = &[t=1,…,T ] &[i=-Т,…,Т ] U(C<t,i,1>, C<t,i,2>, …, C<t,i,n>). Эта формула
утверждает, что в каждый момент времени в каждой ячейке ленты записан
ровно один символ входного алфавита.
Ф3 = &[t=1,…,T ] U(L<t,-Т>,…, L<t,1>, …, L<t,Т>). Эта формула
утверждает, что в каждый момент времени ДМТ обозревает ровно одну
ячейку ленты.
Ф4 = &[p] &[t=1,…,N, k=-T,…,T] (S<t,i>& L<t,k> & C<t,k,j> →
C<t+1,k,z> S<t+1,s>& L<t+1,k±1>)
Эта формула описывает, что изменение состояний автомата и номеров
обозреваемых ячеек во времени происходит согласно командам автомата.
Внешняя конъюнкция строится по всем командам. Изменение номера
обозреваемой ячейки k+1 соответствует знаку R в команде автомата, а k-1
соответствует знаку L.
Ф5=&[t=1,…,N, k=-T,…,T, j=1,…,n] ( ¬L<t,k> → C<t,k,j> ≡ C<t+1,k,j> )
Эта формула утверждает, что содержимое всех ячеек ленты за
исключением обозреваемой ячейки не может измениться в течение такта
работы.
Ф6 = S<1,1> & L<1,1> & C<1,-T,i0>& …&C<1,-1, i0 >& C<1,0, i0 >&
C<1,N+1, i0>& …&C<1,T, i0 >.
Эта формула описывает, что в начальный момент времени машина
находится в начальном состоянии и обозревает ячейку с номером 1, а во всех
ячейках, находящихся левее и правее от входного слова содержится символ
Ʌ. Здесь i0 – номер пустого символа в алфавите A.
Ф7 = S<1,r> ⋁ S<1,r> ⋁ … ⋁ S<T,r> . Эта формула описывает, что
ДМТ придет в заключительное состояние.
Ф8= C<1,1,i1> & C<1,2,i2>& … & C<1,1,iN>.
Эта формула описывает состояние ленты в стандартной начальной
конфигурации.
Ф9= &[t=1,…,T ] (S<t,r> → C<t,1,j1> & C<t,2,j2>& … & C<t,1,jP>&
C<t,-T,i0>& …&C<t,-1, i0 >& C<t,0, i0 >& C<t,P+1, i0>& …&C<t,T, i0 >).
Эта формула описывает состояние ленты в стандартной
заключительной конфигурации. Здесь i0 – номер пустого символа в алфавите
A.
Рассмотрим формулу
ФM= Ф1 & Ф2 & Ф3 & Ф4 & Ф5 & Ф6 & Ф7 & Ф8 & Ф9 .
Утверждение. Детерминированная машина Тьюринга M перерабатывает
слово v= ai1 ai2 … aiN в слово w= aj1 aj2 … ajP тогда и только тогда, когда
формула ФM – выполнима.
Очевидно, что задаче обращения функции fMN , вычислимой на машине
Тьюринга М за время T, в точке y= aj1 aj2 … ajP соответствует задача
проверки выполнимости формулы
Ф’M= Ф1 & Ф2 & Ф3 & Ф4 & Ф6 & Ф7 & Ф9.
4.4.3. Логический криптоанализ
Наиболее надежный и распространенный в наши дни способ защиты
информации – криптографический. Этот метод защиты информации
предполагает преобразование информации для сокрытия ее смысла от
противника. Криптография в переводе с греческого означает "тайнопись". В
настоящее время криптография занимается поиском и исследованием
математических методов преобразования информации.
Наряду с криптографией развивается и совершенствуется
криптоанализ – наука о преодолении криптографической защиты
информации. Иногда криптографию и криптоанализ объединяют в одну
науку – криптологию (kryptos - тайный, logos - наука), занимающуюся
вопросами обратимого преобразования информации с целью защиты от
несанкционированного доступа, оценкой надежности систем шифрования и
анализом стойкости шифров.
Теперь, узнав назначение криптографии, познакомимся с основными
терминами, которые используются при изложении криптографических
методов защиты информации.
Шифр – совокупность заранее оговоренных способов преобразования
исходного секретного сообщения с целью его защиты.
Открытыми текстами обычно называют исходные сообщения. В
иностранной литературе для открытого текста используют термин plaintext.
Символ – это любой знак, в том числе буква, цифра или знак
препинания.
Алфавит – конечное множество используемых для кодирования
информации символов. Например, русский алфавит содержит 33 буквы от А
до Я. Однако этих тридцати трех знаков обычно бывает недостаточно для
записи сообщений, поэтому их дополняют символом пробела, точкой,
запятой и другими знаками. Алфавит арабских цифр – это символы 0, 1, 2, 3,
4, 5, 6, 7, 8, 9. Этот алфавит содержит 10 знаков и с его помощью можно
записать любое натуральное число. Легко заметить, что любое сообщение
может быть записано
с помощью двоичного алфавита, то есть с
использованием только нулей и единиц.
Шифрованным сообщением (закрытым текстом, шифротекстом,
криптограммой) называется сообщение, полученное после преобразования
открытого текста с использованием шифра. В иностранной литературе для
закрытого текста используют термин ciphertext.
Преобразование открытого текста в шифртекст называется
зашифрованием. Обратное действие называется расшифрованием. В
англоязычной литературе терминам "зашифрование/расшифрование"
соответствуют термины "enciphering/deciphering".
Ключ – информация, необходимая для шифрования и расшифрования
сообщений.
С точки зрения русского языка термины "расшифрование" и
"дешифрование" являются синонимами. Однако в работах по криптографии
последних десятилетий часто эти слова различают. Будем считать, что
термины "расшифрование" и "дешифрование" не являются синонимами.
Примем, что расшифрованием занимается легальный получатель сообщения
(тот, кто знает ключ), а человек, которому послание не предназначено,
пытаясь понять его смысл, занимается дешифрованием.
Система шифрования, или шифрсистема, – это любая система,
которую можно использовать для обратимого изменения текста сообщения с
целью сделать его непонятным для всех, кроме тех, кому оно предназначено.
Шифрование с закрытым ключом (шифрование с секретным ключом
или симметричное шифрование) используется человеком уже довольно
долгое время. Для шифрования и расшифрования данных в этих методах
используется один и тот же ключ, который обе стороны стараются хранить в
секрете от противника.
Криптостойкостью называется характеристика шифра, определяющая
его стойкость к дешифрованию без знания ключа (т.е. способность
противостоять криптоанализу).
Криптоаналитики
исследуют возможности дешифрования
информации без знания ключей. Успешно проведенный криптоанализ
шифротекстов позволяет получить ключ шифрования, или открытый текст,
или то и другое вместе.
Долгое время разработчики криптосистем держали в тайне алгоритмы
шифрования, устройства шифровальных машин, тщательно проверяли на
надежность персонал, имеющий доступ к криптосистемам.
Однако еще в XIX веке специалисты в области криптографии
предположили, что секретность алгоритма шифрования не является
гарантией от взлома. Более того, в дальнейшем было понято, что по-
настоящему надежная система шифрования должна оставаться защищённой,
даже если противник полностью узнал алгоритм шифрования. Секретность
ключа должна быть достаточна для хорошего шифра, чтобы сохранить
стойкость к попыткам взлома. Этот фундаментальный принцип впервые был
сформулирован в 1883 Керкхоффсом (A. Kerckhoffs) и обычно называется
принципом Керкхоффса.
Разработчики современных криптографических систем используют
именно такой подход. В настоящее время создаваемые алгоритмы
шифрования всесторонне изучаются большим числом специалистов,
оцениваются по различным показателям.
Таким образом, согласно принципу Керкгоффса, криптоаналитик
обладает всей информацией о криптосистеме кроме некоторого набора
параметров, называемого ключом. Задачей криптоаналитика является
нахождение ключа шифрования или алгоритма дешифровки с целью
дешифрования других шифротекстов с аналогичным ключом.
Логическим криптоанализом будем называть совокупность методов
в работе криптоаналитика, основанных на потенциальной возможности
эффективного решения SAT-задач.
4.4.3.1. Пример логического криптоанализа простого шифра
Рассмотрим одну из простейших систем шифрования, которая носит имя
"шифр Юлия Цезаря". Предполагается, что знаменитый римский император и
полководец, живший в 1 веке до нашей эры, использовал этот шифр в своей
переписке.
Шифр Цезаря применительно к русскому языку состоит в следующем.
Каждая буква сообщения заменяется на другую, которая в русском алфавите
отстоит от исходной на три позиции дальше. Таким образом,
буква A заменяется на Г , Б на Д и так далее вплоть до буквы Ь , которая
заменялась на Я , затем Э на A , Ю на Б и, наконец, Я на В .
Так, например, слово ЗАМЕНА после шифрования методом Цезаря
превратится в КГПЗРГ .
Это не сложный метод, но тем не менее, Цезарь вошел в историю
криптографии, а "шифр Юлия Цезаря", как его до сих пор называют, служит
примером одной из первых систем шифрования.
Для расшифрования сообщения КГПЗРГ необходимо знать только
сам алгоритм шифрования. Любой человек, знающий способ шифрования,
легко может расшифровать секретное сообщение. Таким образом, ключом в
данном методе является сам алгоритм.
В криптографии принято считать, что противник может знать
использованный алгоритм шифрования, характер передаваемых сообщений
и перехваченный шифротекст, но не знает секретный ключ. Как уже
упоминалось
выше,
это
называется
принципом
Керкхоффса.
Усовершенствуем шифр Цезаря с учетом правила Керкхоффса.
Предположим, что буквы сдвигаются не на три знака вправо, а на n
(1<n<9). В этом случае в системе шифрования появляется ключ– число n –
параметр сдвига. Отправитель и получатель могут каким-либо образом
договариваться (например, лично) и иногда менять значение ключа. Так как n
может принимать разные значения, знание одного только алгоритма не
позволит противнику расшифровать секретное сообщение.
В данном случае шифрование представляет собой некоторую
автоматную функцию y=fKN+1(n,x), которая по параметру сдвига n и словусообщению x=x1x2…xN построит шифротекст y=y1y2…yN .
Программа для автомата K, вычисляющего fK:
q1
q2
q3
q4
q5
q6
q7
q8
А
В q2
Г q3
Д q4
Е q5
Ë q6
Ж q7
З q8
Б
Г q2
Д q3
Е q4
Ë q5
Ж q6
З q7
И q8
В
Д q2
Е q3
Ë q4
Ж q5
З q6
И q7
К q8
Г
Е q2
Ë q3
Ж q4
З q5
И q6
К q7
Л q8
Д
Ë q2
Ж q3
З q4
И q5
К q6
Л q7
М q8
Е
Ж q2
З q3
И q4
К q5
Л q6
М q7
Н q8
…
…
…
…
…
…
…
…
Э
Я q2
А q3
Б q4
В q5
Г q6
Д q7
Е q8
Ю
А q2
Б q3
В q4
Г q5
Д q6
Е q7
Ë q8
Я
Б q2
В q3
Г q4
Д q5
Е q6
Ë q7
Ж q8
2
Ʌ q2
3
Ʌ q3
4
Ʌ q4
5
Ʌ q5
6
Ʌ q6
7
Ʌ q7
8
Ʌ q8
Ʌ
qr
qr
qr
qr
qr
qr
qr
Пусть В={b1,b2,…,bS} – словарь осмысленных слов, которые
подвергаются шифрованию. Введем булевы переменные B<i,j,k> ,
означающие, что в слове bi на j-той позиции стоит k-тый символ внешнего
алфавита автомата K.
Построим формулу
G=
V[i=1,…,s] ( &[j=1,…,N ] &[k=1,…,n ] C<1,j,k>≡ B<i,j,k>), означающую,
что в начальный момент времени на ленте автомата должно быть записано
некоторое осмысленное слово из словаря B.
Задача логического криптоанализа шифра Цезаря сводится к проверке
выполнимости формулы Ф’K & G, в которой значение переменных
C<N+1,j,k> соответствует шифротексту
y=y1y2…yN , а Ф’K – булева
формула построенная для обращения функции, вычисляемой автоматом K.
4.4.3.2. Логический криптоанализ поточных шифров
Поточный шифр — это симметричный шифр, в котором каждый символ
открытого текста преобразуется в символ шифрованного текста в
зависимости не только от используемого ключа, но и от его расположения в
потоке открытого текста.
Частным случаем поточного шифрования является гаммирование. В
этом способе шифрование выполняется путем сложения символов исходного
текста и ключа по модулю, равному числу букв в алфавите. Если в исходном
алфавите, например, 33 символа, то сложение производится по модулю 33.
Такой процесс сложения исходного текста и ключа называется в
криптографии наложением гаммы.
Пусть символам исходного алфавита соответствуют числа от 0
(А) до 32 (Я). Если обозначить число, соответствующее исходному
символу, x, а символу ключа – k, то можно записать правило гаммирования
следующим образом:
z = x + k (mod N),
где z – закодированный символ, N - количество символов в алфавите, а
сложение по модулю N - операция, аналогичная обычному сложению, с тем
отличием, что если обычное суммирование дает результат, больший или
равный N, то значением суммы считается остаток от деления его на N.
Например, сложим по модулю 33 символы Г (3) и Ю (31):
(3 + 31) (mod 33) = 1, то есть в результате получаем символ Б,
соответствующий числу 1.
Наиболее часто на практике встречается двоичное гаммирование. При
этом используется двоичный алфавит, а сложение производится по модулю
два. Операция сложения по модулю 2 часто обозначается ⊕, то есть можно
записать: z = (x+k) (mod 2) = x ⊕ k.
Рассмотрим пример. Предположим, нам необходимо зашифровать
десятичное число 14 методом гаммирования с использованием ключа 12. Для
этого вначале необходимо преобразовать исходное число и ключ (гамму) в
двоичную форму: 14(10)=1110(2), 12(10)=1100(2). Затем надо записать
полученные двоичные числа друг под другом и каждую пару символов
сложить по модулю два. При сложении двух двоичных знаков получается 0,
если исходные двоичные цифры одинаковы, и 1, если цифры разные.
Сложим по модулю два двоичные числа 1110 и 1100:
Исходное число 1 1 1 0
Гамма
1100
Результат
0010
В результате сложения получили двоичное число 0010. Если перевести
его в десятичную форму, получим 2. Таким образом, в результате
применения к числу 14 операции гаммирования с ключом 12 получаем в
результате число 2.
Каким же образом выполняется расшифрование? Зашифрованное
число 2 представляется в двоичном виде и снова производится сложение по
модулю 2 с ключом:
Зашифрованное число 0 0 1 0
Гамма
1100
Результат
1110
Переведем полученное двоичное значение 1110 в десятичный вид и
получим 14, то есть исходное число.
Таким образом, при гаммировании по модулю 2 нужно использовать
одну и ту же операцию как для зашифрования, так и для расшифрования. Это
позволяет использовать один и тот же алгоритм, а соответственно и одну и ту
же программу при программной реализации, как для шифрования, так и для
расшифрования.
Операция сложения по модулю два очень быстро выполняется на
компьютере (в отличие от многих других арифметических операций),
поэтому наложение гаммы даже на очень большой открытый текст
выполняется практически мгновенно.
Благодаря указанным достоинствам метод гаммирования широко
применяется в современных технических системах сам по себе, а также как
элемент комбинированных алгоритмов шифрования.
Сформулируем, как производится гаммирование по модулю 2 в общем
случае:
 символы исходного текста и гамма представляются в двоичном коде и
располагаются один под другим, при этом ключ (гамма) записывается
столько раз, сколько потребуется;
 каждая пара двоичных знаков складывается по модулю два;
полученная последовательность двоичных знаков кодируется символами
алфавита в соответствии с выбранным кодом.
На рисунке показано, как применяется гаммирование к тексту с
русскими символами. Символы кодируются в соответствии с принятой
кодировкой, а затем производится сложение по модулю 2. При
использовании метода гаммирования ключом является последовательность, с
которой производится сложение – гамма. Если гамма короче, чем сообщение,
предназначенное для зашифрования, гамма повторяется требуемое число раз.
Так в примере на рисунке длина исходного сообщения равна двенадцати
байтам, а длина ключа – пяти байтам. Следовательно, для зашифрования
гамма должна быть повторена 2 раза полностью и еще один раз частично.

Рисунок. Механизм гаммирования
Мы видим, что в данном случае шифрование представляет собой
некоторую функцию y=fN (k,x), которая по ключевому слову (гамме) k и
слову-сообщению x=x1x2…xN построит шифротекст y=y1y2…yN .
Легко построить машину Тьюринга M, вычисляющую функцию fN.
Пусть В={b1,b2,…,bS} – словарь осмысленных слов, которые
подвергаются шифрованию. Введем булевы переменные B<i,j,k> ,
означающие, что в слове bi на j-той позиции стоит k-тый символ внешнего
алфавита автомата K.
Построим формулу
G=
V[i=1,…,s] ( &[j=1,…,N ] &[k=1,…,n ] C<1,j,k>≡ B<i,j,k>), означающую,
что в начальный момент времени на ленте машины М должно быть записано
некоторое осмысленное слово из словаря B.
Задача логического криптоанализа при гаммировании сводится к
проверке выполнимости формулы
Ф’М & G,
в которой значение
переменных C<N+1,j,k>, j=1,…,N, соответствует шифротексту y=y1y2…yN,
а Ф’М – булева формула, построенная для обращения функции, вычисляемой
машиной Тьюринга М.
SAT-подход показал свою эффективность при исследовании
криптоустойчивости некоторых методов поточного шифрования. С помощью
этого подхода удалось найти уязвимости ряда используемых поточных
шифров. Очевидно, что чем длиннее ключ, чем применение SAT-подхода
становится менее эффективным. Но на практике длина ключа ограничена
возможностями аппаратуры обмена данными и вычислительной техники, а
именно выделяемыми объемами памяти под ключ, временем обработки
сообщения, а также возможностями аппаратуры подготовки и записи
последовательностей ключей. Кроме того, для использования ключа вначале
необходимо каким-либо надежным способом доставить его обеим сторонам,
обменивающимся сообщениями. Это приводит к возникновению проблемы
распределения ключей, сложность решения которой возрастает с
увеличением длины ключа и количества абонентов в сети передачи
сообщений.
4.5. Определение класса комбинаторных (переборных) задач
4.5.1. Недетерминированная машина Тьюринга
Недетерминированная
машина
Тьюринга
(НМТ)
отличается
от
детерминированной машины Тьюринга только тем, что для каждой пары qi ϵ
Q, aj ϵ A в системе команд P НМТ может быть более одной команды
(достаточно рассмотреть случай двух команд) с одинаковой левой частью :
qi aj →az1 qs1 {R,L} ; qi aj → az2qs2 {R,L} .
Работа НМТ на слове w осуществляется следующим образом.
Если в некоторый момент t машина находится в состоянии qi ,
обозревает некоторую ячейку, в которой записан символ aj, и в системе
команд НМТ имеется более одной команды с левой частью <qi,aj>, то
машина произвольно выбирает одну из этих команд, выполняет ее, т.е.
записывает в обозреваемую ячейку нужный символ, переходит в указанное
состояние и осуществляет соответствующий сдвиг считывающей головки.
Мы будем говорить, что НМТ принимает слово w= ai1 ai2 … aiN , если
начав работу в стандартной начальной конфигурации со словом
w= ai1 ai2 … aiN, записанным на ленте, в некоторый момент своей работы она
приходит в принимающее состояние qr , т.е. останавливается.
Ограниченная проблема останова для НМТ. По данной НМТ и слову w= ai1
ai2 … aiN определить, принимает НМТ слово w не более, чем за Т тактов
своей работы или нет.
4.5.2. Класс NP комбинаторных (переборных) задач
Класс NP (от англ. non-deterministic polynomial) можно определить как
множество задач, которые можно «быстро» (за время, не превосходящее
полинома от размера данных) решить на недетерминированной машине
Тьюринга.
Другое более современное определение класса NP следующее.
Классом NP называют множество задач распознавания, решение которых
при
наличии
некоторых
дополнительных
сведений
(которые
называются сертификатом решения) можно «быстро» (за время, не
превосходящее полинома от
размера
данных)
проверить
на детерминированной машине Тьюринга.
Например, сертификатами решения для задачи SAT является
выполняющие наборы значений переменных, входящих в данную булеву
формулу. А сертификатами решения в задаче коммивояжера, являются
перестановки вершин графа, соответствующие гамильтоновым циклам
стоимости < k.
Из этого определения видно, что решение задач из класса NP может
быть сведено к перебору различных комбинаций сертификатов решений.
Поэтому задачи из класса NP называют также переборными и
комбинаторными.
NP-полная задача — задача из класса NP, к которой можно свести любую
другую задачу из этого класса за полиномиальное время (то есть при помощи
простых операций, число которых не превышает некоторого полинома от
размера исходных данных). Таким образом, NP-полные задачи образуют в
некотором смысле подмножество «типовых» задач в классе NP: если для
какой-то из них найден «полиномиально быстрый» алгоритм решения, то и
любая другая задача из класса NP может быть решена так же «быстро».
Примеры NP-полных задач: SAT-задача о выполнимости булевых
формул; задача коммивояжёра; задача о раскраске графа, задача о клике,
задача целочисленного программирования и др.
4.5.3. Булевская формализация ограниченной проблемы останова
для недетерминированной машины Тьюринга. NP-полнота задачи
SAT.
Пусть нам дана некоторая НМТ М’ , слово w и число T.
Построим булеву формулу Ф такую, что Ф выполнима тогда и только
тогда, когда М’ принимает слово w не более чем за T тактов своей работы.
Формула строится полностью аналогично рассмотренному выше
случаю булевской формализации работы детерминированной МТ.
Единственное отличие в построении формулы Ф4.
Ф4 = &[𝑝] &[𝑡 = 1, … , 𝑁, 𝑟 = −𝑇, … , 𝑇] (𝑆 < 𝑡, 𝑖 > & 𝐿 < 𝑡, 𝑟 > & 𝐶 < 𝑡, 𝑟, 𝑗 > →
𝐶 < 𝑡 + 1, 𝑟, 𝑧1 > & 𝑆 < 𝑡 + 1, 𝑠1 > & 𝐿 < 𝑡 + 1, 𝑟 ± 1 > ⋁ 𝐶 < 𝑡 + 1, 𝑟, 𝑧2 >
𝑆 < 𝑡 + 1, 𝑠2 > & 𝐿 < 𝑡 + 1, 𝑟 ± 1 >)
Справа от импликации через дизъюнкцию перечисляются все
возможные продолжения работы НМТ в случае «недетерминированной»
ситуации, в которой содержимому обозреваемой ячейки и текущему
состоянию соответствуют несколько команд НМТ.
Заметим, что размер построенной формулы Ф полиномиально зависит
от, параметров машины М’, значений N и T. Параметры машины М’
считаются постоянными (не зависящими от N) , и если значение T будет не
превосходить некоторого полинома от N, то размер формулы Ф будет
полиномиально зависеть от длины входного слова w. Т.е. размер формулы Ф
будет расти с увеличением длины входного слова со скоростью некоторого
полинома.
Таким образом, мы видим, что любая задача из класса NP
полиномиально сводится к задаче SAT. Поэтому задача SAT называется NPполной.
NP-полнота задачи SAT определяет тот высокий интерес к нахождению
практически эффективных методов решения этой задачи, которые могут быть
использованы в реальных приложениях.
Литература к разделу 4.
1. Стюарт Рассел, Питер Норвиг. Искусственный интеллект: современный
подход. 2-ое издание. ISBN 5-8459-0887-6. Издательство "Вильямс". 2006.
С.1424.
2. Devis M., Putnam H. A computing procedure for quantification theory // ACM.
1960. Vol. 7. P. 201–215.
3. Davis M., Longemann G., Loveland D. A machine program for theorem proving
// Communicat. of the ACM. 1962. Vol. 5. P. 394–397.
4. Гэри М., Джонсон Д. Вычислительные машины и труднорешаемые задачи.
М.: Мир, 1982. 416 с.
5. Goldberg E., Novikov Y. BerkMin: A Fast and Robust SAT Solver //
Automation and Test in Europe (DATE). 2002. P. 142–149.
6. А. А. Семенов, О. С. Заикин, Д. В. Беспалов, А. А. Ушаков. SAT-подход в
криптоанализе некоторых систем поточного шифрования //Вычислительные
технологии Том 13, № 6, 2008.
7.
И.В. Отпущенников, А.А. Семенов. Технология трансляции
комбинаторных проблем в булевы уравнения // Прикладная дискретная
математика №1 (11), 2011.
8. Г.В. Басалова. Основы криптографии. Курс лекций. // НОУ «Интуит».
9. SATLive [http://www.satlive.org]
10. MiniSat [http://minisat.se/MiniSat.html]
11. Zchaff [http://www.princeton.edu/ chaff/zchaff.html]
Глава 5. BDD – подход к решению практических задач
5.1. BDD-представление булевых функций
Ранее в Разделе 1 мы рассматривали различные представление булевых
функций в виде таблиц и формул, специальные виды которых применяются в
SAT-подходе к решению практических задач. В данном разделе
рассматривается представление булевых функций в виде графов (решающих
деревьев), которое является основой для так называемого BDD-подхода к
решению задач.
5.1.1. Бинарные диаграммы решений
Бинарная диаграмма решений (Binary Decision Diagram, BDD) – это
граф, являющийся модификацией семантического дерева. В BDD узлы с
одним и тем же значением функции объединены. Если на каждом уровне
BDD все вершины имеют одну и ту же метку (одинаковые переменные), то
такая BDD называется упорядоченной (в англоязычной литературе такое
представление называется Ordinary Binary Decision Diagrams, или
сокращенно OBDD). Будем называть такое представление OBDD. Вершины
OBDD расположены по уровням, каждому уровню соответствует одна
переменная, которая помечает вершины, находящиеся на этом уровне. Из
каждой вершины выходят два ребра: одно соответствует нулевому значению
соответствующей переменной (будем его изображать штриховой линией), а
другое – единичному значению этой переменной (оно изображается
сплошной линией).
Введем некоторые характеристики рассматриваемой модели.
Определение. Сложностью BDD 𝐺 называется число ее внутренних вершин
(в которых происходят вычисления) и обозначается как |𝐺|.
Сложность наилучшей BDD для функции 𝑓 будем обозначать 𝐵𝐷𝐷(𝑓).
Пример. BDD для функции 𝑓 = (¬𝑝 ∨ 𝑞) ⊕ 𝑟 ⋅ 𝑞 сложности 3.
Бинарные диаграммы решений используются как компактная форма
представления булевой функции. Очевидно, BDD сложности 𝑐 может быть
записана в виде программы, состоящей из 𝑐 инструкций вида «I: if 𝑥𝑖 then
goto I1 else goto I2», т.е. имеется непосредственная связь между размером
BDD и сложностью ее программной реализации. Такое представление
полезно во многих случаях, например, когда нужно многократно вычислять
значения функции при различных наборах значений ее аргументов.
Для того, чтобы вычислить функцию 𝑓 = (¬𝑝 ∨ 𝑞) ⊕ 𝑟 ⋅ 𝑞, например,
на языке С, вместо хранения громоздкой таблицы истинности можно
вычислить выражение f=q?(r?0:1):(р?0:1), который построен на
основе BDD для функции 𝑓. В этом примере использование BDD позволяет
вычислить значение булевой функции, выполнив всего две операции (в
соответствии с глубиной BDD), в то время как при ее вычислении по
аналитическому представлению требуется 4 операции.
Пример. OBDD для функции голосования 𝑚
x
y
y
z
0
1
Сложность представления функции с помощью OBDD существенно
зависит от порядка переменных. Так, например, OBDD для функции
равенства двоичных наборов
𝐸𝑄𝑛 (𝑥1 , … , 𝑥𝑛 , 𝑦1 , … , 𝑦𝑛 ) = (𝑥1 ~𝑦1 )(𝑥2 ~𝑦2 ) ⋯ (𝑥𝑛 ~𝑦𝑛 )
будет содержать 3𝑛 внутренних вершин, если выбран порядок чтения
переменных (𝑥1 , 𝑦1 , … , 𝑥𝑛 , 𝑦𝑛 ). Однако при использовании «естественного
порядка» (𝑥1 , … , 𝑥𝑛 , 𝑦1 , … , 𝑦𝑛 ) сложность соответствующей OBDD будет уже
экспоненциальной. Открытой проблемой остается нахождение алгоритма,
дающего оптимальный порядок переменных булевой функции с точки зрения
представления этой функции упорядоченной BDD.
5.2. Основные операции над BDD-представлениями
Сначала
рассмотрим
алгоритм
построения
(редуцированных) BDD, поскольку они
допускают
реализацию многих важных операций над BDD.
Алгоритм включает применение двух правил:
сокращенных
эффективную
 Правило исключения – если обе дуги от вершины 𝑣 ведут к
вершине 𝑤, то вершину 𝑣 можно исключить, заменив ее на 𝑤.
 Правило склеивания – если вершины 𝑣 и 𝑤 помечены одной и
той же переменной, а их нулевые и единичные дуги ведут к
одним и тем же потомкам, то 𝑣 и 𝑤 могут быть склеены.
Существует метод редукции BDD 𝐺, основанный на указанных
правилах и требующий времени порядка 𝑂(𝐺). Однако обычно редукция не
применяется самостоятельно, а выполняется в процессе синтеза BDD.
Пусть булевы функции 𝑓(𝑥1 , … , 𝑥𝑛 ) и 𝑔(𝑥1 , … , 𝑥𝑛 ) заданы в виде
сокращенных (редуцированных) BDD 𝐺𝑓 и 𝐺𝑔 , использующих один и тот же
порядок чтения переменных. Тогда имеет место следующие оценки
сложности операций над 𝑓 и 𝑔:
 Вычисление функции 𝑓 на входном наборе (𝑎1 , … , 𝑎𝑛 ) требует
времени 𝑂(𝑛);
 Проверка выполнимости функции 𝑓 требует времени 𝑂(1);
 Определение числа выполняющих наборов функции 𝑓,
подстановка константы вместо переменной и проверка
фиктивности переменной требуют времени 𝑂(|𝐺𝑓 |);
 Проверка эквивалентности 𝐺𝑓 и 𝐺𝑔 требует времени 𝑂(|𝐺𝑓 | +
|𝐺𝑔 |).
5.2.2. Синтез BDD
Пусть булевы функции 𝑓(𝑥1 , … , 𝑥𝑛 ) и 𝑔(𝑥1 , … , 𝑥𝑛 ) заданы в виде
сокращенных (редуцированных) BDD 𝐺𝑓 и 𝐺𝑔 , использующих один и тот же
порядок чтения переменных, а ⊗ - это некоторая булева функция от двух
аргументов. Задача синтеза заключается в построении BDD 𝐺ℎ для функции
ℎ = 𝑓 ⊗ 𝑔.
Для решения данной задачи применяется модифицированный алгоритм
синтеза конечных автоматов. Временная сложность данного алгоритма имеет
порядок 𝑂(|𝐺𝑓 | ⋅ |𝐺𝑔 |).
Отметим, что к настоящему времени разработаны многочисленные
программные пакеты, позволяющие выполнять операции над BDD, равно как
и решать вопросы переупорядочивания, синтеза и пр. Ссылки на наиболее
известные пакеты приведены в конце данной главы.
5.3. Проблема верификации моделей программ и систем
Рассматривается задача верификации дискретно-автоматных динамических
систем вида D(p1,…,pn), где p1,…,pn – булевские параметры, изменяющиеся
во время функционирования системы. Предполагается, что каждому
возможному состоянию s системы D соответствует некоторый набор
параметров P(s) из p1,…,pn, ¬p1,…,¬pn , такой, что для каждого i=1,…,n либо
pi , либо ¬pi входит в P(s). Если pi ϵ P(s) , то считается, что параметр pi в
состоянии s истинен, а если ¬pi ϵ P(s) , то считается, что параметр pi в
состоянии s ложен.
Переходы из состояний в последующие состояния в таких системах
происходят в дискретные моменты времени.
5.3.1. Проблема "фермер, волк, коза и капуста"
Эта головоломка состоит в том, что фермер должен переправить через реку с
левого берега на правый волка, козу и мешок капусты. Кроме фермера,
который только один и может управлять лодкой, лодка может выдержать
дополнительно что-то одно— либо волка, либо козу, либо мешок капусты.
Решение проблемы осложняется тем, что без присмотра фермера нельзя козу
оставлять с волком, а капусту — с козой.
Хотя система, в которой мы хотим найти решение, совсем не
дискретная, для решения этой головоломки можно построить абстрактную
дискретную модель — некоторый граф, и исследовать на нем возможные
пути. Вершины графа будут соответствовать состояниям системы. Ребра
графа будут соответствовать возможным переходам между состояниями, т.е.
возможным переправам через реку. Эта модель не будет учитывать ни
времени нахождения системы в каком-либо состоянии (например, пока
фермер отдыхает после очередной переправы), ни времени переправы.
Состоянием системы будем считать состояние всех четырех
действующих объектов. Введем булевы переменные: f- описывает состояние
фермера, w — состояние волка, g — состояние козы и с — состояние
капусты. Их значения: f = 0 — фермер на левом берегу, f = 1 — фермер на
правом берегу; то же для волка, козы и капусты.
Пример. Состояние (f=1, w = 0, g = 0, с=1) говорит о том, что фермер с
капустой находятся на правом берегу, а волк с козой ждут на левом. Будем
такое состояние обозначать множеством
{f ,w,g, c}. Множество
{¬f,¬w,g,c} будет соответствовать состоянию, при котором фермер и волк
находятся на левом берегу, а коза и капуста – на правом (выполняющий
набор f=0,w=0,g=1,c=1).
Множество {¬f,¬w,¬g,¬c}
будет соответствовать начальному
состоянию, в котором все персонажи находятся на левом берегу (его
выполняющий набор f=0,w=0,g=0,c=0). Целевому состоянию — все
персонажи находятся на правом берегу— будет соответствовать множество
{f,w,g,c}.
Ребра графа определяют возможные изменения состояний системы, т.
е. переправы через реку. Эти переправы характеризуются тем, что только
фермер может управлять лодкой. Поэтому, например, из состояния
{f,w,g,c} можно перейти только в два состояния: в состояние
{f,w,g,c} (фермер, который находился на правом берегу, переехал на
левый берег один) или в состояние {f ,w,g,c} (фермер переехал на левый берег с капустой, которая находилась на том же берегу, что и он).
На
возможные состояния системы
должно быть наложено
ограничение. Его можно выразить формулой Con(f,w,g,c) = (g≡w) v (g≡c) →
(g ≡f) — в каждом состоянии если коза находится на том же берегу, что и
волк или капуста, то фермер находится на этом же берегу. Наша задача
определить, имеется ли путь из начального состояния в целевое состояние,
проходящий только по допустимым состояниям.
В данном конкретном случае приемлемым решением головоломки
является явное построение графа из всех допустимых состояний и
возможных переправ между ними, а затем поиск пути между начальной и
целевой вершинами. Этот метод здесь работает, т.к. число вершин в графе не
превысит 16, и число ребер также будет не очень большим.
Другое дело, когда мы имеем дело с системами, возможные состояния
которых исчисляются миллионами, а число ребер - сотнями миллиардов.
Тогда для нас будет очень затруднительно явно построить граф,
моделирующий функционирование системы.
Сейчас на примере решения данной головоломки мы покажем, как
можно решать подобные задачи, не прибегая к явному построению
моделирующего графа.
Все возможные переходы для этой системы определяются четырьмя
условиями. Фермер может перевести с одного берега на другой либо:
1. Только себя
2. Себя и волка
3. Себя и козу
4. Себя и капусту.
Пусть переменные f,w,g,c описывают состояние системы до перехода, а
переменные f’,w’,g’,c’ – описывают состояние системы после перехода.
Тогда первое правило описывается формулой
R1(f,w,g,c, f’,w’,g’,c’) = (f’≡¬f)&(w’≡ w)&(g’≡ g)&(c’≡ c).
Второе правило описывается формулой
R2(f,w,g,c, f’,w’,g’,c’) = (f’≡¬f)& (f≡w)& (w’≡ ¬w)&(g’≡ g)&(c’≡ c).
Третье правило описывается формулой
R3(f,w,g,c, f’,w’,g’,c’) = (f’≡¬f)& (f≡g)& (g’≡ ¬g) & (w’≡ w) &(c’≡ c).
Четвертое правило описывается формулой
R4(f,w,g,c, f’,w’,g’,c’) = (f’≡¬f)& (f≡c) &(c’≡¬ c) & (g’≡ g) & (w’≡ w).
Поэтому булева функция, описывающая все возможные переходы в
этой системе, есть R0 (f,w,g,c, f’,w’,g’,c’) = R1(f,w,g,c, f’,w’,g’,c’) V
R2(f,w,g,c,f’,w’,g’,c’) V R3(f,w,g,c, f’,w’,g’,c’) V R4(f,w,g,c, f’,w’,g’,c’).
Упорядочив переменные этих формул следующим образом
f, f’,w, w’,g, g’,c, c’ , можно построить последовательно компактные
BDD формул R1, R2, R3, R4, R0.
Так BDD формулы R1 будет содержать всего 14 вершин и иметь не
более 2-х вершин на каждом уровне.
Булева функция, описывающая все возможные переходы между
допустимыми состояниями этой системы, будет задаваться формулой
R (f,w,g,c, f’,w’,g’,c’) = R0 (f,w,g,c, f’,w’,g’,c’)& Con(f’,w’,g’,c’).
Теперь построим последовательно булевы формулы Di (f,w,g,c,
f’,w’,g’,c’), описывающие отношение «состояние {f’,w’,g’,c’} достижимо из
состояния
{f,w,g,c} не более, чем за i переходов».
𝐷1 (𝑓, 𝑤, 𝑔, 𝑐, 𝑓’, 𝑤’, 𝑔’, 𝑐’) = 𝑅 (𝑓, 𝑤, 𝑔, 𝑐, 𝑓’, 𝑤’, 𝑔’, 𝑐’).
𝐷𝑖 + 1 (𝑓, 𝑤, 𝑔, 𝑐, 𝑓’, 𝑤’, 𝑔’, 𝑐’) = 𝐷𝑖 (𝑓, 𝑤, 𝑔, 𝑐, 𝑓’, 𝑤’, 𝑔’, 𝑐’) ∨
Ǝ𝑥1, 𝑥2, 𝑥3, 𝑥4 (𝐷𝑖 (𝑓, 𝑤, 𝑔, 𝑐, 𝑥1, 𝑥2, 𝑥3, 𝑥4) & 𝑅 (𝑥1, 𝑥2, 𝑥3, 𝑥4, 𝑓’, 𝑤’, 𝑔’, 𝑐’).
Процесс построения этих формул заканчивается на некотором шаге k
при выполнении условия Dk+1 (f,w,g,c, f’,w’,g’,c’) = Dk (f,w,g,c, f’,w’,g’,c’),
которое легко проверяется, т.к. обе эти формулы находятся в BDD.
Здесь операция квантификации означает следующее:
Ǝ𝑥 𝐹(𝑥, 𝑦) = 𝐹(0, 𝑦) 𝑉 𝐹(1, 𝑦).
Обозначим Dk (f,w,g,c, f’,w’,g’,c’) через R* (f,w,g,c, f’,w’,g’,c’).
Легко видеть, что исходная головоломка имеет решение т.и.т.т., когда
R*(0,0,0,0, 1,1,1,1) =1.
После того, как мы убедились, что задача имеет решение, можно найти
и саму последовательность S1,…, Sm состояний, такую, что S1 – начальное
состояние {0,0,0,0}, Sm – целевое состояние{1,1,1,1}, и для каждого i=1,…,
m-1между состояниями Si и Si+1 имеется переход. Здесь m –минимальное
число, для которого Dm (0,0,0,0, 1,1,1,1) =1, а Dm-1 (0,0,0,0, 1,1,1,1) =0.
Предположим, что состояние Sj = {aj1,aj2,aj3,aj4} мы уже определили.
Тогда
в качестве Sj+1 , j=1,…,m-1, можно взять любой набор значений
переменных f,w,g,c, для которого следующая формула выполнима:
R (aj1,aj2,aj3,aj4, f,w,g,c) & Dj+1 (0,0,0,0, f,w,g,c) & ¬Dj (0,0,0,0, f,w,g,c) &
Dm-j-2 (f,w,g,c, 1,1,1,1) .
Таким образом, используя BDD для представления булевых функций,
нам удалось найти решение задачи, не прибегая к явному построению графа,
описывающего работу системы.
5.3.2. Модели дискретно-автоматных динамических систем
Моделью поведения такой системы может служить ориентированный граф
G=<V,R,P,v0>, каждой вершине vϵV которого соответствует некоторое
возможное состояние системы s(v) c соответствующим набором параметров
P(s(v)). R – множество ребер, такое что каждому ребру rϵR, из вершины v в
вершину v’, соответствует возможный переход из состояния s(v) в состояние
s(v’). v0 – вершина графа, соответствующая начальному состоянию s0
системы D.
Дадим несколько естественных определений.
w-путем в графе G будем называть последовательность сколь угодно
большой длины вершин u1,u2,…,un,… , такую, что из каждой вершины ui
исходит ребро в вершину ui+1 .
Заметим, что произвольная вершина может входить в w-путь сколько
угодно раз.
Участком пути [v,v’) назовем последовательность вершин u1,u2,…,un, такую
что u1=v, из каждой вершины ui исходит ребро в вершину ui+1 и из вершины
un имеется ребро в вершину v’.
Пример. Рассмотрим двухпроцессную программу взаимного исключения.
Каждый процесс Pi , i=1,2, может находиться в одном из трех состояний:
критическая секция (Ci), секция запроса (Ti) и некритическая секция (Ni).
Процесс начинается в некритической секции и указывает, что хочет
войти в критическую секцию, путем входа в секцию запроса. Он остается в
секции запроса до тех пор, пока не получит доступ к критической секции. Из
критической секции процесс переходит в некритическую секцию.
Моделью данной программы может быть следующий граф:
Каждой вершине соответствуют состояния программы, в которых
истинны указанные в вершинах переменные, и в которых установлена
указанная очередь запросов процессов для попадания в критическую секцию.
Красные дуги соответствуют изменению состояний программы при
активности первого процесса, синие дуги соответствуют изменению
состояний программы при активности второго процесса.
5.3.3. Язык CTL
Требования к правильному функционированию дискретно-автоматных
динамических систем удобно записывать в виде формул языка CTL.
Определение формулы языка CTL.
1. Для любого параметра p системы D выражение p – есть формула
языка CTL.
2. Если f и g – формулы языка CTL, то f v g, ¬f, ¬g – формулы языка
CTL.
3. Если f – формула языка CTL, то конструкции AX(f), EX(f), AG(f),
EG(f), AF(f), EF(f) – также являются формулами языка CTL.
4. Если f и g – формулы языка CTL, то конструкции AU(f,g) , EU(f,g) –
также являются формулами языка CTL.
Определим семантику конструкций языка CTL.
Значением произвольной формулы f является некоторое множество Mf
вершин графа G, в которых данная формула будет истинной (точнее в
состояниях, соответствующих этим вершинам).
Дадим определение множества Mf в соответствии с индуктивным
определением формулы языка CTL.
1. Если f=p и p-параметр системы D, то Mf состоит из всех вершин v
графа G, таких что pϵP(s(v))
2.
Оператор ¬f. Пусть формула f истинна на множестве вершин Mf графа
G. Тогда множество вершин M¬f, на которых истинна формула ¬f, является
дополнением множества Mf до V (множества всех вершин графа G).
Оператор fvg. Пусть формула f истинна на множестве вершин Mf графа
G, а формула g истинна на множестве вершин Mg графа G. Тогда множество
вершин Mfvg, на которых истинна формула fvg, является объединением
множеств Mf и Mg.
3.
Оператор AX. Пусть формула f истинна на множестве вершин Mf
графа G.
Тогда множество вершин MAX(f), на которых истинна формула AX(f),
состоит из вершин, у которых все дочерние вершины принадлежат Mf.
Оператор ЕX. Пусть формула f истинна на множестве вершин Mf
графа G.
Тогда множество вершин MEX(f), на которых истинна формула EX(f),
состоит из вершин, у которых хотя бы одна дочерняя вершина принадлежит
Mf.
Оператор AG. Пусть формула f истинна на множестве вершин Mf
графа G.
Тогда множество вершин MAG(f), на которых истинна формула AG(f),
состоит из вершин v, у которых все w-пути, начинающиеся в v, состоят
только из вершин, принадлежащих Mf.
Оператор EG. Пусть формула f истинна на множестве вершин Mf
графа G.
Тогда множество вершин MEG(f), на которых истинна формула EG(f),
состоит из вершин v, у которых есть w-путь, начинающийся в v, состоящий
только из вершин, принадлежащих Mf.
Оператор AF. Пусть формула f истинна на множестве вершин Mf
графа G.
Тогда множество вершин MAF(f), на которых истинна формула AF(f),
состоит из вершин v, у которых все w-пути, начинающиеся в v, содержат
вершину, принадлежащую Mf.
Оператор EF. Пусть формула f истинна на множестве вершин Mf
графа G.
Тогда множество вершин MEF(f), на которых истинна формула EF(f),
состоит из вершин v, у которых есть w-путь, начинающийся в v,
содержащий вершину, принадлежащую Mf.
4.
Оператор AU(f,g). Пусть формула f истинна на множестве вершин Mf
графа G, а формула g истинна на множестве вершин Mg графа G. Тогда
множество вершин M AU(f,g), на которых истинна формула AU(f,g), состоит из
вершин v, у которых все w-пути, начинающиеся в v, содержат вершину v’,
принадлежащую Mg, так, что все вершины, расположенные на участке пути
[v,v’), принадлежат Mf.
Оператор EU(f,g). Пусть формула f истинна на множестве вершин Mf
графа G, а формула g истинна на множестве вершин Mg графа G. Тогда
множество вершин M EU(f,g), на которых истинна формула EU(f,g), состоит из
вершин v, у которых имеется w-путь, начинающийся в v, содержащий
вершину v’, принадлежащую Mg, так, что все вершины, расположенные на
участке пути [v,v’), принадлежат Mf.
Определение. Формулу f языка CTL будем считать истинной на графе G,
если начальная вершина графа v0 принадлежат Mf.
Пример (продолжение 1). Приведем требования к работе двухпроцессной
программы, описанной выше, и соответствующие им формулы языка CTL.
Т1. «Оба процесса не могут находиться в критической секции
одновременно»: AG[¬(C1 ᴧ C2)].
Т2. «Процесс, который хочет попасть в критическую секцию, когда-
нибудь сможет сделать это»: AG[T1 →AF(C1)] & AG[T2 →AF(C2)] .
Т3. «Процессы должны строго чередоваться в получении доступа к
критической секции»:
AG[C1 → AU (C1, ((N1 v T1) & AU ((N1 v T1), C2)))] &
AG[C2 → AU (C2, ((N2 v T2) & AU ((N2 v T2), C1)))].
Т4. «При любом возможном развитии, первый процесс бесконечно
часто входит в критическую секцию»:
AG(AF(C1)).
Отметим, что одни операторы языка CTL могут быть выражены через
другие.
В качестве базовых операторов, через которые выражаются все
остальные операторы языка CTL, можно, например, взять операторы ¬f, fvg,
EX(f), EG(f),EU(f,g).
Остальные операторы языка CTL могут быть выражены через базовые
с помощью формул.
AX (f) = ¬EX(¬f)
EF (f) = EU (1, f)
AF(f) = ¬EG(¬f)
AG(f) = ¬EF(¬f)
AU(f, g) = ¬EU (¬g, ¬g&¬f) & ¬EG(¬ g).
5.3.4. Верификация динамических систем методом Model Checking
Задача
верификации
дискретно-автоматных
динамических
систем
формулируется следующим образом.
Дан граф G=<V,R, P,v0>, представляющий модель некоторой
дискретно-автоматной динамической системы D(p1,…,pn). Сформулированы
требование к правильному функционированию этой системы в виде формулы
f языка CTL. Требуется проверить, истинна ли формула f на графе G.
Эта задача решается последовательным вычислением множеств Mf1, …
, Mfm, где f1,…,fm – список всех подформул формулы f, частично
упорядоченный отношением подформульности, т.е. если fi есть подформула
fj, то i<j.
Очевидно, что нам достаточно рассмотреть три случая,
соответствующих базовым операторам языка CTL, с помощью которых
формула fi строилась из своих подформул.
1. fi = EX(h).
Пусть множество Mh уже построено. Тогда множество Mfi будет
состоять из вершин, из которых исходят ребра в вершины, принадлежащие
множеству Mh.
2. fi = EG(h).
Пусть множество Mh уже построено. В множество Mfi мы должны
включить все вершины, из которых существует бесконечный путь,
состоящий из вершин из множества Mh. Это мы можем сделать с помощью
следующей процедуры.
Положим Q0 = V –все вершины графа G.
Пока Qj+1 ≠ Qj построим множество
Qj+1 = Qj ∩ {v-вершина графа G | vϵ Mh и существует ребро из v в
некоторую вершину из Qj }.
Очевидно, что описанная процедура всегда закончит свою работу, т.к.
на каждом ее промежуточном шаге число вершин в множестве Qj+1 меньше
числа вершин в множестве Qj. Так что на некотором шаге j равенство будет
достигнуто.
Положим Mfi = Qj.
3. fi = EU(h,g).
Пусть множества Mh и Mg уже построены.
В множество Mfi мы должны включить все вершины, из которых
существует путь, состоящий из вершин из множества Mh , заканчивающийся
в вершине из множества Mg. Это мы можем сделать с помощью следующей
процедуры.
Положим Q0 = Mg.
Пока Qj+1 ≠ Qj построим множество
Qj+1 = Qj U {v-вершина графа G | vϵ Mh и существует ребро из v в
некоторую вершину из Qj }.
Очевидно, что описанная процедура всегда закончит свою работу, т.к.
на каждом ее промежуточном шаге число вершин в множестве Qj+1 больше
числа вершин в множестве Qj. Так что на некотором шаге j равенство будет
достигнуто.
Положим Mfi = Qj.
Пример (продолжение 2). Проверим истинность требований на модели.
Требование Т1. Т1=AG[¬(C1 ᴧ C2)] – данная формула эквивалентна
следующей формуле, содержащей только базовые операторы:
AG[¬(C1 ᴧ C2)] = ¬EF(C1 ᴧ C2) = ¬ EU (1,(C1 ᴧ C2)).
Последовательно будем перечислять подформулы данной формулы и
указывать состояния, в которых истинна рассматриваемая подформула.
f1 = C1. Очевидно, M1 = { 4, 8 }.
f2 = C2. Очевидно, M2 = { 7, 9 }.
f3 = f1 ᴧ f2. Рассмотрим пересечение данных множеств и выберем те
состояния, которые встречаются в обоих множествах: M3 = {}.
f4 = EU (1, f3). Сначала добавляем все состояния из M3, далее
состояния, из которых есть переход в M3. Таких состояний нет. M4 = {}.
f5 = ¬f4. Очевидно, M5 = { All }.
Множество M5 содержит начальное состояние, а это означает, что
данная формула выполняется на модели.
Подобным
образом
устанавливается
соответствующих требованиям Т2 и Т3.
истинность
формул,
Требование Т4. Т4=AG(AF(C1)). Данная формула эквивалентна
следующей формуле, содержащей только базовые операторы:
AG(AF(C1)) = ¬E U (1,¬(AFC1))= ¬EU (1, EG(¬C1)).
Последовательно будем перечислять подформулы данной формулы и
указывать состояния, в которых истинна рассматриваемая подформула.
f1 = C1. Очевидно, M1 = { 4, 8 }.
f2 = ¬f1. Очевидно, M2 = { 1, 2, 3, 5, 6, 7, 9 }.
f3 = EG(f2), выбираем состояния принадлежащие циклу, во всех состояниях
которого выполняется f2: M3 = { 1, 3, 7}.
f4 = EU(1, f3). Сначала в M4 помещаем все состояния, в которых выполняется
f3. Далее добавляем те состояния, у которых есть переходы, которые ведут в
состояния из M4. M4 = { All }.
f5 = ¬f4. Очевидно, M5 = {}.
Так как получившееся множество M5 не содержит начального
состояния, то данная формула не выполняется на этой модели.
Действительно, если идти по синим стрелочкам из начального
состояния, то мы никогда не попадем в состояния, в которых выполняется
C1.
Легко видеть, что если граф G задан явно и полностью, то алгоритм
верификации будет иметь линейную сложность как по размеру графа G, так и
по длине формулы языка CTL, описывающей требования к работе системы.
На практике этот алгоритм работает достаточно быстро.
Однако для большинства интересных динамических систем явное
построение графа G вызывает затруднение, в связи с тем, что число
параметров системы определяется многими параллельными процессами,
реализуемыми в системе, а размер графа от числа параметров зависит
экспоненциально.
Возникает задача реализовать алгоритм верификации, не строя явно
граф G. Такие алгоритмы верификации называются неявными или
символьными.
5.3.5. Предпосылки для символьной верификации
1. Переходы между состояниями s и s’ системы D, могут быть описаны
булевой формулой вида R(x1,…,xn, x’1,…,x’n), где x1,…,xn – булевы
переменные, соответствующие параметрам состояния s, а x’1,…,x’n – булевы
переменные, соответствующие параметрам состояния s’. А формула
R(x1,…,xn, x’1,…,x’n) в свою очередь должна иметь экономное представление
в виде BDD.
2. Для BDD имеются эффективные процедуры для выполнения
действий:
а) проверки равенства булевых функций f(x1,…,xn)= g(x1,…,xn)
б) подстановки констант в булевы функции
f(x1,…,xn) {xi/c} =f(x1,…,xi-1, c, xi+1,…,xn)
в) вычисления стандартных булевых операций
дизъюнкции f(x1,…,xn) v g(x1,…,xn) ;
отрицания ¬f(x1,…,xn);
проекции Ǝy1,…,yn f(x1,…,xn ,y1,…,yn).
Операцию проекции можно понимать так Ǝy h(x,y) = h(x,0) v h(x,1) .
Хотя над BDD она может быть реализована более эффективным способом.
5.3.6. Символьный алгоритм верификации
Нам дана BDD для булевой формулы R(x1,…,xn, x’1,…,x’n), описывающей
возможные переходы между вершинами в графе G, и формула f языка CTL,
описывающая требования на правильное функционирование исходной
динамической системы. Нам надо проверить истинность этой формулы на
графе G (явного представления которого у нас нет).
Напомним, что
ранее задачу верификации мы решали
последовательным вычислением множеств Mf1, … , Mfm, где f1,…,fm – список
всех подформул формулы f, частично упорядоченный отношением
подформульности, т.е. если fi есть подформула fj, то i<j. Каждое множество
Mfi –являлось множеством вершин, в которых истинна подформула fi .
Сейчас каждое множество Mfi мы будем представлять булевой
функцией Mfi(x1,…,xn), которая будет принимать значение истинна только на
тех значениях параметров системы D, которым соответствуют вершины
графа G, в которых формула fi языка CTL будет истинной.
Строить булевы формулы Mfi (x1,…,xn) мы будем в виде BDD.
Очевидно, что нам достаточно рассмотреть три случая,
соответствующих базовым операторам языка CTL, с помощью которых
формула fi строилась из своих подформул.
1. fi = EX(h).
Тогда Mfi (x1,…,xn)= Ǝ x’1,…,x’n (R(x1,…,xn, x’1,…,x’n)& Mh (x’1,…,x’n)).
2. fi = EG(h).
Организуем процедуру.
Положим Q0 (x1,…,xn)= 1.
Пока Qj+1 (x1,…,xn) ≠ Qj(x1,…,xn) будем строить BDD функции
Qj+1 (x1,…,xn)= Qj(x1,…,xn) & Ǝ x’1,…,x’n (R(x1,…,xn, x’1,…,x’n) & Mh (x1,…,xn)&
Qj(x’1,…,x’n)).
После того, как будет достигнуто равенство, положим
Mfi (x1,…,xn)= Qj(x1,…,xn).
3. fi = EU(h,g).
Организуем процедуру.
Положим Q0 (x1,…,xn)= Mg (x1,…,xn).
Пока Qj+1 (x1,…,xn) ≠ Qj(x1,…,xn) будем строить BDD функции
Qj+1 (x1,…,xn)= Qj(x1,…,xn) v Ǝ x’1,…,x’n (R(x1,…,xn, x’1,…,x’n) & Mh (x1,…,xn)&
Qj(x’1,…,x’n)).
После того, как будет достигнуто равенство, положим Mfi (x1,…,xn)=
Qj(x1,…,xn).
После того, как формула Mf(x1,…,xn) будет построена, достаточно будет
проверить ее истинность на наборе параметров, соответствующих
начальному состоянию системы.
Эти символьные алгоритмы, использующие эффективный способ
представления дискретных данных (множеств и отношений) в виде булевых
функций в форме BDD, позволяют увеличить число состояний
верифицируемых систем до астрономических значений. Метод верификации
моделей динамических систем, основанный на символьных алгоритмах, стал
сегодня стандартным этапом технологии разработки микропроцессоров и
встроенных систем во многих фирмах. Существуют также свободно
распространяемые верификаторы, работающие на основе символьной
верификации (например, SMV и NuSMV, разработанные в университете
Карнеги-Меллона).
5.4. BDD-подход к решению некоторых задач биоинформатики
В современной биоинформатике генные сети являются одним из наиболее
интенсивно изучаемых объектов. Формально генная сеть задается
ориентированным помеченным графом, вершины которого трактуются как
некие «биологические элементы», имеющие разную степень концентрации.
Числовые показатели в вершинах генной сети могут меняться во времени в
соответствии с протекающими в ней эволюционными процессами. При этом
сеть может быть разнородной в том смысле, что различные ее фрагменты,
называемые регуляторными контурами, могут функционировать в
соответствии с различными правилами.
Итак, функционирование регуляторного контура генной сети
определяется динамикой изменения показателей концентрации в его
вершинах в каждый такт времени в зависимости от структуры всей сети и
свойств функций, сопоставляемых вершинам. Мы будем рассматривать
эволюцию сети как последовательность «состояний», переходы между
которыми определяются структурой контура и включают в себя отображения
на множестве векторов с числовыми компонентами. Такие отображения
называются автоматными.
Одной из важных в практическом плане является проблема поиска
неподвижных точек автоматных отображений. Такие точки определяют
некоторые стационарные состояния генной сети. Сейчас мы опишем задачу
поиска неподвижных точек в одном классе сетей.
Пусть G=<V,R> - ориентированный связный граф без петель и кратных
дуг.
V={v1,…,vn}. Каждой вершине vi приписано некоторое целое число рi,
называемое ее весом и задающее концентрацию белка в данной вершине.
Будем считать, что все pi ϵ{0,…, p-1}, где число p>1 определяет верхнюю
границу значения веса для всех вершин графа G и называются значностью.
Состояние графа G в момент времени t определяется набором целых
чисел s(t) =<p1(t),p2(t),…,pn(t)> , где pi(t) – вес вершины vi в момент времени
t.
Функция перехода AG из состояния s(t) в состояние s(t+1) может быть
задана по-разному. В ряде работ рассматривался класс генных сетей, для
которых функция переходов AG задавалась следующими соотношениями:
pi(t+1) = pi(t) + 1, если все входящие в vi вершины имеют вес равный 0
и pi(t) < p-1,
pi(t+1) = pi(t) - 1, если хотя бы одна входящая в vi вершина имеет вес больше
0 и pi(t) > 0,
pi(t+1) = pi(t), иначе.
Пример. На рисунке представлен один такт функционирования подобной
сети. Граф слева задает регуляторный контур генной сети в начальном
состоянии. Римские числа – вершины графа, арабские – концентрация
вещества в вершинах. Значность p=5. Граф справа описывает состояние, в
которое переходит генная сеть при однократном применении функции
перехода AG. Мы видим, что вершины IV и V уменьшили концентрацию,
вершина I увеличила концентрацию, вершины II и III концентрацию не
изменили.
Задача поиска неподвижных точек произвольного автоматного
отображения AG заключается в нахождении таких векторов весов вершин
графа G, которые данным отображением переводятся сами в себя.
Введем булевы переменные:
c<i,r> - означает, что в начальный момент времени вершина vi имеет
вес r,
i=1,…,n; r=0,…,p-1.
c’<i,r> - означает, что в следующий момент времени вершина vi имеет
вес r,
i=1,…,n; r=0,…,p-1.
Рассмотрим следующие формулы.
1). Ф1= &[i=1,…,n] ( U(c<i,0>,…, c<i,p-1>) & U(c’<i,0>,…, c’<i,p-1>)),
где формула U(x1,…,xn) означает, что ровно одна из переменных
x1,…,xn принимает значение истина.
2) Для вершины vi обозначим Mi ={j1,…,jki} – множество номеров
вершин, из которых исходят ребра, входящие в vi. Для каждого i=1,…,n
построим следующие формулы, описывающие условия, входящие в описание
функции перехода AG.
Di ≡ c< j1,0>&…&c< jki,0> & (c<i,0>v…v<i,p-2>),
Ei ≡ (c< j1,1>v…v c< j1,p-1>)&…&(c< jki,1>v…v c< jki,p-1>) &
& (c<i,1>v…v<i,p-1>),
Ф2 = &[i=1,…,n] (Di & Ei) .
3). Опишем функцию перехода для каждой вершины vi.
Ф3 = &[i=1,…,n] ( &[j=0,…,p-2] (Di & c<i,j>→c’<i,j+1>) &
&[j=1,…,p-1] (Ei & c<i,j>→c’<i,j-1>) &
(¬Di & ¬Ei & c<i,j> → c’<i,j>))
Построим формулу
ФAG(c<1,0>,…, c<1,p-1>, c<2,0>,…, c<2,p-1>, …, c<n,0>,…, c<n,p-1>,
c’<1,0>,…, c’<1,p-1>, c’<2,0>,…, c’<2,p-1>, …, c’<n,0>,…, c’<n,p-1>) =
Ф1 & Ф2 & Ф3.
Пусть N=n*p. Тогда каждое состояние генной сети может быть описано
значениями N булевых переменных x1,…,xN, которые интерпретируются как
c<1,0>,…, c<1,p-1>, c<2,0>,…, c<2,p-1>, …, c<n,0>,…, c<n,p-1>, функция
переходов – булевой формулой ФAG (x1,…,xN , x’1,…,x’N), где переменные
x’1,…,x’N интерпретируются как
c’<1,0>,…, c’<1,p-1>, c’<2,0>,…, c’<2,p1>, …, c’<n,0>,…, c’<n,p-1>.
Утверждение. Состояние генной сети, соответствующее значениям
булевых переменных x1,…,xN, является неподвижной точкой тогда и только
тогда, когда формула ФAG (x1,…,xN , x1,…,xN) является выполнимой.
Одним из достоинств BDD-подхода является то, что построив BDDпредставление формулы ФAG, мы сможем получить описание сразу всех
неподвижных точек генной сети.
Кроме того, построив BDD – представление для формулы
ФA2G (x1,…,xN , x1,…,xN) = Ǝy1…ƎyN (ФAG (x1,…,xN , y1,…,yN) &
ФAG (y1,…,yN , x1,…,xN)) мы получим описание всех состояний, которые
переходят в себя в результате 2-х переходов. Аналогично можно получить
описание всех состояний, которые переходят в себя в результате k переходов.
Литература к разделу 5.
1. Wegener I. - Branching Programs and Binary Decision Diagrams. –
Springer. – 2010
2. Карпов Ю.Г. Model checking. Верификация параллельных и
распределенных программных систем. «БХВ-Петербург». 2010. 551с.
3. С.Э.Вельдер, М.А.Лукин, А.А. Шалыто, Б.Р. Яминов. Верификация
автоматных программ. «Наука». Санкт-Петербург. 2011. 245с.
4. А.А. Евдокимов, С.Е. Кочемазов, А.А. Семенов. Применение
символьных вычислений к исследованию дискретных моделей
некоторых классов генных сетей //Вычислительные технологии Том 16,
№1, 2011. сс. 30-47.
5. ABCD by Armin Biere
http://fmv.jku.at/abcd/.
6. BuDDy by Jørn Lind-Nielsen
http://sourceforge.net/projects/buddy/
7. CMU BDD, BDD package, Carnegie Mellon University, Pittsburgh
http://www.cs.cmu.edu/~modelcheck/bdd.html
8. CUDD: BDD package, University of Colorado, Boulder
http://vlsi.colorado.edu/~fabio/CUDD/
9. JavaBDD
http://javabdd.sourceforge.net/
10.The Berkeley CAL package
http://embedded.eecs.berkeley.edu/Research/cal_bdd/
11.TUD BDD by Stefan Höreth
http://www.rs.e-technik.tu-darmstadt.de/~sth/
12.Vahidi's JDD
http://javaddlib.sourceforge.net/jdd/
Download