Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Собственно текст документа.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.39 Mб
Скачать

7.1.2. Декларативное представление данных и знаний

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

Спецификация типов - мощное средство конструирования новых типов данных, которые поддерживаются системой автоматически на основании базовых типов. В ЯПЗ PILOT/2 фиксированы следующие базовые типы: int, float, char, string, имя-фрейма, prototype, frame, func, proc. Без учета спецификации ограничения это дает почти те же возможности, что и спецификация typedef в языках С и C++. Однако в ЯПЗ PILOT/2 существуют и множественные типы, симметричные по отношению к базовым, а также усечение вновь вводимых типов с помощью ограничений. Последние задают в базисе И-ИЛИ-НЕ ограничения, которым должны удовлетворять значения соответствующего типа. Так, например, спецификация

Child is_a Age restr_by (>0 && <12);

вводит подтип типа Age, значения которого должны быть положительными целы­ми в интервале [0,12].

Спецификации

Persons is_a {frame};

Friends is_a Persons restr_by (>= {Петр, Иван});

определяют, что элементами типа Friends являются элементы типа Persons, вклю­чающие в себя, по крайней мере, два указанных явно элемента.

Обработка сложно структурированных данных во внешней памяти является от­личительным свойством всех ЯПЗ. Но помимо этого нужны и «обычные» пе­ременные. Вот почему в ЯПЗ PILOT/2 введены регистры и стеки. Семантика регистров такая же, как у простых переменных традиционных языков програм­мирования. Иначе обстоит дело со стеками. Для явной спецификации поведения стеков в ЯПЗ PILOT/2 введены префиксы и постфиксы, которые являются од­номестными операторами, аналогичными по синтаксису унарным операторам (++) и (--) современных языков программирования. Семантика их зафиксиро­вана в табл. 7.1. Одна и та же переменная, в зависимости от наличия или отсут­ствия префикса (постфикса), трактуется либо как регистр, либо как стек. Для выделения имен переменных в текстах PILOT-программ им предшествует сим­вол «$».

Стековые переменные

QET-переменные PUT-переменные

Слева Справа

Взять Взять без Добавить

с сохранением сохранения новое значение

< << >>

> >> <<

Заменить верхушку на новое значение

>

<

Таблица 7.1. Семантика переменных в языке PILOT/2

Ядром декларативного представления данных и знаний в ЯПЗ PILOT/2 является спецификация баз - временных и постоянных. Все базы в ЯПЗ PILOT/2 фрей­мовые и поддерживаются на этапе выполнения продукционных программ специа­лизированным пакетом FRAME/2 [Sherstnew et al., 1994].

Спецификация временной базы предполагает, что определенные здесь фреймы имеют «время жизни», совпадающее с периодом выполнения PILOT-программы, а ее имя - встроено в систему и не может быть изменено. Типичный пример определения временной базы - следующий:

base = { спецификация-фрейма, ..., спецификация-фрейма };

Иначе обстоит дело с постоянными базами. Их «время жизни» никак не связано с конкретной PILOT-программой, а имена выбирает сам пользователь. Такие базы могут создаваться и/или использоваться в данной PILOT-программе. Примера­ми определения постоянных баз могут быть следующие спецификации:

base system = { фрейм-1, ..., фрейм-N };

extern base person = { фрейм-1, фрейм-2, фрейм-3 };

base new;

base ( a1, a2, ... aN ) = { фрейм-1, фрейм-2, ..., фрейм-L };

И в случае временных, и в случае постоянных баз основным элементом определе­ния является спецификация фрейма:

спецификация-фрейма ::= || спецификация-прототипа ||

|[спецификация-экземпляра ||

спецификация-прототипа ::= [ имя-фрейма is_a prototype

{{; спецификация-демона }} {{; декларация-слота }}]

спецификация-экземпляра ::= [

|| имя-фрейма || is_a имя-фрейма

|| ( имя-фрейма {{ , имя-фрейма }} ) ||

{{; спецификация-демона}} {{; спецификация-слота}}]

спецификация-слота : : =

|| || имя-слота || = значение ||

|| || (имя-слота {{, имя-слота}}) || ||

|| without имя-слота {{, имя-слота }} ||

|| декларация-слота ||

декларация-слота ::= || имя-слота || тип

|| ( имя-слота {{ , имя-слота }} ) ||

{{ ; дополнительная-спецификация }}

дополнительная-спецификация ::= || спецификация-демона ||

|| спецификация-умолчания ||

|| спецификация-ограничения ||

спецификация-демона ::= || if_added || имя-демона ( )

|| if_deleted ||

|| Unchanged ||

спецификация-умолчания ::= by_default значение

спецификация-ограничения ::= restr_by спецификатор

Из этих определений следует, что ЯПЗ PILOT/2 является сильно типизирован­ным языком и, следовательно, обеспечивает строгую проверку правильности использования типов на этапе трансляции. Такой подход повышает надежность проектирования продукционных программ и увеличивает их эффективность.

Теперь рассмотрим примеры спецификации фреймов. Первый из них - специ­фикация прототипа вида:

[Person is_a prototype;

Name string, if_changed ask_why ( );

Age int, restr_by >= 0;

Sex string, restr_by (= =«male» || = =«female»),

by_default «male»;

Children {frame}];

Из этого описания следует, что у фрейма Person, заданного как корневой прото­тип, имеются четыре слота с именами Name, Age, Sex и Children. Каждый слот мо­жет иметь значение определенного типа. Значениями слотов Name и Sex могут быть строки, слота Age - число, а слота Children - множество ссылок на другие фреймы. Кроме обязательной спецификации типа слот может иметь дополни­тельную спецификацию. Так, чтобы показать, что значение слота Age должно быть не меньше 0, а слот Sex может принимать только два значения, «male» или «female», использована дополнительная спецификация restr_by. Конструкция, следующая за этим ключевым словом, называется спецификатором и представ­ляет собой логическое выражение особого вида. Другая дополнительная специ­фикация, by_default, определяет значение слота по умолчанию. Например, если в экземпляре фрейма Person не будет указано конкретное значение слота Sex, оно будет равно «male».

Кроме этих дополнительных спецификаций имеются в ЯПЗ PILOT/2 и специ­фикации демонов. Они определяют присоединенные процедуры, которые «запус­каются» при добавлении (if_added), удалении (if_deleted) или изменении значе­ний (if_changed).

Любой фрейм может стать прототипом для других фреймов:

[John is_a Person; if_deleted bury ();

Name = «Johnson»;

Age = 32;

Children = {Ann, Tom}];

[Mary is_a Person;

without Age;

Name = «Smirnova»;

Sex = «female»;

Children = empty];

Приведенные выше фреймы John и Mary - экземпляры фрейма Person. Их сло­ты получают конкретные значения. Фрейм-экземпляр может не иметь некото­рых слотов своего прототипа (имена таких слотов перечисляются после ключе­вого слова without) и может иметь дополнительные слоты, специфицируемые так же, как и в прототипе.