Программа "Конструктор слов" (листинг 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