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

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

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

-раздел predicates служит для описания используемых программой предикатов;

-в разделе goal на языке Турбо-Пролога формулируется назначение созда-

ваемой программы. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы;

-в раздел clauses заносятся факты и правила, известные априорно. О содержимом этого раздела можно говорить как о данных, необходимых для рабо-

ты программы.

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

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

3.2.1 Описание доменов и предикатов

Вгл. 2 приводилось несколько примеров использования предиката likes, как, например,

likes(mary, apples).

Вспомним, что likes здесь является предикатом (термом предиката), а mary и apples - объектами предиката. Турбо-Пролог требует указания типов объектов для каждого предиката программы. Некоторые из этих объектов могут быть, к примеру, числовыми данными, другие же - символьными строками. В разделе predicates, поэтому, Вы должны задать тип объектов каждого из предикатов.

Для того чтобы предикат likes можно было использовать в программе, необходимо сделать следующее описание:

predicates

likes(symbol, symbol)

Это описание означает, что оба объекта предиката likes относятся к типу symbol. Этот тип является одним из базисных типов Турбо-Пролога; базисные типы будут описаны в следующем разделе главы.

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

36

ветственно имена person и thing. Тогда в разделе программы domains должны появиться такие описания:

domains

person, thing = symbol predicates

likes(person, thing)

Имена person и thing при этом будут обозначать некие совокупности (домены) значений. В примере из гл. 2 термы mary и beth принадлежат до-

мену person, а apples - домену thing.

Любое значение домена person может в утверждениях занимать место объекта person из соответствующего предиката. То же самое можно сказать и про домен thing. Рассмотрим, например, такие три утверждения:

likes(john, camera). likes(tom, computer). likes(kathy, computer).

Термы john, tom и kathy принадлежат здесь к домену person,а термы camera и computer - к домену thing. Все три утверждения восходят к одному и тому же предикату - likes; отличие состоит лишь в значениях, которые принимают объекты. Другими словами, все три утверждения являются вариациями одного и того же предиката.

* Описание доменов Турбо-Пролог имеет 6 встроенных типов доменов: символы, целые

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

В таблице 3.1 приведены все 6 стандартных типов доменов ТурбоПролога.

Таблица 3.1. Стандартные типы доменов Турбо-Пролога

Тип данных

Ключевое

Диапазон

значений

Примеры использования

 

слово

 

 

¦ в Турбо-Прологе

Символы

сhar

Все возможные символы

'a', 'b', '#', 'B', '\13', '%'

Целые числа

integer

от -32768 до 32767

-63, 84, 2349, 32763

Действительные

real

от +1Е-307 до +1Е308

-42769, 8324, 360, 093,

числа

 

 

1.25Е23,5.15Е-9

37

Строки

string

Последовательность сим-

"today", "123",

 

 

волов (не более 250)

"just_a_reminder"

 

 

 

pay_check, school_day,

Символические

symbol

1.Последовательность

имена

 

букв, цифр и знака под-

flower

 

 

черкивания; первый символ

 

 

 

- строчная буква

"Stars and Stripes",

 

 

2.Последовательность лю-

 

 

бых символов, заключен-

"singing in the rain"

 

 

ная в кавычки

 

 

 

 

mail.txt,

Файлы

file

Допустимое в DOS имя

 

 

файла

BIRDS.DBA

 

 

 

 

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

payroll(employee_name, pay_rate, weekly_hours)

Этот предикат требует такого описания доменов: employee_name = symbol

pay_rate = integer weekly_hours = real

Описание домена employee_name показывает, что объекты этого домена являются символическими именами. Аналогично, объекты домена pay_rate - это целые числа, а домена weekly_hours - действительные.

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

payroll("John Walker",16,45.25). payroll("Arthur Berman",28,32.50). payroll("Sandy Taylor",23,40.00).

*Описание предикатов

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

go do_menu repeat

look_for_fruits search_for_items

Такие имена пригодны для именования и правил, и целей программы. Например, имя предиката go ассоциируется с началом какого-либо процесса, соответственно оно хорошо подходит в качестве имени цели программы.

38

Имя do_menu более специфично, оно может служить в качестве имени правила, создающего меню. Предикаты подобные только что приведенным обычно называют "голыми", поскольку у них отсутствуют объекты.

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

likes(beth, X) if likes(mary, X).

используются при попытке удовлетворить правую часть.

В подобных случаях объекты предикатов определяются при описании этих правил в разделе программы predicates:

predicates likes(symbol,symbol)

book(symbol,symbol,integer)

/* книга (название, автор, количество страниц) */ person(symbol,char,integer)

/* некто (имя, пол (м или ж), возраст) */ do_search(integer)

sum(real, real, real, real)

Заметим, что перечень объектов предиката заключается в круглые скобки, а в качестве разделителя используется запятая. Так предикат likes имеет два объекта, каждый из которых относится к базисному типу symbol. Этот предикат можно использовать для создания утверждений типа

likes(mary,peaches). likes(john, plums). likes(jack,oranges).

Поскольку все термы : mary, peaches, john, plums, jack и oranges удов-

летворяют требованиям, предъявляемым к символическим именам, то эти утверждения не противоречат описанию предиката в разделе predicates.

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

domains

name, fruit = symbol predicates

likes(name,fruit)

C описаниями подобного рода работать достаточно легко, так как имя домена name сразу же наводит на мысль об именах людей, а fruit - о названиях фруктов. Правда, эти описания не возбраняют написать и такое утверждение, как likes(mary,rain), так как предикат допускает использование любого объекта, коль скоро он представляет собой символическое имя, хотя бы утверждение и выглядело странно. rain (дождь) трудно зачислить в раз-

39

ряд фруктов. Лучше поэтому дать соответствующему домену имя thing или item. Тогда peaches и rain не противоречили бы друг другу.

Предположим теперь, что Вы хотите создать картотеку своих книг. Тогда предикат book логично было бы использовать в виде

book("Tom Sawyer","Mark Twain",1855). book("Man and Superman","Bernard Shaw",1905).

Отметим, что первые два объекта предиката принадлежат к типу symbol, тогда как третий - к типу integer. Сам предикат можно было бы описать как

book(symbol,symbol,integer)

или, что то же самое, domains

title, author = symbol

year

= integer

predicates

 

book(title, author , year)

Чуть позднее в настоящей главе мы рассмотрим более подробно преимущества записи, использующей явное определение доменов.

3.2.2 Правила образования имен в Турбо-Прологе

Любое имя, используемое в Турбо-Прологе, должно состоять не более чем из 250 символов, первый из которых при этом должен обязательно быть строчной буквой латинского алфавита (от a до z). Пробелы в записи имени недопустимы, однако можно использовать подчерк (_) в качестве разделителя компонент так, как это сделано ниже:

employee_name color_of_box wild_animal_kingdom

beginning_of_year_to_date_activities_report

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

domains

a, b = symbol predicates

s(a,b) clauses

s(brave,daring)

3.3 Предикаты и утверждения

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

40