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.