Имя материала: Базы знаний интеллектуальных систем

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

 

[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 в секционных и прави-ловых разрешениях и левые части продукционных правил. И в том и в другом случае инженер по знаниям может сформулировать произвольную условную конструкцию в базисе И-ИЛИ-НЕ с общепризнанным старшинством логических операций. Кроме того, на уровне первичных условий возможно использование отношений и образцов.

Страница: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 |