logo
TurboProlog / Документация / TOM_2

Статические термы: область sTerm (статических термов)

В Турбо Прологе могут быть легко смоделированы термы традиционного

Пролога. Для статических термов адекватной областью является:

sTerm = var(string);

cmp(string, sTermList);

list(sTerm, sTerm);

nill;

atom(string);

int(integer);

str(string);

char(char)

sTermList = sTerm*

Такое объявление задает область для статического терма, называемую

sTerm, которая может быть переменной, сложным объектом, списком, атомом,

nill, целым, строкой или символом. Оно также определяет список статичес-

ких термов, как sTermList.

Прежде чем идти дальше, следует объяснить, почему этот тип термов

называется статическим. Статические термы не изменяются; они похожи на

исходный код программы. Предложение - это статический сложный терм, соз-

даваемый из других статических термов. Когда статические термы читаются

интерпретатором, они преобразуются в активные термы, которые можно проин-

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

менные. Этот процесс будет подробно изложен ниже.

Вот элементы sTerm, определенные в данном объявлении:

- функтор var обрабатывает переменные.

- функтор cmp вводит общий сложный объект.

- Числовой тип представлен integer, int(integer); равнозначно

также можно выбрать real.

- альтернатива list часто применяется для оптимизации списков.

- альтернативы str и char представляют соответственно строковые

и символьные типы.

- функтор atom обрабатывает отдельные атомистические типы.

Эти отклонения от общего типа терма рекомендуются по причине эффек-

тивности, хотя это не является главным. В данном приложении мы будем сле-

довать соглашению языка Пролог, что все, начинающееся с заглавной буквы

определяет переменную, в то время как области начинаются с прописной бук-

вы.

В приведенной ниже таблице показано, как можно использовать область

sTerm для моделирования традиционных термов Пролога, как с оптимизацией,

так и без нее:

----------------------------------------------------------------

Терм Пролога Представленный как структура Оптимизация?

в области sTerm

----------------------------------------------------------------

This_is_a_variable var("This_is_a_variable")

not_a_variable cmp("not_a_variable",[]) (нет)

atom("not_a_variable") (да)

"a string" str("a string")

food("banana",150) cmp("food",[str("banana"),int 150)])

food(banana,150) cmp("food",[cmp("banana"[]),int 150)]) (нет)

cmp("food",[atom("banana"),int 150)]) (да)

[1,a] cmp(".",[int(1),cmp(".", (нет)

[cmp("a",[]),[]])])

list(int(1),list(atom("a"),nill)) (да)

----------------------------------------------------------------

Хотя представляемые термы Пролога могут показаться странными, но на-

шей целью является иллюстрация следующей важной мысли:

Область Турбо Пролога может обрабатывать любой традиционный терм

Пролога с помощью общего функтора cmp и связанных с ним специальных функ-

торов.

Так как эти структуры имеют несколько запутанный вид, то не имеет

смысла создавать их вручную. В разбираемом здесь интерпретаторе Турбо

Пролога (PIE.*), сканнер и проходчик преобразуют текстовые строки в под-

ходящие структуры. В одном из дальнейших разделов мы коснемся их работы.

Такие действия по обработке кажутся трудоемкими. Конечно, но это то

самое, что традиционный Пролог делает всякий раз. В традиционном Прологе

все объекты имеют внутреннее представление в виде записи, имеющей опреде-

литель типа и аргумент или список аргументов. Хорошая скорость Турбо Про-

лога частично связана с устранением этой всеобщности, которая требуется

очень редко.