Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.роб_01_Штучний інтелект.doc
Скачиваний:
21
Добавлен:
19.02.2016
Размер:
337.41 Кб
Скачать

3. Задание запросов

Приступим к заданию запросов к программе. Запросы в Прологе называются целью (goal) , которую он должен доказать, то есть вывести из имеющихся фактов на основе знаний, заданных в виде правил.

Исследуем реакцию пролог-программы на следующие запросы.

  • parent(pam, bob) является ли Пам родителем Боба? Ответ – yes.

  • man(pam) Пам – мужчина? Ответ – no.

В данных запросах аргументы предикатов заданы в виде констант. Поэтому ответ может быть только утвердительный или отрицательный. Но аргументы могут задаваться в виде переменных. В Прологе переменная это последовательность букв и цифр, начинающаяся с заглавной буквы.

  • parent(Who, bob) кто родители Боба? Программа отвечает, что цель выводиться (yes) из существующих фактов, при этом имеются два решения (2 solutions): Who=pam и Who=tom.

  • parent(X, Y) кто кому родитель? В данном случае будут выведены все родители и их дети. Иногда возникает задача получить только имена детей, а имена родителей нас не интересуют. Тогда используется анонимная переменная – символ подчеркивания "_" (цифровой ряд клавиатуры, клавиша со знаком "минус").

  • parent(_ , Child) выводятся только имена детей.

  • самостоятельно – есть ли мужчины? Как зовут мужчин?

В окне диалога можно задавать сложные запросы, состоящие из нескольких целей, разделяемые запятой.

  • parent(Who, bob), man(Who) Первая цель – кто родитель Боба? Вторая – является ли найденный родитель мужчиной? То есть кто отец Боба?

  • самостоятельно – как зовут дочь Боба?

Удобнее вместо задания сложных запросов, записать в теле программы правила, определяющие новые отношения через существующие.

4. Задание новых отношений-правил.

4.1 Отношения, в описании которых участвуют два объекта.

Введем новое отношение отец (имя отца, имя ребенка) (рис.1) и запишем правило, выражающее это отношение через существующие отношения родитель(имя родителя, имя ребенка) и мужчина(имя).

рис. 1

Некто Х приходиться Y отцом, если этот Х – родитель Y, и Х – мужчина. По правилам Пролога эта фраза запишется так:

Отец (Х, Y) : – родитель (Х, Y), мужчина (Х).

Левая часть правила – голова правила, а правая состоит из списка целей. Цели записываются через запятую (,- и) или (;- или).

Дополним программу описанием нового предиката в секции predicates

father(symbol, symbol)

и правилом, задающим понятие отца в секции clauses

father(X, Y):–parent(X, Y), man(X).

Запустите программу на выполнение и задайте запрос: кто кому отец?

father(F, Ch)

Программа должна выдать два решения.

Самостоятельно написать правило для отношения: мать(имя матери, имя ребенка)

В соответствии с рис.2 запишите правило для отношения дочь(имя дочери , имя матери). Самостоятельно для отношения – сын.

4.2. Отношения, в которых участвуют более двух объектов.

В рассмотренных выше примерах при задании правила участвовали только 2 объекта. Составим правила с двумя и более участниками.

Введем отношение дед(имя деда, имя ребенка). Дед это родитель (мужчина) родителя. Обозначим переменными X, Z, Y участников отношения. Тогда отношение дед описывается правилом:

дед(X, Y):–родитель(X, Z), родитель(Z, Y), мужчина(X).

Дополните программу описанием отношения дед, правилом для этого отношения и протестируйте их. Самостоятельно запишите отношения баба, внук и внучка и проверьте правильность работы программы.

4.3. Использование уже составленных отношений.

Пролог позволяет в качестве подцелей в правой части описания правила задавать имена уже описанных отношений. Принцип математики - сведение задачи к уже решенной ранее. Так отношение дед можно записать так: дед_2(X,Y):–отец(X, Z), родитель(Z,Y). Проверьте этот вариант. Самостоятельно составьте и отладьте правила для отношений баба, внук, внучка, с использованием ранее составленных.

4.4 Учет свойства рефлексивности отношения.

Запишите правило для отношения сестра(имя сестры, имя). У объектов участвующих в отношении общий родитель. При отладке правила Вы получите лишнее решение – Х является сестрой самой себе. Такое свойство отношения называется рефлексивностью. Для рефлексивного отношения R(a, b) справедливо R(a,a) и R(b, b). Примеры отношений, обладающих рефлексивностью: a  b, a  b, a = b. Пролог поддерживает свойство рефлексивности. Но отношение сестра не является рефлексивным. Поэтому в правиле надо явно указать, что объекты отношения разные: X <> Y.

sister(X, Y):-parent(Z, X), parent(Z, Y), woman(X), X<>Y.

или

sister(X, Y):-daughter(Z, X), parent(Z, Y),(X), X<>Y.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]