КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Декларативное представление данных и знаний
Декларативная часть 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-программ им предшествует символ «$».
Таблица 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) и может иметь дополнительные слоты, специфицируемые так же, как и в прототипе.
Дата добавления: 2015-07-02; Просмотров: 468; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |