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

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

Программа "Конструктор слов" (листинг 3.1) является примером законченной программы с использованием предикатов и утверждений. Целью программы является поиск и печать синонима некоторого слова. Синонимом слова brave является daring. Следующее утверждение указывает на синонимичность этих слов:

synonym(brave, daring). /* daring - синоним brave */

Термом предиката здесь является synonym, а объекты это brave и daring. Описание предиката для этого утверждения будет выглядеть так:

synonym(word,syn)

где word и syn - объекты описываемого предиката.

____________________________________________________________

Листинг 3.1

/* Программа: Конструктор слов Файл: PROG0301.PRO */

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

*/

/*

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

*/

domains

 

 

word, syn ,ant = symbol

 

predicates synonym(word,syn) antonym(word,ant)

goal

synonym(brave,X),

write("A synonym for 'brave' is "), nl,

write("'",X,"'."), nl.

clauses synonym(brave,daring).

synonym(honest,truthful). synonym(modern,new). synonym(rare,uncommon). antonym(brave,cowardly). antonym(honest,dishonest). antonym(modern,ancient). antonym(rare,common).

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

_____________________________________________________________

Описание их доменов - это word, syn = symbol

Данное описание показывает, что оба объекта предиката synonym представляют собой символические имена. Предикат synonyn используется в четырех утверждениях:

41

synonym(brave,daring). synonym(honest,truthful). synonym(modern,new). synonym(rare,uncommon).

В любом из этих утверждений на первой позиции стоит некоторое слово, а на второй - его синоним.

3.3.1 Использование внешних и внутренних целей

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

* Внутренние цели

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

synonym(brave, X)

Х здесь является свободной переменной, ее значение не конкретизировано. (Запомните, что в Турбо-Прологе имя переменной обязательно начинается с большой буквы.) Говоря обычным языком, в данном предложении сформулирована такая цель: "Найти утверждение, использующее предикат synonym, такое, что первым объектом в нем является brave, и связать переменную Х с его вторым объектом".

После запуска программы, Турбо-Пролог будет просматривать утверждения, содержащие synonym. Если таковое с объектом brave будет обнаружено, то Х примет значение второго объекта. В нашем случае им будет daring.

Второй подцелью является печать следующей строки символов на эк-

ране:

A synonym for 'brave' is

Эта подцель образована при помощи предиката write, одного из многих "встроенных" предикатов Турбо-Пролога. Подобные предикаты не требуют специального описания в программе, их можно использовать сразу.

Встроенный предикат write в данной программе встречается в виде write("A synonym for 'brave' is ")

Двойные кавычки при этом применяются для ограничения символьной строки A synonym for 'brave' is ; подобным образом должны выделяться все символьные строки. Предикат write может также содержать имена переменных, в этом случае кавычки не требуются.

Простейшим примером может служить

42

write(X),

где Х - это имя переменной. Если Х принял значение daring, то write это daring и напечатает.

В обоих случаях как символьная строка, так и переменная являются аргументами предиката write. Так же как и у других предикатов аргументы write разделяются запятыми. Аргументы можно произвольно смешивать при условии соблюдения описываемых соглашений. Компилятор Турбо-Пролога поправит Вас, если Вы пропустите кавычки, или сделаете какую-либо другую ошибку того же порядка.

Пример смешанной записи аргументов:

write("Today is the ",N,"th day of ",M,", a ",D,".").

Этот предикат напечатает предложение

Today is the 19th day of August, a Tuesday.

(Сегодня 19 августа, вторник)

если значениями переменных N, M и D будут соответственно 19, August и

Tuesday.

Третья подцель задается еще одним встроенным предикатом: nl. Предикат nl сдвигает курсор в начало следующей строки. Четвертая подцель - печать всех трех объектов, заключенных в круглые скобки. Первый из них представляет собой обычную кавычку; второй, обозначенный как Х, - это daring; третий состоит из кавычки и точки. Пятая подцель, еще один предикат nl, сдвигает курсор к началу строки, следующей за строкой с daring. Отметим, что предложение, описывающее цель, должно оканчиваться точкой; если точка будет опущена, компилятор выдаст сообщение об ошибке, и трансляция программы будет прекращена.

В результате выполнения всей совокупности целевых утверждений на экране возникнет картинка.

*Внешние цели

Если Вы запустите на счет программу, в которой будет отсутствовать

описание цели, то Турбо-Пролог попросит Вас ввести цель с экрана. Если, например, из программы "Конструктор слов" удалить раздел goal и запустить ее на счет, то на экране в окне Dialog возникнет приглашение Goal: .

Предположим теперь, что Вы хотите задать вопрос: "Какое слово является синонимом слова modern ?" Так же, как и при записи внутренней цели, переменная Q будет использоваться для представления значения, которое Турбо-Пролог поставит ей в соответствие, используя утверждения базы данных. С ее помощью вопрос формулируется в виде

synonym(modern,Q).

Результатом ввода этого предложения явится картинка экрана. После удовлетворения внешней цели выполнение программы, однако, не завершается. Турбо-Пролог просит ввести следующую внешнюю цель. Таким образом, можно задать столько целей, сколько это представляется необходимым; чтобы остановить этот процесс нужно нажать клавишу Esc при выдаче очередного приглашения.

43

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

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

*Упражнение

3.1.Придумайте и напишите программу, использующую предикат

capital(state,city) /* столица (государство, город) */

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

Запустите Вашу программу и введите цели, реализующие следующие вопросы: Какой город является столицей Вашей страны ?

Столицей какой страны является Москва ?

3.3.2 Предикаты и утверждения разных арностей

Как уже говорилось в предыдущей главе, при трансляции утверждений Турбо-Пролог контролирует правильность написания имени предиката, количество объектов и типы их доменов. Термин арность обозначает число объектов утверждения. Так утверждение likes(mary, apples) имеет арность 2.

Большинство программ, написанных на Турбо-Прологе, содержит несколько различных утверждений. Примером этих "несколько" может служить наличие в программе утверждений likes(mary,apples), runs(john,6.3) и drinks(beth,tea,coke). Если в вопросе содержится утверждение watches(john, cats), то Турбо-Пролог пытается найти соответствие с предикатом watches, все остальные предикаты при этом игнорируются. Процесс сопоставления начинается с поиска утверждений с предикатом watches. Затем ищутся утверждения, которые имеют такое же общее число объектов. В утверждении с watches объектов два: john и cats. Количество объектов в предикате вопроса и утверждениях программы должно совпасть, иначе процесс сопоставления прекращается.

Если утверждения с таким же, как в вопросе, предикатом и таким же числом объектов найдены, то Турбо-Пролог проверяет соответствие типов объектов. В случае с watches(john,cats) как john, так и cats принадлежат типу symbol. Если в типах объектов обнаруживается несоответствие, то считается, что попытка сопоставления окончилась неуспешно.

Рассмотрим теперь такие предикаты разных арностей: go_home

44

female(person)

father(person,person)

owns(person,book,book) europe(country,country,coutry,country)

Объектами предикатов являются person, book и country. Следующие утверждения используют эти предикаты; арность каждого из них указана в крайней правой колонке.

Предикат

Утверждения

Арность

go_home

go_home

0

female(person)

female(betty)

1

 

female(katty)

 

father(person,person)

father(john,kathy)

2

 

father(john,tom)

 

owns(person,book,book) owns(sam,"Hobbit","Lord

3

 

of the Rings")

 

europe(country,country, europe("France","Germany",

4

country,country)

"Spain","Italy")

 

Первый из предикатов, go_home, не имеет объектов, его арность равна нулю. Предикаты этого типа часто используются для построения правил, как, например,

go_home if condition(sickness)

go_home if (condition(sickness) and transportation(bus))

Предикаты арности 1 полезны при сортировке объектов программы по доменам. В приведенном выше примере предикат female указывает, что имя betty относится к домену женских имен.

Предикаты арности 2 используются для установления отношения между двумя объектами. Так, предикат

father(person,person)

и соответствующее ему утверждение father(john,kathy)

будут означать, что john является отцом kathy. Заметьте, что это же утверждение можно было бы записать и так:

father(kathy,john)

Тогда бы оно "переводилось" как "Отец kathy eсть john". Таким образом в данном примере порядок следования объектов не важен.

Предикаты арностей выше 2 пригодны для установления связи нескольких объектов по какому-либо признаку. В утверждении

europe("France","Germany","Spain","Italy")

все используемые значения: France, Germany, Spain и Italy принадлежат домену country. Общим для них является то, что все они обозначают европейские страны.

Программа "Словарь" (листинг 3.2) представляет собой некоторое усложнение программы "Конструктор слов". В ней предикат synonym содержит уже четыре объекта: само слово и три его синонима. Дополнительно введен предикат antonym с таким же количеством объектов. Эта программа являет собой несколько более реалистичный по сравнению с "Кон-

45