Страница 98
Образцы являются наиболее важной и мощной конструкцией языка PILOT/2, так как они позволяют находить и фиксировать интересующую инженера по знаниям ситуацию в базе знаний. По синтаксису образец похож на слот-фрейма, но у него существенно большие возможности и другая семантика. Образец — это предикат на базе знаний, принимающий значения «истина» или «ложь», тогда как слот-фрейма возвращает значение конкретного слота конкретного фрейма. Образец определяет некий шаблон, которому могут удовлетворять фреймы из базы знаний. Образец состоит из синтаксического обрамления «?[...]» и тела. Тело представляет собой шаблон фрейма, которому, быть может, предшествует конструкция «захвата» результатов отождествления в переменную, и список слотов-образцов, который может быть пустым. Каждый слот-образец также имеет шаблон слота в качестве базы отождествления и, быть может, конструкцию «захвата» результатов. Таким образом, тело определяет структуру, которую должны иметь фреймы базы знаний, чтобы успешно сопоставиться с образцом. Шаблон фрейма определяет множество фреймов базы, на которых будет происходить отождествление. Это множество может состоять из единственного фрейма (при этом указывается имя фрейма или его отрицание); всей базы (тогда шаблоном фрейма является символ «*»); фрейма (фреймов), имена которых хранятся в переменных типа VAR или GET, а также фиксироваться с помощью конструкции явного задания множества, образованного из элементов и стандартных теоретико-множественных операций one_of (пересечение); all_of (объединение); ~ (вычитание). Пустой префикс соответствует операции one_of. При этом семантика операции one_of — «первый из сопоставленных». Операция «вычитание» может использоваться только с именами фреймов, заданными явно. Результаты успешных сопоставлений могут запоминаться в переменных с помощью операции присваивания (в случае префикса one_of или его отсутствия запоминается результат первого успешного сопоставления, а в случае префикса all_of — результаты всех успешных сопоставлений). Шаблон слота практически тот же, что и шаблон фрейма. Однако для слотов есть еще один способ указания объединения — перечисление нужных слотов через разделитель «;». Отличие шаблона слота от шаблона фрейма в том, что здесь добавляется значение-образец. Как и в предыдущих случаях, найденные значения могут «захватываться» в переменные. Шаблон значения может фиксировать, что оно произвольно, но существует (в этом случае используется символ «*», либо определить возможные значения более точно с помощью элементов (значение-первичного-спецификатора) и логических операций в базисе И-ИЛИ. Заметим, что отрицание здесь не требуется, так как его функцию берет на себя отношение «!=« в первичном-спецификатора. Спецификаторы задают декларативно ограничения на значения. Синтаксис спецификаторов следующий:
спецификатор ::= терм-спецификатора {{ || терм-спецификатора ||
терм-спецификатора ::= первичное-спецификатора
{{ && первичное-спецификатора }}
первичное-спецификатора::=
|| || < || значение-первичн-спецификатора ||
II II <= II ||
II II == II II
II II != || II
II II >= I| II
II II > II ||
|| ( спецификатор ) I|
значение-первичн-спецификатора ::=
|| значение ||
|| ||пусто || || VAR-переменная || ||
|| || one_fгоm || || GET-переменная || ||
II II all_from || ||
Знаки отношений имеют стандартную семантику для чисел и семантику сравнения ASCI-кодов для символов и строк. В тех случаях, когда значение в первич-ном-спецификатора является множеством, все знаки отношений имеют следующую интерпретацию:
• < — строгое включение множества значений спецификатора во Множество значений слота;
• <= — нестрогое включение множества значений спецификатора во множество значений слота;
• = = — совпадение множества значений спецификатора с множеством значений слота;
• != — несовпадение множества значений спецификатора с множеством значений слота;
• >= — нестрогое покрытие множества значений спецификатора множеством значений слота;
• > — строгое покрытие множества значений спецификатора множеством значений слота.
Дополнительно к этому значение-первичного-спецификатора может быть VAR-или GET-переменной, которым предшествует префикс one_from (один из элементов в переменной должен быть использован); all_from (все элементы переменной должны быть использованы). Пустой префикс соответствует операции one_from.
Возможности образцов лучше рассмотреть на примерах. Пусть в текущей базе имеются следующие фреймы, причем порядок их расположения в базе такой, как описано ниже:
[ F1 is_a prototype; [ F2 is_a F1; [ F3 is_a F1;
S1 Int, by_default 8 ; S2 = "x" ]; S1=0];
82 char];
Имеются также переменные $V1 (типа frame) и $V2 (типа char), которые до применения каждого из образцов содержат следующие значения:
$V1 = ╎F1 ╎F2 ╎F3 $V2 = ╎'a' ╎'b' ╎
Примеры образцов с их значениями и значениями переменных $V1 и $V2 после применения этих образцов к описанной базе представлены ниже.
Обсуждение Базы знаний интеллектуальных систем
Комментарии, рецензии и отзывы