You are on page 1of 79

Московский авиационный институт

(государственный TEXнический университет)

Факультет прикладной математики

Кафедра вычислительной математики и программирования

Подготовка к экзамену по курсу «Логическое программирование»

Студент: И. К. Никитин
Преподаватели: Д. В. Сошников
М. А. Левинская

Москва, 2009

Содержание
I

Основы
1
Парадигмы . . . . . . . . . . . . . . . . . . .
2
Логика предикатов 1-го порядка . . . . . . .
2.1
Семантика логики предикатов . . . .
3
Исчисление предикатов 1-го порядка . . . .
4
Понятие о полноте . . . . . . . . . . . . . . .
5
неразрешимость исчисления . . . . . . . . .
6
Нормальные формы . . . . . . . . . . . . . .
7
Унификация . . . . . . . . . . . . . . . . . .
7.1
Правила . . . . . . . . . . . . . . . . .
8
Правило вывода modus tollens . . . . . . . .
8.1
modus tollens . . . . . . . . . . . . . .
8.2
Резолюция . . . . . . . . . . . . . . .
9
Метод резолюции . . . . . . . . . . . . . . .
9.1
Стратегии резолюции . . . . . . . . .
9.2
SLD-резолюция . . . . . . . . . . . . .
10 SLD-интерпретатор . . . . . . . . . . . . . .
10.1
Стратегии обхода дерева вывода при
11 Cемантика . . . . . . . . . . . . . . . . . . .
12 Отрицание . . . . . . . . . . . . . . . . . . .
12.1 SLDNF-резолюция . . . . . . . . . . .
12.2
Предикат not . . . . . . . . . . . . .

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
поиске решений.
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

II Prolog
13 Пролог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.1 Основные смысловые объекты программы . . . . . . . . . . .
14 Oбъекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15 Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.1 Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.2 Представление и вычисление арифметических выражений . .
15.3 Определяемые пользователем операторы . . . . . . . . . . . .
15.4 Представление предикатов и правил структурными термами
16 Циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

4
4
7
8
9
12
13
14
16
17
18
18
18
20
20
21
22
22
23
25
25
26

.
.
.
.
.
.
.
.
.

27
27
27
29
31
31
31
32
33
34

17
18
19

16.1
repeat. . . . . . . . . .
16.2
for. . . . . . . . . . .
Перебор и отсечение . . . . .
read, write, nl . . . . . . . . .
asserta-setof . . . . . . . . . .
19.1 asserta/assertz, retract
19.2 findall, bagof/setoft . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

III Cтруктуры данных
20 Представление списков . . . . . . . . . . . . .
21 Oбработки списков 1 . . . . . . . . . . . . . .
21.1 определение длины . . . . . . . . . . .
21.2 взятие n-ого элемента . . . . . . . . . .
21.3 принадлежность элемента списку . . .
21.4 добавление элемента . . . . . . . . . . .
21.5 конкатенация списков . . . . . . . . . .
21.6 применение extend . . . . . . . . . . . .
22 Oбработки списков 2 . . . . . . . . . . . . . .
22.1 удаление элемента . . . . . . . . . . . .
22.2 определение подсписка . . . . . . . . .
22.3 перестановки . . . . . . . . . . . . . . .
23 Порядковое представление списков в Прологе
23.1 Операции . . . . . . . . . . . . . . . . .
24 Разностные списки . . . . . . . . . . . . . . . .
24.1 Разностный список . . . . . . . . . . .
24.2 Хвостовая рекурсия . . . . . . . . . . .
24.3 Хвостатизация . . . . . . . . . . . . . .
24.4 Примеры . . . . . . . . . . . . . . . . .
25 Деревья . . . . . . . . . . . . . . . . . . . . . .
26 Сбалансированные деревья . . . . . . . . . . .
27 Представления графов . . . . . . . . . . . . .
27.1 В глубину . . . . . . . . . . . . . . . . .
27.2 В ширину . . . . . . . . . . . . . . . . .
IV Методы

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

35
35
36
38
39
39
40

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

42
42
45
45
45
45
46
46
46
47
47
48
49
50
51
52
52
52
52
53
55
58
61
61
62
63

2

. . . . . . . . . . . .28 29 30 31 32 33 34 35 36 Генерации. . . . . . . . . . . . . 78 3 . . . . . . . . . . . . . . . . . . . . .1 Метод генерации и проверок . . .2 Метод ветвей и границ . . . . . . . . . . . . . . . . . . . . . . . Пространство состояний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Символьные вычисления . . . . . . . . . . . . . . . . 63 63 63 64 69 70 71 72 73 74 75 V Приложение 76 1 Общие вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ветви и границы . . . . . . . . . . . . . . . . Подходы к символьному упрощению выражений Языки . . . . . . . . . . . . . . . . . . . . . . . . . . Расширение . . . . . . проверки. . . . . . . . . . . . . . . . . . 28. . Сокращения перебора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3 Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 2 Статистика . . Операторы . . . . . . . . . . 28. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Условия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

I. Присваивание 2. Логическое программирование как алгоритмическая модель. Ввод-вывод Правила комбинирования 1. Композиция 2. альтернативная модели Тьюринга — фон Неймана Парадигма Императивная Принцип Модель: Машина фон Неймана основанная на Тьюринге. Декларативные языки программирования как альтернатива императивным. Примитивные операторы 1. присваивание 3. непрозрачная семантика 2. Условная ция компози- 3. естественное соответствие архитектуре − 1. постановка задачи . Вопрос 1.1 I Основы логического программирования 1 Парадигмы Различные парадигмы программирования и подходы к определению вычислимости. Программы представляют из себя набор примитивных инструкций. контекст (область видимости) 4. Циклическая композиция 4 + 1. комбинируемых определённым образом.

Программа представляет собой набор подстановок применяемых в соответствии с определёнными правилами ко входной строке для получения результата. Программы представляют собой строго формализованную постановку задачи. ∃ невычислимые функции. Стиль программирования. Ситуационная Модель: Нормальные алгоритмы Маркова. Вопрос 1.2 Логическая Модель: Математическая логика. при котором решение задачи или алгоритм решения генерируется компьютером автоматически. Естественный способ описания. Выполнение инициализируется запросом на нахождение значений переменных. удовлетворяющих какому-нибудь предикаты или формуле. формализм более высокого порядка чем логическое программирование реализация: перевод описания на декларативном языке в классический императивный алгоритм. называют декларативным Эквивалентность моделей Множество потенциальных задач шире. Процедуры манипулируют описание других процедур. чем множество алгоритмов.I. Она достаточно формальна и позволяет формулировать свойства. Логика предикатов первого порядка. которые невозможно вычислить при помощи алгоритмов в известных алгоритмических моделях. реализация: перевод описания на декларативном языке в классический императивный алгоритм. Множества вычислимых функций в алгоритмических моделях: 5 . а для решения необходимо только формальное описание. Функциональная Модель: λ –исчисление. Теоремма 1.

I. Доказывается через эмуляцию. Эффективно вычислимая функция – вычислимая при помощи наформального алгоритма как последовательность дискретных элементарных шагов. детерминированная и конечная. Множество функций вычислимых в соответствующей алгоритмической модели. Вопрос 1.3 • машина Тьюринга • исчисление предикатов первого порядка • Нормальные алгоритмы Маркова • рекурсивные функции Черча совпадают. 6 . Теоремма 2 (Теорема Тьюринга-Чёрча). Док-во. совпадает с множеством эффективно вычислимых функций. Определение 1.

Логика предикатов первого порядка: 1. фиксированных функций. максимально близкой к человеческой логике неформальных рассуждений и известна ещё со времён античности. . Понятие логического следствия |=. 2 Вопрос 2. и предикатов. Логика высказываний (или пропозициональная логика) — это формальная теория. В свою очередь является частным случаем логики высшего порядка. Расширяет логику высказываний.I. Функциональные символы f (x1 . xn ) как аргументы предикатов. Логика первого порядка (исчисление предикатов) – формальное исчисление. Понятия выполнимости и общезначимости. Определение 2. Определение 3. Предикаты (высказывание зависящее от параметров) 2. основным объектом которой служит понятие логического высказывания.1 Логика предикатов 1-го порядка Логика предикатов 1-го порядка. . Связанные переменные и кванторы (∀. допускающее высказывания относительно переменных. С точки зрения выразительности. Семантика логики предикатов. её можно охарактеризовать как классическую логику нулевого порядка. ∃) 3. 7 . . Логика высказываний является простейшей логикой.

о. . an } Определение 4. Формула F называются общезначимой |= F если она истина во всех интерпретациях. 2. F}) Т. ℵf . . .2 Семантика логики предикатов Предполагают что ∃ область интерпретации D.I. Формулы: • Замкнутые (не содержит вхождений свободных переменных) – Придать значения из области интерпретации всем предметным константам ai : ℵa : {ai } → D – Придать смысл всем функциональным символам (n) ℵf : {fi } → (Dn → D) – Придать значения всем предикатным символам (n) ℵp : {Pi } → (Dn → {T. Формула F называются выполнимой если она истина хотя бы в одной интерпретации. Определение 6. ℵa .1 Вопрос 2. A |= B ⇔|= A ⊃ B 8 . An |= B ⇔ A1 ∧ · · · ∧ An |= B Теоремма 3. ℵp i • Не замкнутые (зависит от некоторого набора переменных { x1 . . Формула B следует из формулы A A |= B если в любой интерпретации для которой истинно A оказывается истинным и B Можно распространить на произвольное количество высказываний A1 . . интерпретация ℵ = hD. . . . xn }) – Однозначная интерпретация невозможна – Вводится понятие оценки на наборе {a1 . . Определение 5.

. Формула f выводимая в формальной аксиоматической системе `f если Γ0 ` f 9 . Правило вывода modus ponens. . . Алфавит A = {A0 .I. Вывод формулы f из множества формул Γ — последовательность {f0 . fn = f } где fi получается применением правил вывода к некоторым формулам из Γ ∪ {f0 . . An } некоторое конечное не пустое множество символов 2. . . . В этом случае говорят. . Выводимость (`) в формальной аксиоматической системе. 3 Вопрос 3. Правил вывода позволяют получить из нескольких правильно построенных формул заключения Определение 8. . . Формальная аксиоматическая система 1. Множество правильно построенных формул Φ ⊆ A∗ задаётся грамматикой 3. fn = f } Определение 9. что формула f выводимая из множества Γ Γ`f Определение 10. . Понятие о формальной аксиоматической системе.1 Исчисление предикатов 1-го порядка Исчисление предикатов 1-го порядка. . Определение 7. Множество аксиом Γ0 ⊆ Φ 4.

(∀x)F и (∃x)F – правильные со связанной x 10 . ∨. P – предикативный символ арности n. Терм: (a) Предметная константа ai ∈ M – Уникальный объект предметной области (b) Переменная xi (c) Функциональный терм f (t1 . (. ¬. Множество правильно построенных формул • Атомарная формула P (t1 .2 Определение 11. Алфавит A= {∃.I. ⊃} ∪ Символы предикатов ∪ Символы термов Определение 12. ti – термы • ¬A A∨B A∧B A⊃B правильные формулы • Если F – правильная формула со свободной x то. ∧. . Вопрос 3. . tn ). ). . tn ). арности n. ti – термы 2. . ∀. Исчисление предикатов – формальная аксиоматическая система с синитаксисом логики предикатов 1.

Множество аксиом Из логики высказываний: p ⊃ (q ⊃ p) (p ⊃ (q ⊃ r)) ⊃ ((p ⊃ q) ⊃ (p ⊃ r)) (¬p ⊃ ¬q) ⊃ (q ⊃ p) Новые: (∀x)A(x) ⊃ A(t) A(t) ⊃ (∃x)A(x) 4. A ⊃ B ` B • Новые (A не содержит свободных вхождений переменную x): A ⊃ B(x) ` A ⊃ (∀x)B(x) B(x) ⊃ A ` (∃x)B(x) ⊃ A • Правила замены (предикативная переменная на предикат) 11 .3 3.I.): A. Вопрос 3. Правила вывода • Из логики высказываний (modus ponens.

12 . Определение 15. 4 Вопрос 4. A ` B.I. Формальная: @A((` A) ∧ (` ¬A)) 2. Формула F называются выполнимой если она истина хотя бы в одной интерпретации. Связь логического вывода с общезначимостью. |= A ⇒` A Любая общезначимая формула выводима. Определение 14. • • Для высказываний: Γ. непротиворечивости и корректности логической системы. Семантическая (достоверность): ` A ⇒|= A Теоремма 4 (О Дедукции).1 Понятие о полноте Понятие о полноте. Формула F называются общезначимой |= F если она истина во всех интерпретациях. Полное исчисление – то в котором любая общезначимая формула выводима |= A ⇒` A Непротиворечивость 1. Полнота Определение 13. то Γ ` A ⊃ B Теоремма 5 (Гёделя о полноте ). Теорема о дедукции. при этом в процессе вывода не участвуют свободные переменные из A. A ` B ⇔ Γ ` A ⊃ B где Γ произвольное множество логики высказываний На основе теоремы: |= A ⇔` A • Для предикатов: Если Γ.

е. Невозможно полностью исследовать реальность формальными методами.I. содержащая формальную арифметику. Определение 16. ∃ такие истинные формулы |= F . За конечное время установим цепочку вывода для общезначимой формулы. не существует алгоритма установки общезначимости произвольной формулы логики предикатов. Полнота Теоремма 6 (Гёделя о полноте ). Теорема Геделя о неполноте формальной арифметики. не является полной теорией. Разрешимое исчисление – в котором. что ни F ни ¬F не являются выводимыми. Теорема Черча. |= A ⇒` A Любая общезначимая формула выводима. 13 . т. в соответствующем исчислении. Для не общезначимой опровергнуть ее общезначимость не удастся. 5 Вопрос 5. Методы: • Синтаксический (построение логического вывода) • Семантический (таблицы истинности) Теоремма 8 (Чёрча). Исчисление предикатов является неразрешимой теорией. Теоремма 7 (Гёделя о не полноте ).е. который по произвольной формуле за конечное время выдаст соответствующий результат.1 Алгоритмическая неразрешимость исчисления предикатов Алгоритмическая неразрешимость исчисления предикатов. ∃ алгоритм проверки выводимости произвольной формулы в этом исчислении. Если некоторая формула выводима в исчислении предикатов то факт ее выводимости можно установить при помощи перебойного алгоритма(Строим цепочки всевозможных выводов). алгоритм. Любая прикладная теория первого порядка. т.

I. Сведение формул логики предикатов к фразам Хорна. Устранение конфликтов между именами связанных переменных • Выберем самый левый ∃ • заменяем ∃ со связанной переменной на не входящий в формулу функциональный символ • Пока остался хотя бы 1 ∃ повторяем алгоритм 14 . а соответствующая переменная заменяется на константу. . ♥xn )F (x1 . xn ) ♥ ∈ {∃. Литера – атомарная формула или ее отрицание Определение 18. Определение 17. 6 Вопрос 6. Перенос кванторов в начало формулы 2. ∀} F не содержит кванторов Скулемова (СНФ) Квантор ∃ удаляется. Дизьюнкты Хорна. 1. Дизъюнкт – формула из дизъюнкции литер Форма КНФ Вид Конъюнкция дизъюнкции элементарных Приведение Дистрибутивность A ∨ (B ∧ C) ≡ (A ∨ B) ∧ (A ∨ C) де Морган ¬(A ∨ B) ≡ ¬A ∧ ¬B ¬(A ∧ B) ≡ ¬A ∨ ¬B Определения (A ⊃ B) = ¬A ∨ ¬B (A ≡ B) = (A ∧ B) ∨ (¬A ∧ ¬B) Предваренная (ПНФ) (♥x1 .1 Нормальные формы Нормальные формы (КНФ. . . Скулемовская и клаузальная). .

15 . Приведение к СНФ 3. ¬P ()}. Отбрасывание ∀ (для компактности) 4. Приведение к КНФ 5. Приведение к ПНФ Ai ∈ {P ().I. A ∨ = ¬B1 ∨ · · · ∨ ¬Bn ∨ = ¬(B1 ∧ · · · ∧ Bn ) ∨ (¬X ∨ Y = = (B∧ · · · ∧ Bn ) ⊂ ¬B1 ∨ · · · ∨ ¬Bn A A (X ⊃ Y )) A Если пройти в обратном порядке. получаем сведение формул логики предикатов к дизъюнкту Хорна. Запись дизъюнктов в виде множества формул в КлНФ Дизъюнкт Хорна A ∨ ¬B1 · · · ∨ ¬Bn . 2. Основное ограничение: нет отрицания(¬) в посылках и заключениях. Клаузальная (КлНФ) Вопрос 6.2 Дизъюнкция литер A1 ∨ A2 · · · ∨ An . 1.

. . ϑ η ◦ (ξ ◦ ϑ) = (η ◦ ξ) ◦ ϑ 16 . Среди всех унификаторов данного множества выделяют так называемый наиболее общий унификатор. . yn /sn } вычеркиванием равенств вида xi = xi для 1 <= i <= k. Смысл унификации – выявлять эквивалентные формулы. рекурсивно). . y1 /s1 . xk /tk } и ξ = {y1/s1. что сначала действует η. xk /ξ(tk ). {x1 /ξ(t1 ). . которая получается из последовательности равенств. . . а потом ξ. Подстановка Θ = {X1 /t1 . Правила унификации сложных структур. если F Θ = GΘ. . Унификатор – подстановка Θ . поэтому произведение подстановок η и ξ будем обозначать через и η ◦ ξ. для 1 <= j <= l. . . . . . ti 6= Xi . yj = sj . Угифицирующиеся – формулы. yl /sl } – две подстановки. Определение 22. ξ. которые могут быть приведены одна к другой путем замены переменных. . для которых ∃ унификатор. а несколько.1 Унификация Унификация. . Xn /tn } где (∀i 6= j)Xi 6= Xj .I. . не один унификатор этого множества. . Определение 19. Определение 20. . Для любых подстановок η. Для обозначения результата действия подстановки на дизъюнкт мы применяем префиксную функциональную запись. 7 Вопрос 7. Тогда произведением подстановок η и ξ называется подстановка. . если yj ∈ x1. . подчёркивая тем самым. Определение 21. . . Если множество унифицируемо. Не из лекций: Пусть η = {x1 /t1 . для формул F и G. xk. то существует. как правило. Применение Θ к формуле или терму F (F Θ ) – Формула или терм (опр. где все Xi заменены на ti . .

1 Правила 1. Переменные. необходимые для приведения двух формул к идентичному виду. они связываются 2.2 Определение 23. если для любого унификатора τ того же множества литералов существует подстановка ξ такая. При унификации другой переменной. Наиболее Общий Унификатор (mgu) — содержит только замены. G). Чем угодно. Должны совпасть: (a) функциональный символ (b) арность (c) все аргументы попарно унифицируются Иначе унификации нет. 7.I. Только такой же константой. Константы. Предикаты. что τ = ξ ◦ σ Или проще: Определение 24. 3. Обозначают: Θ = mgu(F. Вопрос 7. 17 . Унификатор σ множества литералов или термов называется наиболее общим унификатором этого множества.

(M1 ∨ · · · ∨ Mk ) ∨ A ` (L1 ∨ · · · ∨ Ln ) ∨ (M1 ∨ · · · ∨ Mk ) L1 ∨ · · · ∨ Ln . Надо доказать A из посылок {B1 . что не требуется правил подстановки. Для доказательства методом резолюций используется метод опровержения. ¬A} 18 . Bn . применения резолюций. Bn } Пытаемся доказать противоречивость {B1 . Очень мощное правило. M1 ∨ · · · ∨ Mk – литеры. – понятие унификации позволяет автоматически находить подходящие правила.2 Резолюция • Простая ¬A ∨ B. 8. 8 Вопрос 8. ¬B ` ¬A • Расширенная (L1 ∨ · · · ∨ Ln ) ∨ ¬A.I. A – атомарная формула.1 modus tollens A ⊂ B. Посылки: (L1 ∨ · · · ∨ Ln ) ∨ ¬A. ¬B ` ¬A Если доказательство A ⊂ B верно. но ¬B. B). (M1 ∨ · · · ∨ Mk ) ∨ A Резольвента: (L1 ∨ · · · ∨ Ln ) ∨ (M1 ∨ · · · ∨ Mk ) • Обобщённая (L1 ∨ · · · ∨ Ln ) ∨ ¬A . (M1 ∨ · · · ∨ Mk ) ∨ A ` ((L1 ∨ · · · ∨ Ln ) ∨ (M1 ∨ · · · ∨ Mk ))Θ.1 Правило вывода modus tollens Правило вывода modus tollens. Простое и обобщённое правило резолюции. Достаточно для построения дедуктивной системы. Θ = mgu(A. то ¬A 8. Достигается за счет того.

2 При помощи метода резолюций пытаются получить пустой дизъюнкт  A.I. ¬A ⊂  19 . Вопрос 8.

SLD-резолюция. Стратегии: • Определение 26. Упорядоченная S-резолюция (R-резолюция) – важен порядок литер в дизъюнктах В качестве общего дизъюнкта используют самую левую литеру. • Определение 28.1 Стратегии резолюции Определение 25. Стратегии резолюции – метод. в соответствии с которым происходит выбор двух формул. подлежащих резолюции. С выбирающим правилом (S-резолюция) – литера для применения выбирается в соответствии с некоторым правилом.1 Метод резолюции Метод резолюции для реализации эффективного логического вывода в логических программах на основе фраз Хорна. Двойной перебор → один. Линейная (L-резолюция) – на каждом шаге используется формула. • Определение 27. Для первого шага в качестве посылки берётся добавленное к множеству формул отрицание доказываемого предположения. При реализации процедуры логического вывода на компьютере удаётся избежать лишнего перебора всех формул. 9 Вопрос 9. полученная на предыдущем. а так же позволяет избавиться от перебора всех литер данного дизъюнкта. SL-резолюция: • +: Эффективность • −: Ограничение общности ⇒ Вопрос полноты ⇒ Полнота достигается на дизъюнктах Хорна. Стратегии резолюции. Соответствующая резолюция – SLD-резолюция. При SL и R -резолюциях на каждом шаге одна из посылок применения нам известна.I. 9. 20 .

Основное ограничение: нет отрицания(¬) в посылках и заключениях. A ∨ = ¬B1 ∨ · · · ∨ ¬Bn ∨ = ¬(B1 ∧ · · · ∧ Bn ) ∨ (¬X ∨ Y = = (B∧ · · · ∧ Bn ) ⊂ ¬B1 ∨ · · · ∨ ¬Bn A A (X ⊃ Y )) A Если пройти в обратном порядке. 21 . получаем сведение формул логики предикатов к дизъюнкту Хорна.I.2 Вопрос 9. Дизъюнкт Хорна A ∨ ¬B1 · · · ∨ ¬Bn .2 SLD-резолюция Определение 29. SLD-резолюция – разновидность метода линейной резолюции. в котором для выбора второй посылки при выполнении резолютивного вывода используется некоторая детерминированная функция. Определение 30. 9.

Цель = формула найденная на предыдущем шаге. В случае необходимости поиска другого решения происходит откат назад (вверх) на 1 шаг – backtracking. позитивная литера которой унифицируется с целью. В общем случае SLD-резолюция не должна быть упорядочена. 10. в котором для выбора второй посылки при выполнении резолютивного вывода используется некоторая детерминированная функция. Процесс можно представить графически в виде дерева вывода. но стратегия выбора должна задаваться выбирающим правилом. 10 Вопрос 10. При поиске решения происходит исследование ветвей дерева. Рекурсивное описание: 1. SLD-резолюция – разновидность метода линейной резолюции. такую. Добавляем к множеству фактов отрицание цели. • иначе продолжить. шаги конъюнкции – линейная последовательность вершин. Ищем формулу. Наиболее короткие пути найдутся быстрее. 2. 22 . 3. • Обход в глубину от корня по некоторому направлени я. и исследование других возможных вариантов решения. • Обход в ширину на каждом уровне одновременно рассматриваются все возможные варианты.I. (стр. Дерево вывода.1 Стратегии обхода дерева вывода при поиске решений. Определение 31. Определение 32. Дерево вывода – дерево. Применяем резолюцию (modus tollens) для каждой удачной унификации: • если удалось получить пустой дизъюнкт ⇒ завершить. пока поиск не дойдёт до листа. в котором развилки возникают только в случае множественных вариантов доказательства. 61 в книжке). Механизм бэктрекинга. 4. Применяем этот же алгоритм. Это подчёркивает рекурсивную структуру SLD-вывода.1 Рекурсивное описание алгоритма работы SLD-резолютивного логического интерпретатора Рекурсивное описание алгоритма работы SLD-резолютивного логического интерпретатора. Стратегии обхода дерева вывода при поиске решений.

Логически эквивалентные программы могут выполняться по-разному. Семантика логических программ может отличаться от исходной семантики логических формул. Условие окончании рекурсии на 1 месте 2. Учёт: позволяет решить задачу. – Решение – логические следствия формул. Рекомендации: 1. – Решение – результат его работы. В рекурсивном определении. – Программа – последовательность команд для алгоритма вывода. Правильная программа: может работать не эффективно. 23 .1 Декларативная и процедурная семантика языка логического программирования Декларативная и процедурная семантика языка логического программирования. сначала не рекурсивные предикаты. 11 Вопрос 11. Учёт: позволяет повысить эффективность. Примеры. • Процедурная задаётся алгоритмом SLD-вывода и алгоритмом поиска.I. Семантика: • Декларативная – Программа – множество формул логики предикатов. Правильная программа: может быть бессмысленной. Учитывается процесс вывода.

Пример: Предикат предок: (∀X)(∀Y )(((∃Z)A(X. Y ) A(X. Z) A(X. d) НЕ Цель: ¬A(U. Y ) ∨ ¬P (X.2 Решение проблемы бесконечной рекурсии в различных языках: • ProLog Никак. Z) ∨ ¬P (X. Y ) Дерево с бесконечной левой веткой. Y )) ∨ P (X. Z) ∨ ¬P (X. – Хорошо A(X. Y ) Приедем к Хорну: – Плохо A(X. Вопрос 11. Y ) ∨ ¬A(X. b) P (a. Y )) ⊂ A(X. 24 .I. Факты: P (a. Программист должен описать максимально возможные режимы вызова предиката. d) • Mercury Автоматическая оптимизация процесса вывода. Выбираются предикаты приводящие к более ранней конкретизации переменных. Приходится использовать процедурные ухищрения. Y ) ∨ ¬A(X. Y ) ∨ ¬P (X. • DataLog Поиск в ширину. Z) Условие окончании рекурсии на 1 месте. c) P (c. Сложное выбирающее правило. Z) ∧ P (Z.

⇐ P не выводится при помощи доступных механизмов вывода. Отрицание по неуспеху ≡ логическому отрицанию. Обобщённая логическая программа — содержит ¬ в посылках правил. Некоторое утверждение A имеет конечное SLDдерево вывода. q :− q. q. SLDNF-резолюция. Пусть ρ логическая программа без отрицания. заканчивающегося неуспехом ⇔ comp(ρ) |= ¬A.I. Отрицание по неуспеху — отрицание некоторого утвер- • истина. Определение ждения P . ⇐ P выводится при помощи доступных механизмов вывода. которое не связано с текущим контекстом унификации (Лес). 33. Дополненная логическая программа comp(ρ) — для программы ρ ⊂ в предикатах заменено на ≡ в соответствии с CWA.1 1 2 3 4 SLDNF-резолюция p :− p.1 Отрицание в логическом программировании Отрицание в логическом программировании. Определение 34. только в предположении о замкнутости мира (CWA): (∀A) ` (` ¬A) отрицание по бесконечному неуспеху 12. Теоремма 9 (О достоверности и полноте ¬ по конечному неуспеху). где n глубина SLD-дерева неуспешного вывода. В логических программах невозможно эффективно реализовать отрицание. Определение 35. • ложь. 25 . Отрицание по неуспеху и предположение о замкнутости мира. Попытки доказать эти предикаты приводят к бесконечному дереву вывода. ⇒ Рассматривают нечто подобное по семантике. Из CWA ¬p оказывается не выводим. Каждое выражение стоящее под знаком отрицания требует отдельного доказательства. 12 Вопрос 12. ⇒ Введём более бедное отрицание по конечному неуспеху (` ¬A) ⇔ (∃N )n <= N .

!.fail. • Свойство полноты не выполнено • Свойство достоверности выполняется не всегда (не выполненное A ≡ ¬¬A ). • ¬A закончится не успехом ⇔ ∃ конечное дерево успешного вывода для A Процесс вывода представляет из себя лес.2 Алгоритм вывода ОЛП (SLDNF-резолюция) дополняет SLD-резолюцию: • ¬A закончится успехом ⇔ ∃ конечное дерево неуспешного вывода для A.I. not(_).2 1 2 3 Предикат not not(Predicate):− Predicate. Вопрос 12. Y ) 12. По одному дереву на каждое выражение под знаком отрицания. 26 . Y ) ≡ (∀X)(∀Y )¬parent(X. • Нарушается чистота логической программы (различные ответы при перестановке предикатов) • Нельзя использовать предикаты с отрицание для генерации значений ¬(∃X)(∃Y )parent(X.

13. константа ::= атом | число. оператор ::= функтор. Множество всех решений ищестся системой на основе backtracking’a ∃ множество систем логического программирования. которые удовлетворяют условиям.1 Основные смысловые объекты программы Термы: • Простые – Переменные – Константы ∗ Атомы ∗ Числа • Структурные Лексику Пролога можно описать грамматикой: терм ::= константа | функтор"(" терм {". Подобный подход берет начало в математической логике. большинство из них использует Пролог.1 II Язык программирование Prolog 13 Пролог как язык логического программирования Пролог как язык логического программирования. 27 . Логическая программа: • Декларативная часть – набор предложений. описывающий предметную область. Вопрос 13.II."терм}")" | оператор терм | терм оператор | терм оператор терм | "(" терм ")". Выполнение – поиск значений переменных. – факты – правила • Запросы – ответы на которые – результат. функтор ::= атом.

28 . все аргументы попарно унифицируются • Константа – с такой же константой. Вопрос 13.2 Унификация: • Свободная переменная – с произвольным термом и связывается • Связанная переменная – как значение с которым она связана • Функциональный терм Должны совпасть: 1. функциональный символ 2. арность 3.II.

• [^\<=>\-/]+ спецсимволы. построив формальную арифметику на аксиомах Пеано. При интерпретации заменяются внутренними ссылками. i. Y. 1 идентификатор ↔ 1 объект. _. структурные термы. Z). 29 .*) Область действия – 1 правило.*. X. 1 2 has_child(X):− parents(X. _). ii. константы. предикаты. m 1 2 has_child(X):− parents(X. • [’]. • Свободные Подразумевается изначально.*?[’] ∀ в апострофах. переменные. _). Простые (a) Переменные ([A-ZА-Я]. 14 Вопрос 14. Z). числа. термы. (b) Константы i.1 Основные объекты языка Пролог Основные объекты языка Пролог: атомы. has_child(X):− parents(Y. has_child(X):− parents(_. Числа ([0-9]+) Введены в явном виде исключительно для удобства. Можно обойтись и без них. Атомы Константы предметной области. X. – Значение меняется только при backtracking. Анонимные ([_]) Каждое вхождение обозначает новую переменную. • Связанные – Переменная связывается в результате унификации. • [a-zа-я].II. Термы: 1.

30 . Вопрос 14. Используют: сложные факты 1 появление(’Тоня␣Глоткина’.II.2 2. Структурные f (t1 . . 1989)) Графика: в виде дерева • появление – ’Тоня Глоткина’ – дата ∗ 11 ∗ июль ∗ 1989 Возможны рекурсивные определения. tn ). Обозначение: f /n. Предикаты – тоже структурные термы. дата(11. f – функтор арности n. июль. . .

2 Представление и вычисление арифметических выражений • =. из констант может содержать только числа 31 . 15. использование инфиксной и постфиксной записи вместо префиксной.1 Операторы Операторы. Определяемые пользователем операторы.II. Представление предикатов и правил структурными термами. Cвойства: • Учёт приоритета • Группировка скобками • Ассоциативность – Левая (+. • is. ∗. удобная запись арифметических выражений. −. правая часть должна быть правильным арифметическим выражением. Представление и вычисление арифметических выражений. вычисляет. создаёт структурный терм Интересный пример символьными вычислениями (стр.1 Операторы Для чего нужны: естественная. 88). 15 Вопрос 15. /) – Правая (степень) 15.

∗ никакая xfx. ∗ постфиксный fx. • Шаблон задаёт: – арность ∗ унарный fx. xfx. какая – не определено fy. 32 . xfy. yf. ∗ правая xfy. – ассоциативность если нет скобок. 15.2 Определяемые пользователем операторы Для объявления оператора используется встроенный системный предикат op. fx. fy.II. ∗ просто она есть. – позиционность ∗ префиксный xf. допускает: x – оператор более высокого приоритета y – оператор более высокого или равного приоритета ∗ левая yfx. ∗ инфиксный yfx. xf. yf.он 255. • Оператор – последовательность спецсимволов (<==>).3 Вопрос 15. xfx. xfy. yf. 255] (в классике). Чем больше число тем меньше реальный приоритет. <шаблон>. ∗ бинарный yfx. У :. Формат вызова: 1 :− op(<приоритет>. – функциональный символ (seq). fy. <оператор>) • Приоритет ∈ [0. xf.

и описывающие их • Факты • Правила являются структурными термами 1 2 3 4 resistance(par(X. R) :− resistance(X. RY) ) ) ) ). RY).3 Представление предикатов и правил структурными термами Элементы пролог программы такие как. RY) ). RX). Y). R is RX ∗ RY / (RX + RY). 33 . resistance(Y. . В префиксной нотации (lisp forewer): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 :− ( resistance(par(X. resistance(Y. RX). 15.( resistance(X. предикаты.( . RY) +(RX . /( ∗(RX . is ( R.II. Y). R).4 Вопрос 15.

34 . X). write(X).1 Подходы к организации циклов в логическом программировании Подходы к организации циклов в логическом программировании.II. fail. fail loop. Бесконечный цикл: 1 2 3 4 iloop :− loop. print(X1). Новое значение переменной цикла можно генерировать каждый раз в процессе возврата. 1 2 3 4 5 print :− gen(1. gen(X. X):− Y < 10. gen(Y. print(X) :− X =< 10. X). X). Примеры. write(X). Бесконечный цикл: 1 2 iloop :− iloop Современные системы логического программирования умеют распознавать хвостовую рекурсию. Подходы: • рекурсия На каждом шаге создаётся новая среда. print :− print(1). gen(Y1. новое значение инварианта цикла. Y1 is Y + 1. repeat. • возврат – циклы управляемые неуспехом. Предикаты for. X1 is X + 1. 16 Вопрос 16. loop :− loop. 1 2 3 4 5 print(11).

for(X. write(X). B. B). A. у ктороых есть побочный эффект. X <= 6. for(X. 1 2 Использование: read_dim:− repeat. B. for(A. A1 is A + 1. 16. не позволяя перешагнуть через себя. 1. С классическими предикатами. L). integer(A1. integer(A. X >= 3. A. Возвратный цикл с постусловием. Использование: 1 ?− for(X. (цикл по произвольному множеству). member(X.2 1 2 3 for. read(X).II. repeat будет возвращаться один и тот же ответ. это работает только с пердикатами. В процессе каждого возврата он генерирует новое решение. L). 35 . R). [A]). но можно его идею с (member) для организации цикла как в Python. repeat :− repeat. хуже. member(X. A1 is A + 1. A1. repeat. for(X. [A|R]):− A < B. A. repeat всегда успешно доказуем. [yes. _). B. A. 10). 1 2 3 4 5 6 7 integer(A. fail.2 repeat. 16. 1 2 3 4 5 read_ans:− repeat. read(X). B):− A < B.1 Вопрос 16. B):− integer(A. Вообще говоря. Вариант другой. no]).

17 Вопрос 17. R. S. % R2 A:− B. процессор логического вывода не меняет решения принятое с момента вызова родительского целевого утверждения. При попытке доказательства выполнится R1: • ∃(P. Определение 36. Отсечение обладает только процедурной семантикой. % R1 % РОДИТЕЛЬСКОЕ ЦЕЛЕВОЕ УТВЕРЖДЕНИЕ C:− T. C. Родительское целевое утверждение — целевое утверждение. Правила R. – Выбор R1. Отсечение приводит к тому. 1 2 3 4 5 C:− P. Q). !. • @(P. Q. Процедурная семантика отсечения: Встречая отсечение. 36 . содержащего отсечение.1 Управление перебором и отсечение Управление перебором и отсечение(cut). Предикат not. Q). Q) ⇒ выполнится !. ⇒ R2 не выполнится и не будет произведен backtracking для поиска других P. что сделанный выбор фиксируется и при откате назад альтернативные решения не учитываются. Q. которое приводит к вызову правила.II. S разбираются на общих основаниях. D. фиксируются: – Решения (P.

X):− !. 1 2 3 • Условный оператор. Потеря решений.fail. father(X. numOfLegs(_. 1 2 3 • Отрицание по неуспеху. • Удаление нежелательных вариантов. fact(N. Не надо проверять остальные варианты. 37 .F1). X = 2.!. male(X). X):− !. not(Predicate):− Predicate. • Красное. 1 m У человека 1 отец. male(X). Q :− C. ! 1 • Для выбора отдельных решений.II. fact(N1. !. numOfLegs(cetipede. Нет потери решений. X = 40. numOfLegs(human. Y). Y):− parent(X. else C. Y):− parent(X.2 Отсечения(тип зависит от контекста вызова предиката): • Зелёное. 1 m 1 2 Q :− A. Вопрос 17. Варианты использования отсечения: • Минимизация перебора (для оптимизации). Y). B. 1 2 3 fact(1. 4). Q :− if A then B. F is F1∗N.1):− !. !-fail Отрицание может быть определено через отсечение. not(_).F):− N1 is N − 1. father(X.

telling(X) 38 . 1 2 3 4 5 main :− wrire(’Имя␣студентки’). • read(X) Вводит терм(с точкой на конце) с stdin и унифицирует его с X.1 Встроенные предикаты Пролога: read. nl. X). Для классических языков логического программирования. Spec).II. nl. fail. 18 Вопрос 18. • nl Эквивалентен write("\n") . write. read(Name). с запросным режимом работы. но иногда они оказываются очень полезными. nl Встроенные предикаты Пролога: read. write. seeing(X) • telling(fileName). Примеры: 1 2 3 main :− specialty(tonja. Работа с файлами (стр 94): • see(fileName) • tеll(fileName) • seeing(fileName). write(X). % работет единожды в отличие от write specialty(Name. Основные предикаты ввода-вывода в Прологе: • write(X) Выводит занчение X на stdout. nl. операции ввода-вывода не являются необходимыми. fail. write(Spec).

findall. для создания аналога глобальных переменных. No. эквивалентен assertz.1 asserta/assertz. 19 Вопрос 19. следующее: 1 2 3 assert( fact( a ) ) % или assert( rule( X ):− fact( X ) ) Из следующего примера видно. retract. C http://www. Предикаты поиска множества решений: findall.1 asserta/assertz. ?− fact( X ). 39 . Примеры. например. Для того.ru/forum08/ (Древний. X = d. чтобы добавить факт или правило в базу знаний. X = a. • retract Удаление факта. когда необходимо сохранить ответы. retract В базу знаний(фактов и правил) Пролога можно добавлять факты и правила прямо по ходу выполнения программы. например. или. assertz( fact( c ) ). необходимо написать. bagof/setof. • asserta Добавляет факт/правило в начало базы.II. Описываемые предикаты могут применяться в случаях. X = b. asserta( fact( a ) ).webauto. X = c. assert(fact( d ) ). Yes. на заданные пользователю вопросы в ходе работы программы (как например в экспертных системах). как данные предикаты оказывают влияние на результаты запросов: 1 2 3 4 5 6 7 8 ?− assert( fact( b ) ). мертвый форум) 19. Это осуществляется при помощи предикатов • assert Как предусмотрено в большинстве реализаций Пролога. • assertz Добавляет факт/правило в конец базы. retract. bagof/setof Предикаты динамического изменения базы данных Пролога: asserta/assertz.

findall(X. котороые можно получиь в результате работы pred..L). в котором удалены все повторения. bagof/setoft При помощи добавления и удаления фактов в и из базы знаний реализованы предикаты поиска множества решений findall/bagof и setof.. работает и выглядит аналогично findall..pred(X.II.L). collect(L):− ( retract(found(X)). в результате работы которого X преобретает значения. L=[].P. 3. поиск решения assertz(found(X)). bagof(X.).L). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 findall(X. Предикаты findall и bagof имеют три аргумента: 1.2 Вопрос 19..L):− ( call(P).2 findall. что возвращает отсортированный список решений.) — предикат. % Получение текущего решения L=[X|Rest]. % Запись решения в базу знаний fail % Инициация неуспеха для backtracking ). % Вызов предиката P. collect(L).. значения которой нас интересуют • pred(X. % Решения кончились 2.).. • L — список всех значений Х.pred(X. но нет автоматической связки переменных квантором существования... % Добавление его в список collect(Rest) % Сбор остальных решений ).. setof(X... 40 .). у этого предиката может быть больше одного аргумента..pred(X. • X — переменная. отличается от них тем. 19.

5] .(p(X. 2.Z).5. No ?− bagof(Z.. Z = _G182 X = 1 Y = 3 Bag Z = _G182 X = 2 Y = 4 Bag Z = _G182 X = 3 Y = 5 Bag Z = _G182 X = 4 Y = 3 Bag Z = _G182 X = 5 Y = 2 Bag No = = = = = [5] [1] [2] [1] [4] . 1. . p(2..Z).3. 2.1).Y.Bag). .Bag).Bag).Z).p(X. 1.p(X.4. p(3. Z = _G182 X = _G180 Y = _G181 Bag = [] Yes 41 .1). . 2. %$$ % (\exists X)(\exists Y)p(X. Z = _G182 X = _G180 Y = _G181 Bag = [5.Z). No ?− bagof(Z.Y.(p(X. 4] .Y. Z) %$$ Z = _G182 X = _G180 Y = _G181 Bag = [1. 1.csupomona.Bag).edu/.Y. Z = _G182 X = _G180 Y = _G181 Bag = [5.4). ?− findall(Z. ?− bagof(Z. 4. .2). No ?− findall(Z.Z). Вопрос 19.3. p(5. No ?− setof(Z. Y.2.Y.Z>5). 1. 4] ./prolog_tutorial/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 p(1. p(4.Bag).II.Bag).X^Y^p(X.3 Пример c http://www.Y.Z>5).5).Z).X^Y^p(X.

ζ) – Λ – имя – t – произвольный терм (голова) – ζ – список (хвост для Λ(t.1 Рекурсивные структуры данных Представление списков Представление списков. Связь списков и структурных термов. []))) • Скобочная нотация: Λ(1. Λ(2.: 1 . Определение 37. Построение: • [] – Пустой список.(2. Список — • пустой список ∅ • структурный терм Λ(t. 42 .(Голова. • [ОдинокийЭлемент]: Хвост = []. Оператор =.. . для отделения головы и хвоста: • []: не определена. Λ(2. по аналогии с аксиомами Пеано для формальной арифметики. • Скобочная нотация: 1 [Голова | Хвост] = список. Λ(3. III 20 Вопрос 20. Аппарат логики предикатов содержит в себе все необходимое для представления списков (потенциально бесконечных).: Λ(1.(3. • . 2. • .III. . ∅))) ≡ [1. Хвост) = список. Λ(3.(1. ∅))) ≡ . Для этого можно использовать структурные термы. 3] Унификация. ζ)) Список ≡ Дерево.

Y)] . представленные в формах.(A. [2]].(B.2 – Несколько головных: [A. arg и =. Применение этого предиката демонстрируется на следующих примерах: 1 2 3 4 5 6 ?− f ( а.Y) ) Преимущество этого подхода состоит в том.. 5) ?− Z =. содержащий главный функтор Term. L = [f. из головы и хвоста Возможны многоуровневые списки [[1. Для декомпозиции термов и создания новых термов предусмотрены три встроенных предиката: functor. 5].. b] ?− Т =. T )) – Построение. 1 Term =. . [4]] – сильнее подчёркивает связь с деревом. X.. если L — список. L.. f (X. который записывается как инфиксный оператор и читается как «юнив» (univ).. которые не всегда можно было предвидеть ко времени написания этой программы. что программа приобретает способность в процессе своей работы самостоятельно вырабатывать и выполнять цели. 3. f(X. Z = р( X. [р. L является истинной.. 43 . B|T ] ≡ ... Предикат =.III. за которым следуют его параметры. Т = rectangle( 3. b) =. a. [ rectangle . Вопрос 20. 3.

[]. Term. Term1) :− !. multiplylist( []. Ничего не требует замены.III. !. Terml) : % если все вхождения субтерма Subterm % в терме Term будут заменены % субтермом Subterml. F. t. [Type | Parameters].. substlist( Sub. Sub1. Parameters1 ) . то будет получен терм Terml % Случай 1. Args. F.. _. Figl) :− Fig =.. Term. 1 2 3 4 5 6 7 8 enlarge( Fig. в обход требований синтаксиса. Вопрос 20. Term. % Выполнить в них замену Terml =. Term1) :− Term =. [Terml|Terms1]) :− Substitute( Sub. Terms1). multiplylist( Parameters. Substlist( Sub. • Символьные вычисления. L1 ). F. % если Term относится к типу ’atomic’ substitute( _. F). % Получить параметры substlist( Sub. [Type | Parametersl ]. ?− substitute( sin(x). Terms. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 % substitute ( Subterm. Sub1 Args1).3 Применение: • Обобщённые вычисления. Выполнение замены Б параметрах substitute( Sub. в обход требований синтаксиса. substlist( _. 2∗sin(x)∗f(sin(x)). [] ). F. Subterml. []) . Term) :− atomic(Term) . Term1. [F|Args1]. multiplylist( [X | L]. F = 2∗t∗f(t) 44 . Subl. Замена всего терма substitute{ Term. Sub1. multiplylist( L. Term.. [X1 | L1]) :− X1 is F ∗ X. Figl =. [F|Args]. Term. [Term|Terms]. % Случай 2. Term1). _. _. % Случай 3. Sub1.

1. N. N1). length([_|T]. 1 2 3 4 5 :− pred member(T. in) = is nondet. 45 . getN(List. 21. getN([_|List]. member(X. L. 0). взятие n-ого элемента. 21. 21 Вопрос 21. T). length([_|T]) = length(T) + 1. :− mode member(in. list(T)). Elem). принадлежность элемента списку. M. [X|_]). Elem):− M is N − 1.2 1 2 3 4 определение длины :− func length(list(T)) = int. N is N + 1. [X|_]).1 1 2 3 4 % Prolog length([]. Elem). :− mode member(out. N):− length(T. :− mode length(in) = out is det.3 принадлежность элемента списку 1 2 3 4 5 % Prolog member(X.1 Описание основных предикатов обработки списков: определение длины. member(X. Описание основных предикатов обработки списков: определение длины. 1 member(X. _). конкатенация списков. 1 2 3 4 взятие n-ого элемента getN([Elem|_]. length([]) = 0. T). конкатенация списков.III. принадлежность элемента списку. [_|T]):− member(X. L):− remove(X. in) = is semidet. member(X. 21. [_|T]):− member(X. взятие n-ого элемента.

B. Y. Y. extend([_|T]. out. out) = is det. X. B. length(X.Y. _. 1 2 3 4 5 :− pred extend(list(T).5 1 2 3 4 5 :− pred append(list(T). extend([]. L). L. T). L).[_. • next(A. A). X. :− mode extend(in. X. extend(R.B|_]. L). L):.extend(_. :− mode append(in. Y.2 добавление элемента append(A.4 Вопрос 21. C = A ◦ B 1 2 3 4 5 % Prolog extend([]. • last(X. list(T). extend([_.extend(_. L.L). C). [_|A]) :− append(T.2. [1.3]) • rem_first(N. append([].L]):− append(T. 46 . out. :− mode append(out. T. [X]. append([_. C). L):.T]. X).T]. append([_|T]. R):. [X]). 21. конкатенация списков extend(A. 21.6 применение extend extend(A. R).Y. list(T)). T. [foo2]. :− mode extend(out.L]):− extend(T.L).Y. 21. out) = is det. [A.Y. C = A ◦ [B] 1 2 3 4 5 % Prolog append([]. C). B. in) = is multi. in. in. [_|A]) :− extend(T. C = A ◦ B • Конкатенация extend([foo1]. [X]). list(T)). Y. A). Y. C) • Порождение разбиений extend(X.[_.extend(X. B.III. L):. • sublist(R. X. N).extend(_. X). in) = is multi.

_). определение подсписка. 47 . X =[ноги]. T). блондинка]. [H|R]):− remove(X.out) is nondet. [H|R]) :− remove(X. remove(X.1 1 2 3 удаление элемента remove(X. 22. Применение: • Удаление (всем способами) 1 2 3 ?− remove(блондинка. X) X = [брюнетка.in. [блондинка. L) X =[бюст].out. remove(X.1 Описание основных предикатов обработки списков: удаление элемента из списка.). :− mode remove(in. талия].III. [H|T]. L =[бюст. брюнетка. T. [H|T]. блондинка] X = [блондинка. R). [X|T]. L):− remove(X. перестановки Описание основных предикатов обработки списков: удаление элемента из списка. T. L =[талия. :− mode remove(out.) is multi. ноги]. 1 2 3 4 5 6 7 :− pred remove(T. рыжая] • Генерация 1 2 3 4 ?− remove(X. ноги]. брюнетка. L =[бюст. рыжая.[бюст. list(T). талия. member 1 member(X. рыжая. list(T). R). ноги].in. X =[талия]. определение подсписка. 22 Вопрос 22. remove(X. L. перестановки. T).out) is nondet.in. :− mode remove(in. [X|T].

48 . append(R.2 определение подсписка sublist(L. T). _. 22.III. L).2 1 2 3 Вопрос 22. T. R:− append(_.

permute(R. :− :− :− :− pred permute(list(T). [X|T]):− remove(X. 22. R1). [X]). mode permute(in. удалить(X. permute(L. T). R) :− перемешать(L. перемешать([X|L]. L. in) is nondet. permute([]. mode permute(out. out) is nondet. • Императивная. []). 49 . [X|T]):− remove(X. 1) переменная не конкретизирована – бесконечное SLD-дерево. permute(L. R.III.3 перестановки permute([]. mode permute(in.3 1 2 3 4 Вопрос 22. 1 2 3 4 5 6 7 8 9 Мой вариант: 1 2 3 4 перемешать([X]. list(T)). L. R). permute(R. T). R1). []). Семантика • Декларативная – симметрия. R). если первая(вар. in) is semidet.

411]] m Порядковое представление 1 2 3 4 [ e(1.1. 23 Вопрос 23. Применение: • Матрицы. e(2.411).212).2.III. Список списков 1 [[101. Представление матриц.2. Порядковое представление – такое представление списка. Это очень похоже на словари в Python и С++. ζ)) Наряду с обычным представлением списков используется порядковое представление. или на массивы в PHP. Определение 39.101).1 Порядковое представление списков в Прологе Порядковое представление списков в Прологе. ζ) – Λ – имя – t – произвольный терм (голова) – ζ – список (хвост для Λ(t. e(1.212]. Определение 38.1.333). Примеры. ] 50 . при котором номеру элемента соответствует его значение. e(2.[333. Список — • пустой список ∅ • структурный терм Λ(t.

X2 ):− rem_first(X1. rem_first([e(1. [e(N. X)]). X)|ListOdering]):− N1 is N + 1.e(4. _)| X1 ]. fail.brunette). rem_first(X1. ListOdering).blonde).brunette). 1.2 Операции 1.red] 51 . хз\_чё)): 1 2 3 4 5 6 rem_first([]. fail. ?− c2o([blonde. но возможны более эффективные реализации. N. 23. Например удаление первого элемента (e(1.e(2. brunette .red)] ?− c2o(X. ListOdering):− c2o_util(ListCommon. write(X). X). определение длины 2. [e(1.brunette.brown). удаление элемента из списка 6. red]. c2o_util(ListCommon. [e(N. Связь порядковых и простых списков: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 c2o([]. brown. N. конкатенация списков 5. B2)| X2 ]):− X2 is X1 − 1. B1)| X1 ]. определение подсписка 7. N1. взятие n-ого элемента 3. []). ListOdering). [e(1.III. X2).1 Вопрос 23. X2).e(3.e(4. c2o_util([X]. c2o_util([X|ListCommon]. rem_first([e(A1.e(2.brown.e(3.blonde). []). write(X).brown). перестановки аналогичны как и для простых списков. принадлежность элемента списку 4. [e(A2. [blonde. c2o(ListCommon.red)]).

2 Хвостовая рекурсия Виды рекурсии (обычно реализуются с помощью стека): • Линейная.3 Хвостатизация • Ввести дополнительную переменную (аккумулятор). Хвостовая рекурсия. L1 >– это пара списков < L2 . Рекурсивный вызов – последний в определении. L ≡ L ◦ A/A или L ≡ L|A/A 24. L1 > такая. – Общий случай – Хвостовая. При создании двоичного дерева в императиве. • Нелинейная. Сведение к итерационному процессу. Процедуры обращаются друг к другу (рекурсивный спуск) • Хвостовая 24. Разностный список L=< L2 .1 Разностные списки Разностные списки. Много(> 1) раз вызывается в теле функции. • Убрать какие либо вычисления после рекурсивного вызова. 52 .III.1 Разностный список Определение 40. 24 Вопрос 24. 24. Сведение рекурсивного нехвостового определения к хвостовому. которая. при каждом погружении в рекурсию будет увеличиваться на 1. • Косвенная. что L1 является хвостом L2 . Примеры. Реализуется без стека. и нет локальных переменных требующих вычисления на дальнейших этапах. В операторной нотации обозначают / или -.

reverse([X|T]. N). R). []). R/L):− reverse(T. N.2 Примеры Длинна списка 1 2 3 4 length([X].III. reverse([]. 24. length([_|X]. R). T1). N):− S1 is S + 1. R):− reverse(T. R):− reverse(T. R):− reverse(L. N). R/[X|L]). 1). R/R). rev([]. R):− rev(L. [X] R). • Хвостовой 1 2 3 reverse(L. [X|L]. R. L.4 Вопрос 24. N). R/[]). R). S. length([X|T]. • Разностный 1 2 3 4 %% на самом деле не очень понятно reverse(L. 53 . Реверс • Простой 1 2 3 4 reverse([]. rev([X|T]. ⇔ 1 2 3 4 5 length(L. length(T. reverse([X|T]. 0. []. S1. N is N1 + 1. length([]. N):− length(X. N1). extend(T1. N):− length(L.

L. X/Y). [3.2.2|T]/T. X). ?− extend([1.4|Y]/Y.3.3 Конкатенация • Простая 1 2 3 extend([]. X. R). • Разностная X − Y = (X − T ) + (T − Y ) 1 2 3 4 extend(X/T.III. extend([X|T].4|Y]/Y 54 . [X|R]):− extend(T. L. Y/T. R). R = [1. Вопрос 24.

Деревья общего вида – описывают структурные термы. Дерево (двоичное) — • пустое дерево ∅ • структурный терм Υ(t. 25 Вопрос 25. l. l. r) – Υ – имя терма. – t – произвольный терм (узел). Дерево — • пустое дерево ∅ • структурный терм Υ(t. Деревья поиска. r) – Υ – имя терма. – x – узел. Для удобства используют двоичное дерево. – l – левое поддерево. Деревья общего вида – родная структура в ЛП. x ∈ Υ(t. ∀ξ ∈ lξ < x – r – правое поддерево. слева направо. Определение 41. Дерево поиска ИЛИ упорядоченное. θ) – Υ – имя терма. Определение 43. В этом случае узел описывается одним и тем-же структурным термом. основные операции с деревьями поиска. — • пустое дерево ∅ • структурный терм Υ(x. ∀ξ ∈ rξ > x 55 . – r – правое поддерево.1 Деревья Деревья. Определение 42. – l – левое поддерево. r) ⇔ (x == t) ∨ (x ∈ l) ∨ (x ∈ r) Определение 44.III. той же арности. – t – произвольный терм (узел). – θ – множество поддеревьев. l.

Right) ) :− gt(Root. % X больше. _.t(X.L. addleaf( t(Root. Left. t(_. Left. in( X. addleaf( t(Root. 1 2 3 4 5 in(X. S ). Элемент X находится в дереве поиска. addleaf( Right. Right). addleaf( t(X.2 Операции: • in( X. Left. 1 2 3 4 5 6 7 8 addleaf( nil. Right1)):− gt(X._. nil)). X)._._)). к набору данных S и получение набора данных S1. Right)). in(X. L) . X. чем корень in( X. X. Right)):− gt(Root. X. Left. _) ). % Проводить поиск в левом поддереве in( X. t( Root. Left}. Left. Right} ) :− gt( X.R):− in ( X. t(Root. X. % Проводить поиск в правом поддереве Применение: – Поиск – Построение • add( S. Right1). t ( X. Left1. t(_. Right). S1 ). R) . Root}. Left1). 1 2 3 4 5 6 7 in( X. Right)._) ) :− in( X. Left. t(Root. Root). Left. t( Root. X). X. Вопрос 25. % Корень больше. Right). nil. addleaf( Left. t(X. t(X. in( X. Проверка принадлежности элемента X к набору данных S.III. X. X. Добавление элемента X. чем X in( X. 56 .

L. L1. NewTree). X. в одном лице: Хотим ввести X в дерево D • Ввод X в корень. Вставка и удаление. Right1 ). L. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 del( t(X. X. Y. Удаление элемента X из набора данных S и получение набора данных S1. R1. nil).Left1. R1)):− gt(X. X). t(X. R).Left. del( t(X. R1). addroot(t(Y. X. Right).nil. X. X. add(t(Y. L1. X. L1). Y. nil). t(Root.Left. R). Right1) ):− gt(X. nil)). del( t(X. delmin(t(Root. t(Y. t(Y. t(X. Right) ):− gt(Root. addroot(nil. X). delmin(t(Y. L. t(Y. R). Right1 ). 57 . addroot(R. del( t(Root.III. Вопрос 25.3 • del( S. X. на любом уровне. del( t(X. X – новый корень • Перемешения: – D > X вставить в левое поддерево – D < X вставить в правое поддерево Страница 203/205 Ивана Братко. R2)). S1).Left. Root). R). del( Left. Left1 ). t(X. nil ). L1. R2)):− gt(Y. L. Right). Right)):− delmin(Left. 1 2 3 4 5 6 7 8 add(Tree. L. X. X. nil. R). t(X. L. R). add(L. add(R. Y. t(X. X. Right ).Left. t(Root.Left1. add(t(Y. R))):− gt(Y. X. Right). Right).nil. X. Y. X. X. NewTree):− addroot(Tree. Y). Right) ):− delmin( Right. del( Right. Right). t(Y. L2)). X. addroot(t(Y. Y. X. Y. X). addroot(L. R)):− gt(Y. Left ). nil. Left1). t(Root. X.Left. t(Y. X). del( t(Root. L2.Left. R1).Left. X.

Примерно сбалансированные деревья: • AVL-дерево • Двоично-троичное дерево. Дерево называется (примерно) сбалансированным. и |h(l) − h(r)| 6 1. Right)/Height <?> 2. 26 Вопрос 26.III. l. Какое из них подразумевается в вопросах Определение 45. Алгоритм добавления узла в сбалансированное дерево. Что вобщее требуется тут? 58 . если для каждого узла в дереве два поддерева этого узла содержат приблизительно равное количество элементов. – l – левое AVL-поддерево. r)) = max(h(l). h(r)) + 1 AVL-деревья представляют t(Root. – r – правое AVL-поддерево. l. Дерево AVL — • пустое дерево ∅ • структурный терм Υ(t.1 Сбалансированные деревья Сбалансированные деревья. r) – Υ – имя терма. <?> 1. Left. где h(·) глубина Определение 46. h(·) — глубина дерева • пустое дерево h(∅) = 0 • h(Υ(t. – t – произвольный терм (узел).

Но тут добавление в дерево связано с трудностями.III. чтобы сохранять свойства двоичного поиска. Поэтому в общей сложности поиск в таком дереве составит O(n). а точнее сложность O(log2(n)). Так например строя обычное двоичное дерево поиска для отсортированной последовательности. а как известно свободного доступа к элементам списка в Прологе нет. высота правого и левого поддерева которого по разности не превосходит единицу. и думаю написать его полностью на экзамене. чётко не представляя в голове тяжело. Поэтому дерево иногда приходится перестраивать. Поэтому думаю хватит основных идей как осуществляется вставка в сбалансированное дерево. а как линейный список. Тем более на экзамене и так есть задачки по Прологу. могут не обладать всей привлекательностью двоичного поиска. Код достаточно большой для этой операции. потому как может нарушится сбалансированность. а также эти правое и левое поддерево. не теряется быстрота поиска. Поэтому даже строя сбалансированное дерево для упорядоченной последовательности. по крайне мере такое назначение им давалось в книге Сошникова. оно получится не как дерево поиска. то есть линейный. Вопрос 26. Для того. Потому как просто двоичные деревья поиска. можно использовать сбалансированные деревья. На сколько помню сбалансированным деревом называется двоичное дерево.2 Комментарий Дениса Долгова: Сбалансированные деревья нужны для быстрого поиска. 59 . также являются сбалансированными.

Вопрос 26.III. Нужен ли код? 60 .3 <?> 3.

door(d.III. X). f).1 Представления графов Представления графов. g). такую. xi i ∈ V 1 2 3 4 5 6 7 8 9 % Граф door(a.1 В глубину Для исследования пути lmax и дерева с коэффициентом ветвление b: T IM E = O(lmax ) SP ACE = O(blmax ) В процессе поиска путь из начальной вершины продлевается одним из возможных способов. Определение 48. Это очень похоже на использование матрицы смежности. door(b. % Движение по графу move(X. В логическом программировании удобнее представлять граф в виде пар дуг. 27 Вопрос 27. естественнее и экономичнее. Путь в графе G =< U. 27. V > из a ∈ U в b ∈ U — последовательность {xi }ni=0 . c). door(d. i). door(f. пока не будет продлён в конечную вершину. door(c. V i — пара • U вершины • V ⊆ U × U ребра (дуги для направленного) Для представления графов обычно используют матрицы смежности или динамические списочные структуры. d). Y):− door(X. в ширину). Алгоритмы поиска пути в графе (в глубину. + в логическом программировании мы можем задавать дуги не только фактами. Направленый граф hU. d). 61 . x0 = a xn = b ∀ihXi−1 . Y). e). Определение 47. b). что xi ∈ U. door(b. door(Y. door(h. Углубляется по дереву. но удобнее. но и правилами. Альтернативный путь – только в случае неудачи.

P):− bdth([[X]]. На каждом шаге 1. depth(P. Y. QI. [X | T])). [X|T]). где матрицы смежности уже неприменимы. 27. 3. prolong(P. reverse(P. Идеи сходны с алгоритмом фронта волны но матрицы смежности заменены продлением списков. P). T. – ПРИНЯТЬ Не виснет. reverse(L. 1 2 3 4 5 6 7 Вопрос 27. X |T]) move(X. [X|T]). B. Ищет кратчайшее решение раньше остальных. bdth([[X|T]|_]. QO). L). Y). T). Y. depth([X|T]. L). QO) /∗ ставим это вместо пардыдущей строки ==> В глубину очередь путей в стек. Если путь в начале очереди – решение. P1). ∗/ bdth(QO. X. bdth([_|T]. append(QI. продляем его (всеми способами) и вставляем в конец. depth(P1. not(member(Y. F. Y. содержащие путь из начальной вершины. P). L):− prolong(P. X.III. L).B. Это позволяет проводить вычисление на графах. prolong([X| T]. [Y. X. F. L):− bdth(T. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 search_bdth(X. L). из-за своего объёма. X. 2. %% append(T. Z).2 В ширину Для исследования некоторого пути l и дерева с коэффициентом ветвление b: T IM E = O(bl ) SP ACE = O(bl ) Рассматриваем очередь путей. 62 .!. Y.2 search_depth(A. R).P):− depth([A]. bdth([P|QI]. R):− findall(Z. берем путь из начало очереди.

1 Методы решения задач Метод генерации и проверок для решения задач Метод генерации и проверок для решения задач.1 Метод генерации и проверок • Один предикат генерирует множество исходных данных • Второй проверяет на соответствие с условиями задачи. Нужен ли тут код вообще ? 63 . определяет эффективность решения задачи Важно • Выбрать удобное представление состояния задачи • Построить перебор методов ветвей и границ. 28. чтобы отсекать наиболее объёмные ветки дерева • Иногда неявный перебор и правильный выбор способа представления знаний позволяет решить задачи в чисто декларативном стиле При использовании явного перебора — производится полная конкретизация решений — а потом ух проверка. Метод ветвей и границ.IV. На самом деле любое доказательство так или иначе использует этот метод При этом промежуточные этапы проверки отсекают дальнейшие ветки от полного дерева перебора. <?> 4. Явный и неявный перебор в Пролог-программах. насколько много веток отсекается. реализуя метод ветвей и границ 28. Неявный перебор использует метод ветвей и границ — генерация очередной порции решений производится после частичной конкретизации решения. – НеУспех – backtracking. – Успех – возвращаем. IV 28 Вопрос 28.2 Метод ветвей и границ Части общего дерева решения отсекаются на ранних этапах или вообще не генерируются То.

IV.

29

Вопрос 29.1

Основные методы сокращения перебора на примере задач
криптографии, расстановки ферзей, игры N 2 − 1

Основные методы сокращения перебора на примере задач криптографии, расстановки ферзей, игры N 2 − 1.

<?> 5. Непонятно! — криптография

64

IV.

Вопрос 29.2

На шахматной доске размером N × N требуется расставить N ферзей, так, чтобы
они не били друг друга.
Если представить позицию в виде набора из координат x и y всех ферзей, то задачу
можно сформулировать как задачу на удовлетворение ограничений.
Найти набор значений для x1 , y1 , x2 , y2 , ..., xN , yN , из множества [1..N ] такой, что для
всех различных i и j выполняются условия:
• xi 6= xj (ферзи не стоят на одной вертикали);
• yi 6= yj (ферзи не стоят на одной горизонтали);
• |xi − xj | 6= |yi − yj | (ферзи не стоят на одной диагонали). Можно попытаться
решить эту задачку методом перебора
• Плохой вариант
1
2
3
4
5

queens(N,Ys−Xs) :−
range(1,N, Ns),
length(Xs, N), members(Xs,Ns),
length(Ys, N), members(Ys,Ns),
safe(Ys−Xs).
Однако размер пространства перебора N 2·N должен насторожить. Для классического случая N = 8 придется рассмотреть порядка 1014 вариантов. Заметим,
что среди координат x ферзей x1 , x2 , ..., xN ровно один раз встречается каждое
из чисел 1, 2, ..., N . Таким образом, номера ферзей можно рассматривать как
координаты x и достаточно перебирать только координаты y. Новая формулировка задачи:
Найти набор (y1,y2,...,yN), 1<yi<N такой, что для всех различных i и j выполняются условия:
yi =/= yj |yi - yj| =/= | i-j |.

Новая схема перебора будет выглядеть так
1
2
3
4
5

queens(N,Ys) :−
range(1,N, Ns),
length(Ys, N),
members(Ys, Ns),
safe(Ys).
Теперь пространство перебора содержит NN (для N=8 -107) вариантов, что уже лучше, но все еще многовато. Если учесть, что среди координат y ферзей y1,y2,...,yN
65

IV.

Вопрос 29.3

каждое из чисел 1,2,...,N также встречается ровно один раз, можно еще раз переформулировать задачу.
Найти набор различных (y1,y2,...,yn), 1<yi<N, такой что |yi - yj| =/= | i-j | при i =/=
j.
Конечно это, по сути, то же самое, просто мы переносим условие yi =/= yj из множества ограничений в определение пространства перебора. Процедура перебора изменяется незначительно.
1
2
3
4
5

queens(N,Ys) :−
range(1,N, Ns),
length(Ys, N),
selects(Ys, Ns),
safe(Ys).
Пространство перебора сокращается с NN до N!, что для N=8 означает 40 320 и уже
приемлемо. Теперь можно записать процедуру проверки.

1
2
3
4
5
6
7
8

safe([Y|Ys]) :− noattack(Y,Ys), safe(Ys).
safe([]).
noattack(Y,Ys) :− noattack(Y,Ys,1).
noattack(_,[],_).
noattack(Q,[Y|Ys],D) :−
abs(Q−Y) =\= D,
D1 is D+1,
noattack(Q,Ys,D1).
Однако факториал есть факториал и если для N=8 время поиска всех ответов измеряется секундами, то для N=10 это уже минуты, а для N=12 - часы. Ничего поделать
с природой задачи мы не можем - невозможно сделать из свиньи скаковую лошадь.
Но можно получить более быструю свинью. Мы можем, как и в предыдущем примере, переместить проверку ограничений в процедуру генерации. Выбирая положение
очередного ферзя, будем проверять его совместимость с расставленными ранее. Тем
самым мы объединим процедуры selects и safe в одну процедуру place_queens. Эта
процедура имеет дополнительный аргумент Board, содержащий список уже расставленных ферзей.

1
2
3
4
5
6
7

queens(N,Ys) :−
range(1,N,Ns),
length(Ys,N),
place_queens(Ys,Ns,[]).
place_queens([Y|Ys], Ns, Board) :−
select(Y, Ns, Ns1),
noattack(Y, Board),
66

возможных положений 67 . В своей знаменитой статье [1] Никлаус Вирт использовал два булевых массива представляющих /-диагонали и диагонали. place_queens([N|Ns]. _. [Y|Board]).[_|Cs]. Такое усовершенствование дает выигрыш в скорости в 2-3 раза. Для этого потребуется нечто большее. [_|Ds]):− place1(N. как только она связана._.4 place_queens(Ys. но одновременно мы будем связывать соответствующие переменные из списков Us и Ds. [U|Us]. Us.довольно общий принцип. [N|_]. [D|Ds]).Us. а кроме того время вычислений пропорционально уже N!0. содержащие переменные.7. Ds). называемый распространением ограничений (constraints propagation). Мы несколько модифицируем эту идею. но в целом оказывается не очень существенным. Заметим. При размещении очередного ферзя переменная из списка Ys связываетя с номером ферзя. вызывая noattack. Процедура place_queens после выбора положения для ферзя "сдвигает"Us и Ds на одну позицию в разные стороны. тем же самым. Тем не менее. place_queens([]. В сравнении с предыдущей эта программа выполняется раз в 20 быстрее при N=8. Ns). 1 2 3 4 5 6 7 8 9 10 queens(N. Ns1. эта программа иллюстрирует важный метод решения задач. place_queens(Ns. никакой другой ферзь уже не может оказаться на той же диагонали (этот же трюк мы применяли при раскраске карты).N.вести явный учет возможных значений для каждой переменной. Ускоряется лишь проверка возможности очередного выбора. 8 9 Вопрос 29. length(Ys. что процедура place_queens сама содержит пару из генератора и теста. place1(N. Ys.Cs. Однако. необходимо научиться выбирать только допустимые положения. Ys. Пространство перебора остается.[N|_]. по сути._). "охраняющие"диагонали. _). допускающий разнообразные реализации.Ys) :− range(1. чтобы такое объединение имело смысл. Мы сначала выбираем положение ферзя посредством select._)._.Ds). Ys.[N|_]). Каждый выбор значения для очередной переменной ограничивает возможность выбора для других переменных. Каждая переменная представляет одну диагональ. [D|Ds]):− place1(N. а затем проверяем его на совместимость. place_queens([]. Заманчиво объединить и эти две процедуры. place1(N. Поскольку переменная может только иметь одно значение. и будем использовать два списка Us и Ds. place_queens(Ns. N). чем просто список уже расставленных ферзей.Ys.[_|Us]. в нашем случае . _.IV. Важный способ реализации этого метода . Us. Распространение ограничений .

.N.[X−Y|Qs]) :− member(Y. мы удаляем атакованные им позиции из допустимых положений оставшихся ферзей. init_vars([]. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 queens(N. place_queens(V. Ns).Y2) :− Y1 \== Y2. Аналогично. для которых существует всего один вариант размещения и.T)) . Ps). prune([]. Ys1) Обратите внимание на проверку Ys1 = ¯ [] . вместо того чтобы тупо расставлять ферзей одного за другим. которые нельзя разместить.Y. Если для какого либо из еще не размещенных ферзей не остается свободных мест.Q). его список имеет вид [1. place_queens([]. для которых выполняется указанный предикат. Он возвращает список тех элементов списка. выбрать именно такого. Тогда.аналог функции filter.2. Ys. V1). в общем случае лучше выбирать того ферзя. Ys1). Ys). В сущности. []). если есть. Теперь предположим. Таким образом.X2.Y. это более быстрый способ выполнить 1 findall(T. init_vars([X|Xs]. place_queens([X:Ys|V]. Вопрос 29. X. что среди не размещенных ферзей нет таких. Встроенный предикат sublist .Ys. V).Y1. что мы не стали включать указанную проверку в prune.. разумно сначала убедиться. X.N]. noattacks(X1.Q.. (member(T. prune(Qs.Ys).Y. Вначале каждый ферзь получает полную свободу. нет ли таких ферзей. ограничивая тем самым возможность выбора. prune завершается неудачей. Ys1 \== []. prune([Q:Ys|Qs]. place_queens(V1.noattacks(X.IV.[X:Ys|V]) :− init_vars(Xs. Заведем список пар (номер ферзя : список допустимых положений). []).5 для каждого ферзя. _. Queens) :− range(1. предполагаемое положение ферзя отвергается сразу. abs(Y2 − Y1) =\= abs(X2 − X1). X.Y.Queens). _._. Размещая очередного ферзя. Ns. для которого осталось меньше всего свободных 68 . Далее надо посмотреть.Ys.[]).V). Y. Этот метод называется "просмотром вперед"(forward checking).Qs). [Q:Ys1|Ps]) :− sublist(noattacks(X. init_vars(Ns. prune(V.

[X−Y|Qs]) :− queen_to_place(V. Ys). Принципы подбора алгоритма поиска пути в зависимости от задачи.X:Ys. Q. 1 2 3 4 5 6 7 8 queen_to_place([V|Vs]. [X|R]) :− select_boundest(Xs. Y. Пример. Процедура queen_to_place выбирает ферзя подлежащего размещению из списка не размещенных. V. prune(V1. N1<N2.N2). с ростом N сокращение играет все большую роль. Qm.1 мест. X. Vx) :− select_boundest(Vs. Q. Q. При сокращении пространства перебора надо соотносить размер этого сокращения с затратами на его реализацию. Вопрос 30. R). то есть того. []). 30 Решение задач методом поиска в пространстве состояний Решение задач методом поиска в пространстве состояний.IV.N1). результат будем представлять в виде списка пар X-Y. Qm. []). Q. _:L2) :− length(L1. Q). Q. select_boundest([X|Xs]. member(Y.V. изменив порядок расстановки ферзей. length(L2. Время. [Q|R]) :− shorter(X. то получим предыдущий вариант. 1 2 3 4 5 6 place_queens(V. place_queens(V2.Vs). На небольших досках эта программа оказывается даже медленнее . shorter(_:L1. Q. X.затраты на реализацию более сложной схемы съедают весь выигрыш от сокращения. select_boundest([X|Xs]. select_boundest(Xs. select_boundest([].V1). Итак. что мы сможем решить задачу для досок большего размера. Если запишем просто 1 queen_to_place([V|Vs]. !. Qm. Vx). Поскольку теперь ферзи необязательно будут размещаться по порядку. у которого список возможных положений самый короткий. V2). Qm. R).Qs). мы можем усовершенствовать программу. Мы же будем выбирать "наиболее ограниченного"ферзя. выполнения программы растет как квадратный корень из N!. Q. place_queens([]. 69 . Тем не менее. а это означает.

1 Операторы Операторы. 31 Вопрос 31. Вычисление значения арифметического выражения по строке. 70 . Преобразование символьных выражений в дерево.IV.

IV. Алгоритм символьного дифференцирования. 32 Вопрос 32. 71 .1 Символьные вычисления Символьные вычисления.

33 Вопрос 33.IV.1 Подходы к символьному упрощению выражений Подходы к символьному упрощению выражений. 72 .

73 .IV.1 Анализ естественного языка с использованием контекстносвободной грамматики Анализ естественного языка с использованием контекстно-свободной грамматики. Подход к интерпретации знаний в естественно-языковом материале. 34 Вопрос 34.

1 Учёт контекстных условий Учёт контекстных условий. 74 .IV. Работа со словарями. 35 Вопрос 35. Глубинные и поверхностные структуры в естественном языке.

IV. 36 Вопрос 36. Мета-интерпретаторы. Примеры. 75 .1 Расширение логического интерпретатора Пролога средствами языка Расширение логического интерпретатора Пролога средствами языка.

Насколько надо знать Mercury ? <?> 2.V 1 Приложение Общие вопросы <?> 1. Сколько кода приводить в ответах на теорию ? <?> 3. Можно своими словами или с формулами ? 76 .

2 1 2 3 4 Статистика Тестирование ργLATEX : ∆α Тестирование $\rho \gamma \LaTeX$ : \begin{python} print "$\\Delta␣\\alpha$␣\n\n" \end{python} Время последней компиляции: Tue Jun 30 11:51:32 2009 Операционная система: win32 nt 77 .

Параметры подготовки Вопросов 8 штук Определений 48 штук 78 .3 Итого.