- •1.1 Пример программы: родственные отношения.
- •1.2 Факты.
- •1.3 Вопросы.
- •1.4 Переменные.
- •1.5 Конъюнкция целей.
- •1.6 Правила.
- •1.7 Конъюнкция в правилах.
- •2.1 Синтаксис пролога.
- •2.1.1 Константы.
- •2.1.2 Переменные.
- •1.8 Переменные в теле правила.
- •1.9 Cтруктура пролог-программы.
- •2.1.3 Структуры.
- •2.1.4 Операторы - тоже функторы.
- •2.2 Арифметика.
- •2.3 Операции сравнения.
- •2.4 Сопоставление.
- •2.6 Примеры сопоставления структур.
- •3.1 Декларативная семантика Пролог-программ
- •3.2 Дизъюнкция целей
- •3.3 Процедурная семантика
- •3.3.1 Пример вычисления
- •3.3.2 Формальное описание процедуры вычисления целей.
- •3.4 Соотношение между процедурным и декларативным смыслом
- •4.1 Списки
- •4.1.1 Представление списка диаграммой.
- •4.1.2 Выделение головы и хвоста списка
- •4.1.3 Шаблоны списков.
- •4.1.4 Определения отношений через cons форму списка
- •4.1.4 Определения отношений через cons форму списка
- •4.2 Процедуры обработки списков
- •4.2.3 Применение append
- •4.2.5 Длина списка
- •4.3 Встроенные предикаты
- •4.3.1 Простые встроенные предикаты ввода-вывода.
- •4.3.2 Процедурный смысл встроенных предикатов ввода-вывода.
- •4.4 Ввод-вывод списков.
- •4.4.1 Ввод-вывод списка как терма.
- •4.4.2 Поэлементный ввод-вывод списка.
- •5.1 Отсечение.
- •5.1.1 Графическая иллюстрация действия cut.
- •5.1.2 Пример действия cut.
- •5.1.3 Применение cut при выборе альтернатив.
- •5.1.4 Формальное описание действия отсечения.
- •5.2 Применение отсечения.
- •5.2.2 Добавление элемента без дублирования.
- •5.2.3 Классификация.
- •5.2.4 Отсечение в численной рекурсии.
- •5.2.5 Замечания при использовании отсечения.
- •5.3 Сортировка списков.
- •5.3.1 Метод наивной сортировки.
- •5.3.2 Метод пузырька.
- •5.3.3 Mетод вставки.
- •5.3.4 Быстрая сортировка quick.
- •6.1 Отрицание как неудача. (not as failure)
- •6.2 Алгоритм поиска на Прологе. ( Логический подход к задаче о фермере, волке, козе и капусте.)
- •6.3 Чтение и запись информации с файлов.
- •6.3.1 Обработка входных потоков.
- •6.3.2 Обработка выходных потоков.
- •6.4 Обработка символов.
- •7.1 Встроенные предикаты
- •7.1.2 Проверка типа терма
- •7.2 Метапредикаты.(Встроенные предикаты обработки термов.)
- •7.2.1 Создание и декомпозиция термов.
- •7.2.2 Предикаты работы с базой данных
- •7.3 Поиск в лабиринте
- •7.4 Сравнительная характеристика языков программирования.
- •8.1. Операции (Операторы).
- •8.1.1 Приоритет оператора.
- •8.1.2. Тип оператора.
- •8.1.3 Объявление операций.
- •8.2. Поиск.
- •8.2. Поиск.
- •8.2.1 Поиск в Прологе.
- •8.2.2 Поиск в глубину.
- •8.2.3 Поиск в ширину.
- •8.2.4 Резюме Поиска.
- •9.1. Введение
- •9.2 Поиск с предпрочтением.
- •10.1. Постановка задачи
- •10.2. Пример грамматики
- •10.3. Пример разбора вручную.
- •10.4. Реализация грамматического разбора на Прологе.
- •Как должны выглядеть утверждения Пролога ?
- •Запоминание состояния в Прологе.
- •Аналогично для dcg проводится
- •11.1. Постановка задачи
- •Две емкости
- •11.2. Решение задачи
- •12.1. Постановка задачи
- •12.2. Решение
- •13.1. Введение
- •Метод "образовать и проверить"
- •13.2. Раскрашивание плоской карты
1.6 Правила.
Введем отношение peбенок child, обратное к parent "родитель". Можно было бы определить аналогично:
|
child (liz, tom). |
Но можно использовать, что отношение child обратно к parent и записать в виде утверждения- правила :
|
child(Y, X):-parent (X, Y). |
Правило читается так:
Для всех X и Y Y -child X, если X -parent Y.
Правило отличается от факта тем, что факт всегда истина, а правило описывает утверждение, которое будет истинной, если выполнено некоторое условие. Поэтому в правиле выделяют: заключение условие
child(Y, X) |
:- |
parent (X, Y). |
голова
head |
|
тело
body |
Если условие parent (X, Y). выполняется, то логическим следствием из него будет утверждение child(Y, X).
Как правило используется прологом :
Зададим вопрос
?-child(liz, tom). |
|
В программе нет данных о child. Но есть правило, которое верно для всех X Y, в том числе для liz и tom. Мы должны применить правило для этих значений. Для этого надо подставить в правило вместо X - tom, a вместо Y - liz.
Говорят, что переменные будут связаны, а операция будет называться подстановкой. Получаем конкретный случай для правила
child(liz, tom):-parent (tom, liz).
Условная часть приняла вид parent (tom, liz). Теперь надо выяснить выполняется ли это условие. Исходная цель child(liz,tom) заменяется подцелью parent (tom, liz)., которая выполняется, поэтому пролог ответит "yes".
1.7 Конъюнкция в правилах.
Добавим еще одно отношение в базу данных, унарное, определяющее пол.
|
male(tom). male(bob). male(jim). female(liz). female(pam). female(pat). female(ann). |
Теперь определим отношение mother. Оно описывается следующим образом:
Для всех X Y X -mother Y, if X- parent Y и X -female.
Таким образом правило будет
|
mother(X, Y):-parent(X, Y), female(X). |
Можно записать
|
mother(X, Y):-parent(X, Y),
|
или
|
mother(X, Y):-
|
Запятая между двумя условиями означает конъюнкцию целей. Это означает, что два условия должны быть выполнены одновремено. Как система ответит на вопрос?
|
?-mother (pam, bob). yes |
|
Находится правило mother, производится подстановка
X=pam Y=bob
Получаем правило
mother(pam, bob):- parent(pam, bob), female(pam).
Сначала удовлетворяются parent , а затем female
Пролог отвечает: yes Вопрос :
?-mother (X, bob). X=pam |
|
