- •2.2.2.1 Вызов Турбо-Пролога и главное меню системы
- •2.2.3 Редактор Турбо-Пролога
- •2.2.3.1 Создание и редактирование программного файла
- •3 Лекция №2. Элементы и конструкции языка Турбо-Пролог
- •3.1 Основные вопросы
- •3.2 Текст лекции
- •3.2.1.1 Имена (идентификаторы)
- •3.2.2.1 Предикаты
- •3.2.2.2 Факты
- •3.2.2.3 Правила
- •3.2.2.4 Цели
- •4 Лекция №3. Объекты данных. Константы, переменные, структуры, списки.
- •4.1 Основные вопросы
- •4.2 Текст лекции
- •Стандартные типы доменов Турбо-Пролога
- •4.2.2.1 Константы
- •4.2.2.2 Переменные
- •4.2.2.3 Структуры
- •4.2.2.3 Списки
- •5 Лекция №4. Структура программы на Турбо-Прологе
- •5.1 Основные вопросы
- •5.2 Текст лекции
- •5.2.2 Структура программы на Турбо-Прологе – до 10 мин.
- •5.2.3.1 Раздел опций компилятора
- •5.2.3.2 Раздел констант
- •5.2.3.3 Раздел доменов
- •5.2.3.4 Раздел предикатов
- •5.2.3.5 Раздел утверждений
- •5.2.3.6 Раздел дбд
- •5.2.3.7 Раздел целей
- •6 Лекция №5. Унификация и поиск с возвратом: программа с фактами
- •6.1 Основные вопросы
- •6.2 Текст лекции
- •7 Лекция №6. Унификация и поиск с возвратом: программа с фактами и правилом
- •7.1 Ключевые (основные) вопросы (моменты)
- •7.2 Текст лекции
- •8 Лекция №7. Унификация и поиск с возвратом: программа с фактами и несколькими правилами
- •8.1 Основные вопросы
- •8.2 Текст лекции
- •9 Лекция №8. Вопросно-ответные системы
- •9.1 Основные вопросы
- •9.2 Текст лекции
- •10 Лекция №9. Средства отладки в Турбо-Прологе
- •10.1 Основные вопросы
- •10.2 Текст лекции
- •/*Программа 5 */
- •11 Лекция №10. Простейший ввод-вывод. Окна.
- •11.1 Основные вопросы
- •11.2 Текст лекции
- •11.2.1 Простейший ввод-вывод
- •11.2.2 Окна
- •12 Лекция №11. Управление поиском решений: предикаты отсечения и возврата
- •12.1 Основные вопросы
- •12.2 Текст лекции
- •/* Программа 5 */
- •Vse_reshenia:-roditel(X,y), write(X, "родитель", y), nl, fail.
- •Vita - родитель sasha
- •/* Программа 6 */
- •/* Программа 7 */
- •13 Лекция №12. Арифметика в Турбо-Прологе. Рекурсия.
- •13.1 Основные вопросы
- •13.2 Текст лекции
- •/* Программа 8 */
- •/* Программа 9 */
- •14 Лекция №13. Динамические базы данных
- •14.1 Основные вопросы
- •14.2 Текст лекции
- •/* Программа работы с дбд*/
- •15 Лекция №14. Работа со списками
- •15.1 Основные вопросы
- •15.2 Текст лекции
- •/* Программа 10*/
- •/* Программа 11 */
- •/* Программа 12 */
- •16 Лекция №15. Экспертные системы
- •16.1 Основные вопросы
- •16.2 Текст лекции
- •/* Программа эс*/
8 Лекция №7. Унификация и поиск с возвратом: программа с фактами и несколькими правилами
Время: 2 часа (90 мин.)
8.1 Основные вопросы
- обработка фактов и правил.
8.2 Текст лекции
Введём теперь в рассмотрение два новых предиката, определяющие пол людей:
male(person) – мужчина;
female(person) – женщина.
Эти предикаты являются унарными и используются для выражения свойств объектов.
Определим теперь отношение “сестра” предикатом и правилом:
sestra(person, person)
sestra(X, Y):-female(X), roditel(Z, X), roditel(Z, Y), X<>Y.
Приведенное правило необходимо понимать так: “Х является сестрой Y, если X – женщина, если у X и Y общий родитель Z и если X не равен Y”. Таким образом, правило в своей правой части содержит конъюнкцию условий, которые должны выполняться одновременно, чтобы выполнялась левая часть правила.
Дополним программу-2 новыми предикатами и правилом, рассмотренными выше:
/* Программа 3 */
domains
person = symbol
predicates
roditel(person, person)
rebenok(person, person)
male(person)
female(person)
sestra(person, person)
clauses
roditel(ola,sasha).
roditel(vita,sasha).
roditel(vita,kata).
roditel(sasha,ana).
roditel(sasha,vera).
roditel(vera,kola).
male(sasha).
male(vita).
male(kola).
female(ola).
female(kata).
female(ana).
female(vera).
rebenok(Y, X) :- roditel(X, Y).
sestra(X, Y):-female(X),
roditel(Z, X),
roditel(Z, Y),
X<>Y.
Зададим данной программе вопрос “Является ли ana сестрой vera?”:
Goal:sestra(ana, vera)
Турбо-Пролог отыскивает голову правила для отношения sestra и конкретизирует переменные X и Y (X=ana, Y=vera). Само правило принимает следующий частный вид:
sestra(ana, vera):-female(ana),
roditel(Z, ana),
roditel(Z, vera),
ana<>vera.
Далее Турбо-Пролог пытается удовлетворить условиям правой части правила, для чего последовательно решаются подзадачи, входящие в список условий.
Первой подзадачей является подзадача:
female(ana).
Поскольку такой факт в разделе clauses программы имеется, то данная подзадача считается решенной и Турбо-Пролог переходит к решению второй подзадачи:
roditel(Z, ana).
В результате унификации с соответствующим фактом из раздела программы clauses переменная Z конкретизируется и получает значение sasha(Z=sasha). Турбо-Пролог переходит к решению третьей подзадачи с конкретным значением Z:
roditel(sasha, vera).
Такой факт, в программе, имеется и поэтому Турбо-Пролог переходит к последней, четвёртой, подзадаче:
ana<> vera.
Это условие также выполняется и, таким образом, выполняются все условия правой части правила. Следовательно, выполняется и левая часть правила. Поэтому на поставленный вопрос система ответит утвердительно (YES).
Зададим теперь программе вопрос “Кто является сестрой sasha?”:
Goal:sestra(Kto, sasha)
В результате унификации данного вопроса с головой соответствующего правила получим его следующий частный вид:
sestra(Kto, sasha):-female(Kto),
roditel(Z, Kto),
roditel(Z, sasha),
Kto<>sasha.
Далее Тубо-Пролог решает подзадачи, определяемые правой частью правила, первой из которых является следующая подзадача:
female(Kto).
Турбо-Пролог просматривает факты с предикатом female и связывает свободную переменную Kto со значением ola. Поскольку, в данном случае, возможно более чем одно решение, Турбо-Пролог помещает маркер возврата у факта female(kata), следующего за фактом female(ola).
Следующей подзадачей, с уже конкретизированной переменной Kto, является подзадача:
roditel(Z, ola).
Поскольку в программе нет фактов roditel со вторым аргументом ola, Турбо-Пролог не может решить эту подзадачу. Происходит возврат к установленному ранее маркеру возврата и освобождение связанной переменной Kto. Далее Турбо-Пролог устанавливает новое значение для переменной Kto=kata, а маркер возврата помещается у следующего факта с данным предикатом. И вновь решается вторая подзадача с другим значением переменной Kto:
roditel(Z, kata).
Данная подзадача унифицируется с фактом roditel(vita, kata) и, т.о., переменная Z получает значение vita. Далее решается третья подзадача:
roditel(vita, sasha).
Такой факт в разделе clauses программы имеется, и, т.о., подзадача решена. Далее решается четвёртая подзадача:
kata<>sasha.
Неравенство выполняется, и система на поставленный вопрос определяет первый ответ:
Kto=kata
Турбо-Пролог возвращается к маркеру возврата для поиска других вариантов решений. Однако другие варианты решений отсутствуют и, соответственно, дополнительных ответов на поставленный вопрос не появляется. Система даёт ответ:
Kto=kata
1 Solution