
- •ВВЕДЕНИЕ
- •Глава 1. ЛОГИКА ВЫСКАЗЫВАНИЙ
- •§1. Высказывание. Логические операции
- •§ 2. Пропозициональные буквы, связки и формы (формулы логики высказываний). Построение таблиц истинности
- •§ 3. Упрощения в записях пропозициональных форм
- •§ 4. Тавтологии (общезначимые формулы). Противоречия
- •§ 5. Равносильность пропозициональных форм
- •§ 6. Важнейшие пары равносильных пропозициональных форм
- •§ 7. Зависимости между пропозициональными связками
- •§ 8. Нормальные формы
- •§ 9. Совершенные нормальные формы
- •§ 10. Булева (переключательная) функция
- •§ 11. Приложение алгебры высказываний к анализу и синтезу контактных (переключательных) схем
- •§ 12. Приложение алгебры высказываний к анализу и синтезу схем из функциональных элементов
- •§ 13. Вопросы и темы для самопроверки
- •§ 14. Упражнения
- •Глава 2 ЛОГИКА ПРЕДИКАТОВ
- •§ 1. Понятие предиката
- •§ 2. Кванторы
- •§ 3. Формулы логики предикатов
- •§ 4. Интерпретация. Модель
- •§ 5. Свойства формул в данной интерпретации
- •§ 6. Логически общезначимые формулы. Выполнимые и равносильные формулы
- •§ 8. Правила перестановки кванторов
- •§ 9. Правила переименования связанных переменных
- •§ 10. Правила вынесения кванторов за скобки. Предваренная нормальная форма
- •§ 11. Вопросы и темы для самопроверки
- •§ 12. Упражнения
- •Глава 3. ЛОГИЧЕСКОЕ СЛЕДСТВИЕ И МЕТОД РЕЗОЛЮЦИЙ
- •§ 1. Логическое следствие и проблема дедукции в логике высказываний
- •§ 2. Резольвента дизъюнктов логики высказываний
- •§ 3. Метод резолюций в логике высказываний
- •§ 4. Метод насыщения уровня
- •§ 5. Стратегия вычеркивания
- •§ 6. Лок-резолюция
- •§ 7. Метод резолюций для хорновских дизъюнктов
- •§ 8. Преобразование формул логики предикатов. Сколемовская стандартная форма
- •§ 9. Унификация
- •§ 10. Метод резолюций в логике предикатов
- •§ 11. Приложение метода резолюций для анализа силлогизмов Аристотеля.
- •§ 12. Использование метода резолюций в языке ПРОЛОГ
- •§ 13. Введение и использование правил в ПРОЛОГе
- •§ 14. Рекурсивное задание правил в ПРОЛОГе
- •§ 15. Особенности ПРОЛОГа
- •§ 16. Вопросы и темы для самопроверки
- •§ 17. Упражнения
- •Глава 4. ДЕДУКТИВНЫЕ ТЕОРИИ
- •§ 1. Понятие об эффективных и полуэффективных процессах (методах)
- •§ 2. Дедуктивные теории
- •§ 3. Свойства дедуктивных теорий
- •§ 4. Пример полуформальной аксиоматической теории - геометрия
- •§ 5. Формальные аксиоматические теории
- •§ 6. Свойства выводимости
- •§ 7. Исчисление высказываний (теория L)
- •§ 8. Некоторые теоремы исчисления высказываний
- •§ 9. Эквивалентность двух определений непротиворечивости
- •§ 11. Свойства исчисления высказываний
- •§ 12. Другие аксиоматизации исчисления высказываний
- •§ 13. Теории первого порядка
- •§ 14. Формальная арифметика (теория S)
- •§ 15. Свойства теорий первого порядка
- •§ 16. Значение аксиоматического метода
- •§ 17. Теория естественного вывода
- •§ 18. Вопросы и темы для самопроверки
- •§ 19. Упражнения
- •Глава 5. НЕКЛАССИЧЕСКИЕ ЛОГИКИ
- •§ 1. Трехзначные логики
- •§ 2. Многозначные логики
- •§ 3. Понятие нечеткого множества
- •§ 4. Нечеткие высказывания и максиминные операции над ними
- •§ 5. Понятие о нечеткой лингвистической логике
- •§ 6. Модальные логики
- •§ 7. Временные (темпоральные) логики
- •§ 8. Вопросы и темы для самопроверки
- •§ 9. Упражнения
- •Глава 6. ТЕОРИЯ АЛГОРИТМОВ
- •§1. Неформальное понятие алгоритма
- •§ 2. Алфавит. Слова. Алгоритм в алфавите. Вполне эквивалентные алгоритмы
- •§ 3. Нормальный алгоритм (алгоритм А. А. Маркова)
- •§ 4. Функции частично вычислимые и вычислимые по Маркову
- •§ 5. Замыкание, распространение нормального алгоритма
- •§ 6. Операции над нормальными алгоритмами
- •§ 7. Машина Тьюринга
- •§ 8. Задание машины Тьюринга
- •§ 9. Алгоритм Тьюринга. Вычислимость по Тьюрингу
- •§ 10. Связь между машинами Тьюринга и нормальными алгоритмами
- •§ 11. Основная гипотеза теории алгоритмов (принцип нормализации или тезис Черча)
- •§ 12. Проблема алгоритмической неразрешимости
- •§ 13. Примеры алгоритмически неразрешимых массовых проблем
- •§ 14. Сведение любого преобразования слов в алфавите к вычислению значений целочисленных функций
- •§ 15. Примитивно рекурсивные и общерекурсивные функции
- •§ 16. Примитивно рекурсивность некоторых функций. Частично - рекурсивные функции
- •§ 17. Ламбда-исчисление
- •§ 18. Основные результаты
- •§ 19. Вопросы и темы для самопроверки
- •§ 20. Упражнения
- •Глава 7. СЛОЖНОСТЬ ВЫЧИСЛЕНИЙ С ПОМОЩЬЮ АЛГОРИТМОВ
- •§ 1. Понятие о сложности
- •§ 2. Временная сложность вычислений (алгоритма)
- •§ 3. Полиномиальные алгоритмы и задачи. Класс Р
- •§ 4. NP класс
- •§ 5. NP-полные и NP-трудные задачи
- •§ 6. Класс Е
- •§ 7. Ёмкостная (ленточная) сложность алгоритма
- •§ 8. Вопросы и темы для самопроверки
- •§ 9. Упражнения
- •ЛИТЕРАТУРА
- •ПРИЛОЖЕНИЯ
- •Варианты типового задания
- •Тесты для самоконтроля
- •Тест по логике высказываний (тест № 1)
- •Тест по логике предикатов (тест № 2)
- •Тест по логическому следствию и методу резолюций (тест № 3)
- •Тест по дедуктивным теориям (тест № 4)
- •Тест по теории алгоритмов (тест № 5)
- •Тест по неклассическим логикам и сложности вычислений (тест № 6)
- •Ответы к тестам самоконтроля
225
|
Временная |
Максимальный размер задачи |
|
Алгоритм |
сложность |
|
|
|
алгоритма |
до ускорения |
после ускорения в 10 раз |
А1 |
N |
S1 |
10 S1 |
А2 |
N log2 N |
S2 |
10 S2 |
А3 |
N2 |
S3 |
3,16 S3 |
А4 |
N3 |
S4 |
2,15 S4 |
А5 |
2N |
S5 |
S5+3,3 |
Из последней таблицы видно, что увеличение быстродействия в 10 раз даёт возможность для алгоритма А1 увеличить размер входа в 10 раз, а для алгоритма А5 увеличение размера входа практически не произошло. Таким образом, чем большую временную сложность имеет алгоритм, тем меньшее улучшение даёт увеличение быстродействия.
§ 3. Полиномиальные алгоритмы и задачи. Класс Р
Считается, что алгоритм – полиномиальный или имеет полиномиальную временную сложность, если существует полином p(x) такой, что на любом входном слове длины n алгоритм завершает вычисления после выполнения не более чем p(n) операций.
Ясно, что, алгоритмы А1 и А2, временные сложности которых равны, например, 0(n3/2) и 0(n2logn) будет считаться полиномиальными, ибо их сложности ограничены полиномами, т.е. имеют порядок не выше, чем 0(n2) и 0(n3) соответственно.
Говорят, что задача разрешима за полиномиальное время или полиномиально разрешима, если для неё существует полиномиальный алгоритм. При этом считается, что задача является «хорошей».
Множество всех задач, для каждой из которых существует полиномиальный алгоритм, называется классом Р.
Среди полиномиальных алгоритмов быстрыми являются линейные алгоритмы, которые обладают сложностью порядка n, где n – размерность входных данных. К линейным алгоритмам относится школьный алгоритм нахождения суммы десятичных чисел, каждое из которых состоит из n цифр. Сложность этого алгоритма – 0(n).
В класс Р кроме линейных задач попадают, например, следующие задачи.
Умножение целых чисел. Школьный метод умножения 2-х n-разрядных чисел имеет временную сложность порядка 0(n2). Существует алгоритм Шёнхаге-Штрассена умножения чисел (заданных в двоичной системе счисления) с меньшей сложностью, именно со сложностью порядка 0(n log2 n log2 log2 n). Подробнее см. ниже.
226
Умножение матриц. Обычный метод имеет порядок сложности 0(n3). Существует более быстрый алгоритм умножения матриц - алгоритм
Штрассена [2] который имеет сложность порядка 0( nlog2 7 ).
Найти кратчайший путь на графе состоящем из n вершин и m рёбер. Сложность алгоритма 0(mn) [28].
Быстрое преобразование Фурье требует 0(n log2 n) арифметических операций [2].
Задача Прима – Краскала – Кэли. Дано n городов. Нужно соединить все города телефонным кабелем так, чтобы общая длина кабеля была минимальной. Эта задача решается с помощью жадного алгоритма сложности 0(nlog2 n) [28].
Нахождение эйлерова цикла в графе с m рёбрами. Алгоритм нахождения эйлерова цикла имеет сложность порядка 0(m), см., например, [22]
Задачи, для которых не существует полиномиального алгоритма, считаются трудно разрешимыми.
Рассмотрим пример определения сложности вычислений (алгоритма) на примерах.
Пусть задано множество S, содержащее n действительных чисел. Требуется найти наибольший и наименьший элементы из S. Положим, что каждое одно сравнение двух любых чисел осуществляется за одинаковое время.
Один из возможных методов состоит в поиске сначала наибольшего элемента из S, а затем – наименьшего. Наибольший элемент можно найти, проводя n-1 сравнений, например по следующему алгоритму.
begin
MAX←произвольный элемент из S; for все другие элементы х из S do if x>MAX then MAX←x;
end.
В результате n-1 сравнений найдётся наибольший элемент. Заметим, что не учитывается время на выборку элемента. Далее начинается поиск наименьшего элемента по аналогичному алгоритму. Если считать эти процедуры независимыми, то вновь потребуется n-1 сравнений. В итоге для нахождения наибольшего и наименьшего элементов из S потребуется 2n-2 сравнений.
Число необходимых сравнений можно уменьшить, если использовать принцип «разделяй и властвуй», который в теории алгоритмов называют ещё стратегией дублирования.
Стратегия дублирования состоит в следующем. Пусть размер задачи (размер входных данных задачи) равен n. Разобьём задачу на две подзадачи размера n/2 той же структуры, что и исходная задача. Если решения этих задач можно скомбинировать в решение исходной задачи, то получится эффективный алгоритм.
227
Рассмотрим, как стратегия дублирования даёт ускорение для решения предыдущей задачи. Положим, что число элементов множества S является степенью числа 2, т.е. n=2k, для некоторого k, k≥1.
Реализуем рекурсивный поиск, при котором множество S разбивается последовательно на два подмножества по следующей процедуре MAXMIN.
procedure MAXMIN(S):
1.if S =2 then begin
2.пусть S={a,b};
3.return(MAX(a,b),MIN(a,b))
end else
begin
4.разбить S на два равных подмножества S1 и S2;
5.(max1, min1)←MAXMIN(S1);
6.(max2, min2)←MAXMIN(S2);
7.return(MAX(max1, max2). MIN(min1, min2))
end
В этой процедуре сравнения происходят только на 3-ем шаге, где сравниваются два элемента множества S из которых оно и состоит, и на шаге 7, где сравниваются max1 с max2 и min1 с min2. Пусть Т(n) – число сравнений элементов множества S. Ясно, что Т(2)=1. Если n>2, то Т(n) – общее число сравнений, произведённых в двух вызовах процедуры MAXMIN (строка 5 и 6), работающих на множествах размера n/2 и ещё два сравнения в строке 7. Таким образом,
|
1, |
|
если |
n = 2, |
(7.1) |
Т(n)= |
|
+ 2, |
если |
n > 2. |
|
2T(n/2) |
|
Решением рекуррентных уравнений (7.1) служит функция Т(n)=(3/2)n-2. Таким образом, вместо 2n-2 сравнений получили (3/2)n-2 сравнений чисел, т.е на (n/2) сравнений меньше.
Рассмотрим второй пример. Пусть требуется умножить два n разрядных двоичных чисел. При традиционном (школьном) алгоритме требуется 0(n2) битовых операций. Применим стратегию дублирования и разобьем числа х и у на две равные части:
х = |
a |
b |
y = |
|
|
c |
d |
Считаем, что n есть степень числа 2. Тогда
xy=(a2n/2+b)(c2n/2+d)=ac2n+(ad+bc)2n/2+bd. (7.2)
228
Равенство (7.2) даёт способ вычисления ху с помощью четырёх умножений (n/2) разрядных чисел и нескольких сложений и сдвигов (умножений на степень числа 2). Можно получить, что вместо 0(n2) битовых операций нужно
0( nlog2( 3 ) ) ≈ 0(n1,59) битовых операций. Здесь число разбивалось на два блока. Разбивая эти числа на большее число блоков можно получить, что умножение двух чисел имеет сложность 0(n log2n log2 log2n) для алгоритма Шёнхаге-Штрассена [2].
Абстрактной моделью полиномиального алгоритма является так называемая детерминированная машина Тьюринга. Эта машина в каждый данный момент времени находится в строго определённом состоянии, за один шаг она совершает одно из некоторого конечного множества действий. Затем она переходит в следующее состояние и всё начинается вновь, пока не придёт к ситуации останова.
§ 4. NP класс
Наиболее простыми считаются полиномиальные задачи, т.е. задачи класса Р.
Другим, возможно более широким, «сложностным классом» является класс NP. Эта аббревиатура обозначает выражение «разрешимых на Недетерминированной машине Тьюринга за Полиномиальное время». Класс NP стали впервые изучать Эдмонде, Кук и Кири. Оказалось, что многие известные задачи принадлежат к NP классу.
Вобычных машинах Тьюринга (их называют детерминированными, чтобы отличать от недетерминированных) новое состояние, в которое машина переходит на очередном шаге, полностью определяется текущим состоянием и тем символом, который обозревает головка на ленте.
Внедетерминированных машинах Тьюринга для каждого состояния может быть несколько следующих состояний, в соответствии с функцией перехода. И в каждом следующем состоянии запускается новая копия данной машины Тьюринга.
Недетерминированность лучше всего понять, рассматривая алгоритм, который производит вычисления до тех пор, пока не доходит до места, в котором должен быть сделан выбор из нескольких альтернатив. Детерминированный алгоритм исследовал бы сначала одну альтернативу, а потом вернулся для рассмотрения следующей альтернативы. Недетерминированный алгоритм может исследовать все альтернативы одновременно, «копируя», в сущности, самого себя для каждой альтернативы. Все копии работают независимо. Если копия обнаруживает, что данный путь безрезультатный, то она прекращает выполняться. Если копия находит требуемое решение, она объявляет об этом, и все копии прекращают работать.

229
Определим NP класс как класс задач, которые можно решить недетерминированными алгоритмами, работающими в течение полиномиального времени.
Чтобы доказать, что некоторая задача принадлежит классу NP, достаточно построить недетерминированный алгоритм (алгоритм недетерминированной машины Тьюринга), который решает эту задачу за полиномиальное время.
Пусть имеем, например, задачу выяснения существования в ориентированном графе гамильтонового цикла, длина которого меньше или равна M.
Рассмотрим следующий алгоритм.
begin
v1 ← 1 |
{Пункт отправления} |
S ← {2,3,…,n} |
{Множество вершин которые нужно |
Длина пути ← 0 |
посетить} |
{Общая длина пути} |
|
nv← 1 |
{Число пройденных вершин} |
{Пусть преемник (vnv) обозначает допустимое, (не содержащее паразитных циклов) множество вершин, в которые можно попасть из vnv}
while преемник (vnv) ≠ do begin
vnv-1 ← ВЫБОР(преемник (vnv)); nv← nv+1;
Длина пути ← Длина пути + длина дуги (vnv-1, vnv) end
if nv=n and Длина пути ≤ M then успех else неудача
end
В этом алгоритме рассмотрение каждого варианта, т.е. последовательности соединённых дугами вершин v1, vi2, vi3,…vin требует n шагов. Следовательно, каждая процедура ВЫБОР (иначе каждая копия алгоритма просмотра одного пути) работает не более, чем полиномиальное время, точнее имеет сложность порядка 0(n). Таким образом, задача выяснения существования в ориентированном графе гамильтонового цикла, длина которого меньше или равна M, является NP задачей.
Детерминированная машина Тьюринга является частным случаем недетерминированной машины Тьюринга (которая не имеет копий), поэтому имеем, что P NP.
Вопрос о том, будет ли P=NP является открытой проблемой теории сложности. Широко распространено мнение, что P ≠ NP, следовательно,
P NP.
230
Примеры задач из класса NP:
1)выяснение выполнимости формулы логики высказываний, записанной в к.н.ф.;
2)нахождение целочисленных решений системы линейных
уравнений;
3)задача распознавания простого числа;
4)выяснение гамильтоновости графа;
5)задача коммивояжёра;
6)размещение обслуживающих центров (телефон, телевидение, срочные службы) для максимального числа клиентов при минимальном числе центров;
7)оптимальный раскрой (бумага, стальной прокат, отливка), оптимизация маршрутов в воздушном пространстве, инвестиций, станочного парка;
8)составление расписаний, учитывающих определённые условия;
9)оптимальная загрузка ёмкости (рюкзак, поезд, корабль, самолёт) при некоторых условиях;
10)динамическое распределение памяти. Раскроем эту проблему.
Пусть заданы А – множество элементов данных, размер s(a) Z+, Z+={1,2,3,…}, каждого элемента данных а А, время поступления r(a) Z0+,
Z0+={0,1,2,3,…} и время d(a) Z+ окончания работы с элементом данных а А,
положительное целое число D – размер области памяти. Вопрос. Существует ли для множества элементов данных допустимое распределение памяти? Иначе говоря, существует ли такая функция σ: А→{1,2,3,…}, что для каждого элемента а А интервал
l(a)=[σ(a), σ(a)+s(a)-1]
содержится в [1, D], причём для любых а, а* А, если l(a)∩ l(a*)≠, то либо d(a)≤ r(a*), либо d(a*)≤ r(a).
В случае, когда размеры всех элементов данных одинаковы, то задача решается за полиномиальное время [10];
11) организация памяти в виде корневого дерева. Задача состоит в следующем [10]. Заданы конечное множество Х, набор С={X1,X2,…,Xn} подмножеств множества Х, положительное целое число K. Вопрос. Существует ли такой набор С={X1*, X2*,…,Xn*} подмножеств множества Х,
n
что Xi Xi* при всех i, 1≤ i ≤ n, ∑ Xi* \Xi ≤ K и существует
i=1
ориентированное корневое дерево Т(х,А), в котором элементы каждого из подмножеств Xi*, 1≤ i ≤ n, образуют ориентированный путь?
12) достаточность числа регистров для реализации циклов. Задача состоит в следующем. Заданы множество V параметров циклов, длина цикла
N Z+, для каждого параметра v начальное время s(v) Z0+ и
продолжительность l(v) Z+, целое положительное число K. Вопрос. Достаточно ли K регистров для запоминания параметров циклов? Иными