Материал: Терёхин В. В. Turbo Prolog

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

структором" пример электронного словаря.

_____________________________________________________________

Листинг 3.2

/* Программа: Словарь Файл: PROG0302.PRO

*/

/* Назначение: Демонстрация ассоциаций слов при

*/

/*

помощи небольшого словаря.

*/

 

domains word,

syn1, syn2, syn3,

ant1, ant2, ant3 = symbol

predicates synonym(word,syn1,syn2,syn3) antonym(word,ant1,ant2,ant3)

goal

synonym(brave,S1,S2,S3) and write("The synonyms for 'brave' are ")

and nl and write(S1,",",S2,",",S3,".") and nl and antonym(rare,A1,A2,A3) and

write("The antonyms for 'rare' are") and nl and write(A1,",",A2,",",A3,".") and nl.

clauses synonym(brave,daring,defiant,courages). synnym(honest,truthful,open,sincere). synonym(modern,new,novel,recent). synnym(rare,uncommon,scarce,infrequent).

antonym(brave,cowardly,fearful,timid). antoym(honest,dishonest,crooked,deceithful). antoym(modern,ancient,old,obsolete). anto-

nym(rare,common,ordinary,ubiqutious).

 

/*****

конец программы

*****/

____________________________________________________________

Внутренняя цель программы "Словарь" скомпонована из двух подцелей. Задачей первой из них является выдача трех синонимов слова brave, задачей второй - выдача антонимов слова rare.

Отметим, что в записи целевого утверждения присутствует ключевое слово and, используемое в качестве разделителя. Здесь оно играет ту же роль, что и запятая в конструкции цели предыдущей программы.

*Упражнение

3.2.Модифицируйте программу из упражнения 3.1 так, чтобы она использовала предикат

46

cities_of_state(state,city1,city2,city3,city4)

/* города страны(страна,город1,город2,город3,город4) */

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

Программа "Президенты" (листинг 3.3) демонстрирует использование различных типов объектов. Утверждения данной программы содержат сведения о шести президентах США. Предикат

president(name,party,state,birth_year,year_in,year_out)

/* президент(имя, партия, штат, год рождения, начальный год пребывания у власти, конечный год пребывания у власти) */

имеет объекты типа символьной строки и типа целого числа, как это видно из раздела программы domains.

____________________________________________________________

Листинг 3.3

/* Программы: Президенты

*/

/* Назначение: Демонстрация отношений (предикатов)

*/

/*

и получение информации из БД.

*/

domains

name,party,state = symbol birth_year,year_in,year_out = integer

predicates

president(name,party,state, birth_year,year_in,year_out)

goal

president(X,democrat,S,Yb,Yi,Yo),nl, write(X," - democrat"),nl, write("State ",S),nl,

write("Birth year - ",Yi),nl, write("Year-in - ",Yi),nl, write("Year-out - ",Yo),nl,nl.

clauses

president(eisenhower, republican, texas, 1890,1953,1961). president(kennedy, democrat, massachusetts, 1917,1961,1963). president(johnson,democrat,texas, 1908,1963,1969). president(nixon,republican,california, 1913,1969,1974). president(ford,republican,nebraska, 1913,1974,1977). president(carter,democrat,georgia, 1924,1977,1981).

/***** конец программы *****/

___________________________________________________________

47

Последние три объекта предиката president - целые числа, их доменами являются соответственно birth_year, year_in и year_out. Объявление доменов в разделе программы domains выглядит достаточно просто:

birth_year,year_in,year_out = integer

Запятая в этом объявлении служит в качестве разделителя при перечислении имен доменов одного типа.

Цель программы на естественном языке можно сформулировать следующим образом: "Выдать место, год рождения, начальный и конечный год пребывания у власти всех президентов-демократов." Первая подцель содержит свободные переменные Х, S, Yb, Yi и Yo, и значение объекта democrat. (Заметим, что в данном примере имена переменных являются ключом для понимания смысла соответствующих объектов, так, например, Yb - это "year of birth" - год рождения.). Когда программа запускается на счет, свободным переменным присваиваются соответствующие значения из второго утверждения. Следующие пять подцелей включают в себя предикаты write для печати этих значений в разных строках экрана. Данную программу можно также использовать и при отсутствии внутренней цели, то есть когда опущен раздел goal.

*Упражнение

3.3.Введите программу "Президенты". Модифицируйте программу таким образом, чтобы цель стала внешней, запустите программу на счет и задайте вопрос:

president(X,republican,S,Yb,Yi,Yo).

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

3.3.Введите программу "Президенты. Модифицируйте программу таким образом, чтобы цель стала внешней, запустите программу на счет и задайте вопрос:

president(X,republican,S,Yb,Yi,Yo).

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

3.3.3 Использование правил в запросах

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

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

48

В Турбо-Прологе эта задача решается конструированием правил, не содержащих в себе данных, т. е. правил нулевой арности. Задача, таким образом, сводится к написанию сокращенного варианта запроса. Пояснить только что сказанное можно на следующем примере. Представим себе некую гипотетическую семью: Фрэнк и Мэри являются мужем и женой. Их сына зовут Сэмом, а дочку - Дебби. Ниже приведен небольшой диалог, касающийся этой семьи.

Вопрос: Кем приходятся друг другу Дебби и Сэм ? Ответ : Дебби - сестра Сэма.

Вопрос: Из чего Вы это заключили ?

Ответ : У Дебби и Сэма одни и те же родители, Дебби - девочка. Таким образом, Дебби - сестра Сэма.

Второй из вопросов является разговорной формулировкой правила, которое будет использоваться для ответа на запрос. Это правило можно перефразировать таким образом:

Дебби - сестра Сэма, если Дебби - существо женского пола,

и родители Дебби есть родители Сэма.

Фраза включает в себя условие "если" (if), который логически связывает оба утверждения. Утверждение, предшествующее "если" называется заключением или логическим следствием, а утверждение, следующее за "если" - допущением или предпосылкой.

Предикатные выражения являются теми блоками, из которых в Прологе строятся правила. Факты, описывающие отношения между Фрэнком, Мэри, Сэмом и Дебби можно сформулировать при помощи таких утверждений Турбо-Пролога:

male("Frank"). /* Фрэнк - мужского пола */ male("Sam"). /* Сэм - мужского пола */ female("Mary"). /* Мэри - женского пола */ female("Debbie"). /* Дебби - женского пола */ parents("Sam","Frank","Mary"). /* Родители Сэма есть

Фрэнк и Мери */ parents("Debbie","Frank","Mary").

/* Родители Дебби есть Фрэнк и Мери */ Имея в наличии эти утверждения, необходимо лишь ввести правило,

задающее отношение брат-сестра: sister(Sister,Brother) if female(Sister),

parents(Sister,Father,Mother), parents(Brother,Father,Mother).

Отметим, что в формулировке правила нет никаких данных о конкретной семье; объекты Sister, Brother, Father и Mother являются переменными.

Двойное использование предиката parents устанавливает логическую связь между переменными Sister и Brother. Наличие предиката female позволяет выбрать ребенка женского пола. Три предиката предпосылки правила вполне достаточны для получения нужного заключения. Программа

49

"Родственники" (листинг 3.4) является конечной программой на ТурбоПрологе, демонстрирующей использование перечисленных фактов и прави-

ла sister.

_____________________________________________________________

Листинг 3.4

/* Программа: Родственники Файл: PROG0304.PRO */ /* Назначение: Демонстрация конструкции правила. */

domains

person = symbol predicates

male(person)

female(person) parents(person,person,person) sister(person,person) who_is_the_sister

goal who_is_the_sister clauses

/* факты */ male("Frank"). male("Sam"). female("Mary"). female("Debbie"). parents("Sam","Frank","Mary"). parents("Debbie","Frank","Mary").

/* правила */ who_is_the_sister if

sister(Sister,Brother),

write(Sister,

" is the sister of ", Brother, "."),

nl. sister(Sister,Brother) if

female(Sister), parents(Sister,Father,Mother), parents(Brother,Father,Mother).

/***** конец программы *****/

_____________________________________________________________

Программа "Родственники" содержит еще одно правило: предикат who_is_the_sister. who_is_the_sister является целью программы, ее единст-

венным целевым утверждением. Это правило определяется в разделе утверждений программы clauses. Ввиду того, что цель задается в виде правила, точка входа раздела goal являет собой единственное целевое утверждение без подцелей. Тело правила состоит из двух частей. Первая часть это правило sister. В качестве второй части - предпосылки - используется предикат write, который выводит полученные правилом sister результаты. При разра-

50