Страница 97
Теперь рассмотрим примеры спецификации фреймов. Первый из них — спецификация прототипа вида:
[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) и может иметь дополнительные слоты, специфицируемые так же, как и в прототипе.
7.1.3. Процедурные средства языка
При обсуждении примеров спецификаций фреймов мы пользовались интуитивным пониманием значения. Спецификация этого понятия в ЯПЗ PILOT/2 следующая. Значения могут быть простыми (единичными) и множественными. Множественные значения — списки простых значений одного типа, заключенные в фигурные скобки. В качестве простых значений в PILOT/2 выступают выражения.
Введение префиксов и постфиксов к именам переменных является первым шагом на пути определения выражений. Но в ЯПЗ PILOT/2 есть и более мощные средства этого типа. Здесь используются традиционный набор арифметических операций и общепринятое их старшинство, а специфика ЯПЗ на уровне первичного выражения:
перв-арифм ::= | | число | |
| | GET-переменная | |
| | VAR-переменная | |
| | перв-арифм | |
| | вызов-функции | |
| | ( арифметическое ) | |
| | слот-фрейма | |
вызов-функции ::= имя-функции ( значение {{, значение }} )
Первые шесть вариантов вполне традиционны, а последний имеет следующее определение:
слот-фрейма ::= [ имя-фрейма : имя-слота ]
Учитывая вышесказанное, следующие примеры суть правильно построенные выражения ЯПЗ PILOT/2:
empty пустое выражение
"а" ASCII-символ char
«qwerty» строка string
Person имя-фрейма frame
$NameFrame VAR-переменная frame
$AgeValue> GET-переменная int
10 * ( $var1 + 2 ** 4 ) арифметическое int
[John : Age] слот-фрейма int
my_func («events.kb», [Event : Value]) вызов-функции bool
Теперь вернемся к основному средству построения конфликтного множества — к условиям. Напомним, что в ЯПЗ PILOT/2 две точки, где, согласно синтаксису языка, возможно использование условий: конструкция if в секционных и прави-ловых разрешениях и левые части продукционных правил. И в том и в другом случае инженер по знаниям может сформулировать произвольную условную конструкцию в базисе И-ИЛИ-НЕ с общепризнанным старшинством логических операций. Кроме того, на уровне первичных условий возможно использование отношений и образцов.
Обсуждение Базы знаний интеллектуальных систем
Комментарии, рецензии и отзывы