Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Логическое программирование. Turbo Prolog 2.0.doc
Скачиваний:
72
Добавлен:
04.06.2015
Размер:
1.59 Mб
Скачать

2 Основные конструкции логического программирования

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

?– R1, R2, … Rn.

ЗдесьRi– условия (цели), при выполнении которых целевое утверждение не отвергается. Вопрос– это средство извлечения информации из логической программы. С помощью вопроса выясняется, выполнено ли некоторое отношение (цель) или совокупность отношений между объектами (целей). Простой вопрос состоит из одной цели.

Логические следствия выводятся различными способами. Простейшее из них– совпадение: из наличия в базе данных факта «P.» следует истинность целевого утверждения «?– P.». По аналогии: из наличия «R1.», «R2.», … «Rn.» логически следует истинность «?– R1, R2, … Rn.». Возможные варианты ответов на вопрос:Yes– в случае его истинности иNo,если в базе данных отсутствуют данные, подтверждающие истинность целевого утверждения1.

Так к приведенной выше программе можно задать, например, следующие вопросы и получить на них ответы:

?– man("Петр I").

Yes

?–woman("Елизавета Петровна").

Yes

?– woman("Павел I").

No

?– man("Генрих III").

No

Обратите внимание на последний вопрос. На него был получен отрицательный ответ. И дело тут, конечно, не в склонностях последнего из Валуа2, а в том, что в данной программе нет никакой информации об этом французском короле. ОтветNoследует так и трактовать: «в базе данных нет фактов подтверждающих, что объектГенрих IIIобладал свойствомman», и не более того. Отсюда отнюдь не следует, что он этим свойством не обладал на самом деле.

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

Вкачестве подстановок в рассматриваемой программе можно, например, рассматривать множестваΩ1={X="Петр I"}, Ω2={X="Алексей Петрович"}, Ω3={X="Петр II"}, Ω4={X="Петр III", Y="Екатерина II"} и т.д. Результат применения подстановкиΩк термуA есть терм, полученный заменой каждого вхождения переменнойXв термAнаtдля каждой пары видаX= tΩ.

Поясним сказанное на примерах. Результатом подстановки Ω1к термуman(X)будет термman("Петр I"), при подстановкеΩ4кpair(X, Y)будет получен термpair("Петр III", "Екатерина II"), при подстановкеΩ1вchild("Алексей Петрович", X)получимchild("Алексей Петрович", "Петр I"). Попытаемся применить подстановкуΩ2к термуchild("Алексей Петрович", X). Получим термchild("Алексей Петрович", "Алексей Петрович")с весьма странной интерпретацией. Здесь нет никакого противоречия, мы имеем дело именно с синтаксической конструкцией, которую определили выше как терм, а не с фактом– ничто не мешает нам задать системе вопрос:

?– child("Алексей Петрович", "Алексей Петрович")

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

Положительным ответом Пролог-программы на вопрос, содержащий переменные, будут все конкретизации переменных, приводящие к обобщению и сообщениеYes. Например, к приведенной выше программе можно задать вопрос: «Чьим ребенком была Елизавета Петровна?»

?– child("Елизавета Петровна", X).

и в результате будет получен ответ:

X= "Петр I"

X= "Екатерина I"

Yes

Ответ Yesполучен в соответствии с применениемобобщения. Значения"Петр I"и"Екатерина I"– в результатеконкретизациипеременнойXподстановкамиX= "Петр I"иX= "Екатерина I"

Более сложный вопрос: «Кто был сыном Петра I?» (иначе: «Кто был ребенком мужского пола у Петра I?») может быть представлен как конъюнкция двух целей «Кто был ребенком Петра I?»& «Был ли этот ребенок мужчиной?»:

?– child(X, "Петр I"), man(X).

X= "Алексей Петрович"

Yes

Вопросы такого рода принято называть конъюнктивными.

Обратимся к генеалогическому дереву на рисунке 1. Там указаны только два вида родственных отношений: супруги(в нашей программеpair) иребенок(child). Тем не менее, пользуясь этой схемой, практически любой человек без особого труда сможет ответить, например, на вопрос: «Кто был отцом Павла I?». Отношениеотецнепосредственно на схеме не отражено. Каким же образом человек, впервые в жизни увидевший генеалогическое дерево Романовых, на основании только сведений о супружеских и родительских связях ухитряется получить эту завуалированную информацию? Очевидно, что он при этом пользуется еще чем-то, помимо непосредственно изложенных фактов. Этим «чем-то» являются общеизвестныеправила, определяющие сложные родственные связи. Если человека, утверждавшего на основании рис. 1, что Петр III был отцом Павла I, спросить, почему он так думает, вероятнее всего вопрос вызовет у него недоумение: «Как это почему? На схеме ясно указано, что он ребенок Петра III, а тот хоть и плохонький был, да мужик». В терминах языка Пролог это означает, что данный вывод был сделан на основании конъюнкции фактов: child(Павел I, Петр III) & man(Петр III)(последнее уточнение необходимо для того, чтобы различить понятияматьиотец). Аналогичным образом нетрудно определить отцов и для других членов династии. В общем случае можно говорить, что нектоXприходится некоторомуYотцом, если выполняются следующие условия:Y– ребенокXиX– мужчина. Мы пришли к третьему и самому важному виду утверждения в логическом программировании–правилу, позволяющему определять новые отношения в терминах существующих отношений.

Для обозначения правил используется запись вида «Q:– P1, P2, …, Pn», которая интерпретируется, как «цельQудовлетворяется, если удовлетворяются подцели (условия)P1,P2, …,Pn, (n≥0)». ПредикатQ, стоящий слева от знака «:—», называетсязаголовком правила, а предикаты P1,P2, …,Pn, входящие в условие, составляюттело правила. Как следует из определения, факт является частным случаем правила, приn=0.

Запишем в виде правил отношения fatherиmother1и внесем их в нашу программу:

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

mother(X, Y):– child(Y, X), woman(X).

Попробуем задать системе некоторые вопросы:

1) Кто был отцом царицы Елизаветы?

?– father(X, "Елизавета Петровна").

Единственная подстановка, приводящая к обобщению:

X= ”Петр I”

Yes

2) Кому приходилась матерью Екатерина II? (не путать с вопросом: «Кто был ребенком Екатерины II?»):

?– mother("Екатерина II", X).

X= ”Павел I”

3) Абсурдный, но с точки зрения синтаксиса Пролога вполне корректный вопрос:

?– father("Екатерина II", X).

No

Екатерина II была волевой и жесткой правительницей, бесспорно, обладала качествами традиционно приписываемыми мужчинам, у нее был сын, но при этом она оставалась женщиной, матерью и никак не могла стать отцом. Для введенного нами правила невозможна ситуация описанная Астрид Линдгрен, когда Малыш был «родной матерью» для Карлсона. «Родным отцом»– еще, куда ни шло, но матерью– никогда! Наше правило fatherэтого не допустит.

Пользуясь уже введенными правилами можно определять новые правила. Так дедушка и бабушка1– это, соответственно:

grandfather(X, Y):–

father(X, Z), child(Y, Z).

grandmother(X, Y):–

mother(X, Z), child(Y, Z).

Несколько сложнее определить отношение wife2, не говоря уже оmother_in_law3, используя имеющиеся в настоящий момент понятия. Обратите внимание на фактыpair, определяющие супружеские отношения между членами династии. Не всегда в качестве первого аргумента использовалось имя мужчины. Рука не поднимается записать Екатерину Великую после Петра III. Вследствие этого определить отношениеженаодним конъюнктивным правилом невозможно – оно неизбежно оказывается неполным. Необходимо использование, по крайней мере, двух одноименных правил:

wife(X, Y):– pair(X, Y), woman(X).

wife(X, Y):– pair(Y, X), woman(X).

Теперь не сложно справиться даже с тещей– это всего лишь мать жены:

mother_in_law(X, Y):– mother(X, Z), wife(Z, Y).

Контрольные вопросы

  1. Что такое вопрос в логическом программировании?

  2. Назовите виды вопросов.

  3. Что называется переменной в логическом программировании?

  4. Каковы требования к переменным в Прологе?