Главная Страница > Публикации

                  "ДЕКЛАР"

      система  обработки  декларативных структур      

           знаний - язык продукций ДЕКЛ

 

            Кузнецов Игорь Петрович, Шарнин Михаил Михайлович,

                                                 Пузанов Владимир Васильевич                                   

                            листов 81

 

                              1988 г.      

 

 

                            - 2 -

 

 

                         Аннотация

 

 

       В данном документе приведено описание языка продукций

  (ДЕКЛ), являющегося языком логического программирования  и

  входящего в систему "ДЕКЛАР". Описание сопровождается  при-

  мерами.

       В данном документе  представлены  сведения  по  версии

  языка ДЕКЛ, реализованной авторами следующих  теоретичес-

  ких рабоТ: Золотов Е.В., Кузнецов И.П. Расширяющиеся систе-

  мы активного диалога, М.:Наука, 1982; Кузнецов И.П.  Семан-

  тические представления, М.:Наука, 1986; Кузнецов И.П., Шар-

  нин м.м., Пузанов В.В.  Система  обработки    декларативных

  структур знаний "ДЕКЛАР-2" препринт      m:  ИПИАН АН СССР,

  ИО АН СССР, МИРЭА, 1989.

 

                              - 3 -

 

 

 

 

                          Содержание

 

 

 

      Аннотация                                             2

 

  1.  Общие сведения                                        4

 

  2.  Элементы и основные конструкции языка                 7

 

  2.1.    Формы записи продукций                            7

  2.2.    Принципы применения продукций                    10

  2.3.    Процесс      применения      продукций,

          последовательность действий                      15

  2.4.    Операторы  в  левой  и  правой   частях

          продукций                                        17

  2.5.    Управление применением продукций                 22

 

  3.   Встроенные предикаты, спецфрагменты                 25

 

  3.1.    Арифметические операции                          26

  3.2.    Операции над именами                             28

  3.3.    Пересылка информации из ОП  на  диск  и

          выдача на экран                                  32

  3.4.    Ввод в ОП знаний и их компоновка                 35

  3.5.    Удаление информации, очистка зон                 38

  3.6.    Операции с дисковой памятью                      40

  3.7.    Посимвольная   обработка    литеральных

          конструкций                                      42

  3.8.    Управление режимом работы                        45

 

  4.  Правила составления программ на языке ДЕКЛ           48

 

  5.  Решение прикладных задач                             52

 

  5.1.    Поиск транзитивного замыкания на графе           52

  5.2.    Вывод на "И-ИЛИ" графе                           56

  5.3.    Реализация компоненты объяснений                 58

 

 

          Приложение 1.                                    61

          Приложение 2.                                    68

          Приложение 3.                                    71

          Приложение 4.                                    72

          Приложение 5.                                    75

 

 

                              - 4 -

                                 

 

    

                     1. Общие сведения

 

 

 

         Язык ДЕКЛ является неотъемлемой частью системы  обработки

    декларативных структур знаний "ДЕКЛАР".

         Это  один из языков логического программирования высокого

    уровня, посредством  которого  в  существующей  версии  ДЕКЛАР

    вводятся знания.

         Язык  ДЕКЛ  служит  для  ввода продукций, необходимых для

    решения пользовательских задач, а также  реализации  системных

    функций.  Язык ДЕКЛ предназначен для системных программистов и

    инженеров знаний. Программы, написанные  на  языке  ДЕКЛ,  при

    считывании  с  диска  в  ОП автоматически транслируются на РСС

    (язык расширенных семантических сетей), где осуществляется  их

    выполнение  программным ядром. Описание языка РСС представлено

    в (Приложении 5.).

    

         Продукции  записываются  в  форме, приближенной к нотации

    языка ПРОЛОГ, однако формы его несколько  отличаются  от  форм

    последнего.  В  ДЕКЛ  условная часть записывается первой, т.е.

    слева, а следствие -  справа    языке  ПРОЛОГ  -  наоборот).

    Соответственно,  выбрана  другая  процедура применения правил.

    Такое  применение  управляется  индикаторами  и   сводится   к

    проверке  условия с порождением следствий. С помощью продукций

    реализуется как прямой, так и обратный вывод. При этом удалось

    устранить многие ограничения, характерные для языка ПРОЛОГ.

        

         Во-первых, формы языка ДЕКЛ не ограничиваются  правилами,

    у  которых  в  части, соответствующей следствию, - только один

    предикат. В продукциях таких предикатов может быть множество.

 

         Во-вторых,  правила  (продукции)  могут   применяться   к

    правилам,   что   весьма  необходимо,  например,  когда  нужно

    анализировать правила, менять их.

 

         В-третьих,  процедура  вычисления  не  носит   "жесткого"

    характера,   как   в   языке   ПРОЛОГ.Правила  при  применении

    осматривают  все  знания,  находящиеся  в  ОП,  а  не   только

    предикаты  запроса.  Можно  легко  управлять такой процедурой,

    заставляя правила осматривать только нужную часть знаний.

 

         За  счет  продукций  языка  ДЕКЛ   удается   поддерживать

    достаточно  удобные  для  пользователей  языки  и для этого не

    требуется  программирования  работы  над  списками.  Поддержка

    языков  сводится  к обработке структур РСС, что осуществляется

    на  металогическом  уровне   только   с   помощью   продукций.

    Специальных  средств работы со списками не требуется. Отсюда -

    проще программное ядро.

 

 

                              - 5 -

 

       В связи со сказанным, язык ДЕКЛ представляется более

  удобным для представления  знаний,  и  соответственно,  для

  разработки экспертных и других систем, пустых оболочек  для

  них. Сами знания  ("программы"  на  продукциях)  получаются

  более простыми и естественными  по  своей  структуре.  Хотя

  формы языка ДЕКЛ пока еще далеки от  конструкций  естест-

  венного языка. Такие формы больше  приближены к логическим.

 

       Язык ДЕКЛ это средство  выражения  правил  обработки

  фрагментов, входящих в состав семантических сетей. Эти пра-

  вила называются продукциями. Продукции - это выражения типа

  "если ... то ...." ("ESLI...TO...").

 

  Каждая продукция содержит левую часть (или условие) и  пра-

  вую часть (или следствие). Левая и правая части  составлены

  из множества фрагментов.

 

                            Пример

 

  ESLI KK* отец(X1,X2) (отец(X2,X3) TO дед(X1,X3);

 

 

       Это пример записи продукций на языке ДЕКЛ. Для отде-

  ления левой части от правой используются слова "ESLI" "TO".

  (допускается      применение      английских       аналогов

  "IF...THEN...").

 

       Данная продукция означает, что если X1 (некто) являет-

  ся отцом для X2, а X2 - отцом для X3, то X1 - это  дед  X3.

  Компонента "KK*" играет служебную роль. Подобные компоненты

  (они будут называться индикаторами) необходимы для управле-

  ния применением продукций. За счет них может быть обеспече-

  но значительное ускорение процесса применения  продукций  -

  вычислений.

 

       Любая продукция может быть записана на РСС, тогда  для

  отделения левой части от правой используются фрагменты спе-

  циального вида (называемые сборками). Продукция записывает-

  ся как множество фрагментов, порядок  которых  зачастую  не

  играет какой-либо роли. Такая запись позволяет  осуществить

  металогическую обработку без перехода на списочный уровень.

        

       Продукции играют основную  роль  при  реализации  всех

  видов обработки. Программное ядро  обеспечивает  применение

  продукций, записанных на РСС, к другим РСС, т.е. к  фактам,

  декларативным структурам и другим продукциям.

       Итак, вся обработка,  которая  сводится  к  применению

  продукций, осуществляется на уровне РСС.

       За счет специальных средств  (индикаторов,  операторов

  вызова) одни продукции могут активизировать  другие.  Прог-

  раммным ядром делаются последовательные попытки  применения

  только  активизированных  продукций.  При  этом  применение

  отдельной продукции к некоторой  РСС  сводится  к  проверке

  условия (т.е. наличия в этой  РСС  фрагментов,  аналогичных

  фрагментам  левой  части  продукции)  и   следствия   (т.е.

  отсутствия в этой РСС фрагментов, "аналогичных"  фрагментам

  правой части продукции). Если проверка удовлетворяется,  то


 

                              - 6 -

        

  продукция   считается   применимой.    Тогда    выполняются

  действия,записанные в ее правой части. В простейшем  случае

  к РСС просто добавляется такая  часть,  т.е.  следствие.  В

  сложных случаях такое применение может приводить к  активи-

  зации других продукций, к обращению к специальным  програм-

  мам (через "встроенные" фрагменты или предикаты) и т.д.

       Система ДЕКЛАР последовательно пробует  применить  все

  продукции, которые находятся в оперативной  памяти  (ОП)  и

  которые активизированы. Продукции применяются к фрагментам,

  также находящимся в ОП. Итак, для обеспечения работы систе-

  мы соотвествующие разделы знаний должны быть считаны в ОП.

 

       Система ДЕКЛАР имеет необходимые средства для  гибкого

  управления применением продукций. Для этого в  левую  часть

  каждой продукции вводится  специальный  индикатор,  который

  активизируется другими продукциями. Применяются только про-

  дукции с активизированны ми индикаторами. За счет  индикато-

  ров обеспечивается деление продукций на модули  с  выполне-

  нием в каждый момент времени действий одного модуля.  Поря-

  док включения модулей задается с помощью продукций, активи-

  зирующих индикаторы других продукций. Таким образом  реали-

  зуется идея двойной черной доски (BLACK-BOARD).

 

       Порядок применения продукций  определяется  последова-

  тельностью их активизации, которая задается с помощью самих

  же продукций,  и  порядком  расположения.

       Активизированные продукции (с одним и тем же индикато-

  ром) пробуют применяться в порядке их записи, т.е. вначале

  первая, затем - вторая и т.д.

       Работа заканчивается,  когда  исчерпаны  все  варианты

  применения всех имеющихся в ОП продукций,  т.е.  в  ОП  нет

  применимых продукций. Работа возобновляется при поступлении

  новой информации на РСС:

 

         - при считывании очередного раздела знаний с диска в

           ОП,

 

         - при вводе в ОП соответствующей информаци и  с  кла-

           виатуры терминала.

 

       Ранее был приведен  один  пример  продукции  на  языке

  ДЕКЛ. Рассмотрим другой пример.

 

 

                            Пример

 

 

  ESLI INFIL D:FILZN(X) N:BEG(X) TO B:Б(X) .

 

       В данной продукции используются  операторы  "D"  (уда-

  лить) "N" (нет) и  "B"  (выполнить),  которые  стоят  перед

  фрагментами.

       Продукция будет применимой, когда в  знаниях,  находя-

  щихся в ОП, есть фрагмент или предикат  вида  FILZN(...)  и

  нет BEG(...). Тогда из этих знаний удаляется - FILZN(...) и

  выполняется процедура программы,  связанная  со  встроенным


 

                              - 7 -

        

  фрагментом или предикатом Б(...). Через встроенные фрагмен-

  ты обеспечивается обращение к программам ввода,  вывода,  и

  т.д. Таким образом осуществляется ввод в ОП новой  информа-

  ции, вывод результатов логической обработки и др.

 

 

 

 

      2. Элементы и основные конструкции языка

 

       2.1. Формы записи продукций

 

 

 

       В языке ДЕКЛ продукции записываются в следующей фор-

  ме:

 

   <имя продукции>:если(IF) <левая часть> то(THEN) <правая>;

 

  где "IF" и "THEN" - для ЭВМ типа IBM PC.

 

       В качестве  имени продукции  используется  какая-либо

  константа, не входящая ранее в  имеющиеся  знания  на  РСС.

  Слова "если" и "то" ограничивают левую и  правую  части,  а

  точка с запятой указывает на конец продукции.

 

       Допускаются модификации данной  формы.  Имя  продукции

  можно не писать (тогда в качестве имени будет взят  очеред-

  ной внутрисистемный код), а вместо слов  "если...то"  могут

  быть использованы "IF...THEN" или их  написание  латинскими

  буквами "ESLI ... TO".

 

       Левая часть продукции состоит из индикатора, за  кото-

  рым следует набор фрагментов. Индикаторы служат для  управ-

  ления работой продукций, определяют порядок их  применения.

  Фрагменты записываются на языке РСС и разделяются  пробела-

  ми. Перед фрагментами могут  стоять  специальные  префиксы,

  которые будем называть  операторами.  Они  определяют  роль

  фрагментов в процессе применения продукции, то  есть  соот-

  ветствующие действия. В случае,  когда  операторы  отсутст-

  вуют, левая часть продукции есть индикатор, за которым сле-

  дует сеть на РСС.

 

       В левой части продукции допускаются следующие операто-

  ры:

 

         - N - нет;

 

         - D - удалить;

 

         - B - выполнить.

 

       Оператор ставится перед  фрагментом  и  отделяется  от


 

                              - 8 -

        

  него двоеточием. Например, если "R(...)" - некоторый  фраг-

  мент,   записанный  на  РСС,  то "N:R(...)", "D:R(...)"    и

  "B:R(...)"   есть   фрагменты   с   операторами.   Операторы

  записываются  латинскими  буквами.Правая   часть   продукции

  составляется  из  набора  фрагментов,  перед  которыми могут

  стоять лишь операторы:

 

        - В: - выполнить   и

 

        - Т: (Т1, или Т!:) - активизировать.

 

       Фрагмент, который  стоит  после  оператора  В:,  будет

  называться встроенным (по аналогии с  понятием  "встроенный

  предикат" языка ПРОЛОГ). Такой фрагмент определяет  обраще-

  ние к соответствующей программе или процедуре.

 

       Фрагмент, который стоит за оператором Т:(или Т1:,  или

  T!), будет называться индикатором. Если у фрагмента имеются

  какие-либо аргументные места, то будем говорить, что  инди-

  катор имеет параметры. В противном  случае  фрагмент  будет

  записываться как отдельная константа,  которая  тоже  будет

  называться индикатором. Примером такого индикатора является

  "T:UR1", где "UR1" есть некоторая константа. С помощью опе-

  раторов "T:" осуществляется управление применением  продук-

  ций - активизирование индикаторов и, соответственно,  самих

  продукций. Каждая такая активизация приводит к понятию при-

  менения продукции. При этом:

 

         - Т!: - это  оператор  последовательной  активизации

           (каждая продукция с указанным индикатором  активи-

           зируется лишь по одному разу);

 

         - Т1: - оператор однократного применения (также осу-

           ществляется последовательная  активизация,  но  до

           первой применяемой продукции);

 

         - Т: - оператор циклического  применения  (продукции

           активизируются, пока среди них есть применимые).

 

                           Пример 1

 

   SS1:если UR1 R1(X1) N:R2(X1) D:R3(X1,A1)

       то   R4(X1)  B:а(X1)  T:UR2(X1);

 

       Продукция имеет имя SS1. В левой  части  она  содержит

  индикатор UR1, фрагмент R1(X1), а также фрагменты R2(X1)  и

  R3(X1,A1) с операторами N: и D:.  В  правой  части  имеется

  фрагмент R4(X1), фрагмент A(X1) с оператором "B:" и индика-

  тор UR2(X1) с оператором "T:".

 

       Продукция означает, что если X1 имеет свойство R1,  не

  имеет свойства R2 и связано отношением R3 с  A1,  то  нужно

  удалить (D:) из  ОП  соответствующий  экземпляр  последнего

  отношения, добавить к X1 свойтство R4, выполнить  (B:)  над

  X1 процедуру "A" и  активизировать  (T:)  индикатор  UR2  с

  параметром X1. Такие действия выполняются в процессе приме-


 

                              - 9 -

        

  нения продукции и связаны с поиском  в  ОП  соответствующих

  фрагментов. Причем действия  становятся возможными,  когда

  активизирован индикатор UR1.

       Следует отметить, что оператор "B:" может стоять толь-

  ко перед так называемыми встроенными фрагментами, связанны-

  ми со своими процедурами.

 

 

                           Пример 2

 

 

   SS2:если UR2 B:I(X1) N:_(_/X1) то  MT(X1) T:UR3;

 

 

       Эта продукция вызывает специальные  действия,  которые

  будут описаны далее. Сейчас  нас  интересует  форма  записи

  продукций.

       Язык ДЕКЛ допускает  достаточно  произвольное  коли-

  чество фрагментов как в левой,  так  и  в  правой  части  -

  столько, сколько позволяет об'ем ОП, отведенный под знания.

       В языке ДЕКЛ множество фрагментов левой части  может

  быть сгруппировано в структурную сеть, перед которой  может

  стоять оператор N:. Для этого используются квадратные скоб-

  ки. Подобная группировка позволяет  задавать  сложные  виды

  отношения.

 

 

           Пример 3

 

 

   UL2:если US1 TRUE(X1) DAND(X1,X2) N:[DAND(X3,X2)

                N:TRUE(X3)]      то        TRUE(X2);

 

       Здесь имеет место двойное отрицание.  Первый  оператор

  N: распространяется на два фрагмента, стоящие в  квадратных

  скобках, а второй - на фрагмент TRUE(X3).

 

       Продукция  дословно  означает:  "если  у  X1   имеется

  свойство TRUE, X1 связан отношением DAND с X2  и  если  нет

  такого, что X2 связан отношением DAND с какой либо  X3,  не

  обладающей свойством TRUE, то это значит, что  X2  обладает

  свойством TRUE" (и это  свойство  к  X2  добавляется).  Как

  будет показано ниже, данной продукцией реализуется  переход

  по дугам "и" в "и-или" графе.

 

       В языке ДЕКЛ допускаются так называемые  "вложенные"

  структуры, т.е.  когда  одни  квадратные  скобки  находятся

  внутри других и т.д.

 

       В левой части на  языке  РСС  может  быть  записана  и

  отдельная продукция. Сказанное относится и к правой  части.

  Словом, в левых и правых частях продукций могут  находиться

  другие продукции. Это необходимо для работы на металогичес-

  ком уровне, где часто требуется производить анализ содержи-

  мого знаний, включающих в себя продукции, осуществлять фор-

  мирование новых продукций и др.


 

                              - 10 -

 

       Отметим, что в правой  части  продукции  может  стоять

  множество индикаторов с оператором T:. Более  того,  правая

  часть может состоять только из индикаторов с такими  опера-

  торами. Тогда будет иметь место так называемая  управляющая

  продукция. Она сама ничего не изменяет в знаниях, но после-

  довательно активизирует другие продукции,  вызывая  попытки

  их применения.

       Итак, после операторов  Т:,Т1:,Т!:  могут  стоять  как

  константы, так и отдельные фрагменты.  В  последнем  случае

  активизация продукций будет сопровождаться передачей  пара-

  метров. Например, оператор  Т:VS*(X)  будет  активизировать

  продукции с индикатором VS*(...),  осуществляя  передачу  в

  них параметра X, т.е. передачу  результата  означивания  X,

  см. ниже.

       В правой части продукции после операторов Т:,Т1: и Т!:

  могут стоять переменные, встречающиеся в левой части,  нап-

  ример, Т:X. В случае применимости продукции  активизирован-

  ным индикатором  будет  константа,  которой  была  означена

  переменная X.

 

       Формально, левая и правая части продукции  описываются

  следующим образом:

 

  <индикатор>   ->  <константа>\<фрагмент>.

 

  <л-фрагмент>  ->  B:<фрагмент>\D:<фрагмент>\

                    N:<фрагмент>\<фрагмент>\[<л-фрагмент>].

 

  <левая  часть>->  <индикатор>\ <индикатор> <л-фрагмент>\

                    <индикатор> <л-фрагмент>...<л-фрагмент>.

 

  <п-фрагмент>  ->  T:<индикатор>\Т:<переменная>\Т1:<индика-

                    тор>\ Т1:<переменная>\ T!:<индикатор>\

                    T!:<переменная>\В:<фрагмент>\<фрагмент>.

 

  <правая часть>->  <п-фрагмент>\ <п-фрагмент>...<п-фраг-

 

                мент>.

 

       Здесь, как и ранее, символ  \  означает "или".

 

 

 

       2.2. Принципы применения продукций

 

 

 

       В данном разделе будут описываться принципы применения

  продукций, у которых  отсутствуют  операторы.  Левая  часть

  такой продукции - есть индикатор, за которым следует  сеть,

  а правая часть - есть просто сеть. Обе сети записываются на

  РСС.

 

       Сначала приведем несколько простейших примеров  приме-

  нения продукций. Затем такое применение будет описано более


 

                              - 11 -

  точно.

 

                          Пример 4

 

   SS1:если UR1 дед(X1,X2) то отец(X1,X3) отец(X3,X2) ;

 

 

       С помощью этой продукции представлено: если X1 являет-

  ся дедом X2, то это значит, что X1 является отцом для X3, а

  X3 - отцом для X2.

 

       Продукция начинает применяться, только когда активизи-

  рован индикатор UR1 (это осуществляется другой  продукцией,

  содержащей в правой части "T:UR1" (или Т1:UR1, или Т!:UR1).

  Будем называть  подобную  продукцию активизированной.  При

  этом в сети (РСС), находящейся в ОП, ищется  фрагмент  вида

  дед(AI,AJ), где, в частности, AI и AJ могут быть некоторыми

  константами. Если такой  фрагмент  имеется,  то  применение

  продукции продолжается (иначе - заканчивается  и  продукция

  считается неприменимой). Ее переменные X1 и X2 означиваются

  этими константами - AI и AJ, которые переносятся  в  правую

  часть и замещают X1 и X2.  В  результате  формируется  сеть

  отец(AI,X3) отец(X3,AJ). Далее  проверяется  наличие  соот-

  ветствующей сети в ОП. Если ее там нет, то продукция об'яв-

  ляется применимой. Тогда на место X3 ставится внутрисистем-

  ный код N+, где N - некоторое  число,  а  полученные  таким

  образом фрагменты отец (АI,N+)  отец(N-,АJ)  добавляются  в

  ОП.

       Если проверка не удовлетворяется, т.е. в ОП есть сеть,

  соответствующая правой части продукции, то  продукция  счи-

  тается неприменимой и никакого добавления не  производится.

  Например, такой случай будет иметь место, если  в  ОП  были

  фрагменты отец(АI,А1) отец(А1,АJ).

       Пусть в ОП вообще нет фрагментов вида отец(...).  Тог-

  да, если продукция рассматриваемого примера была  активизи-

  рована оператором T:UR1 или T!:UR1, то она будет применимой

  столько раз, сколько различных фрагментов  вида  дед(AI,AJ)

  имеется в ОП. И каждый раз к ОП  будет  добавляться  правая

  часть, как это было рассмотрено выше.

      Если  же  продукция  была  активизирована   оператором

  Т1:UR1, то она применится лишь один раз вне зависимости  от

  наличия тех или иных фрагментов в ОП.

 

       Продукция будет применимой и в том случае, когда в  ОП

  есть  фрагменты  вида  дед(XI,AJ)   или   дед(AI,XJ),   или

  дед(XI,XJ), то есть на местах констант могут  стоять  пере-

  менные. Переменные могут означиваться переменными. Действия

  применения останутся теми же. Например, в  случае  примени-

  мости продукции к сети с фрагментом дед(XI,AJ) к ней  будет

  добавлено отец(XI,S1) отец(S1,AJ). При этом X1 означивается

  XJ.

       Продукция будет применимой и в том случае, если  в  ОП

  имеются фрагменты вида дед(_,AJ), то есть на  местах  пере-

  менных могут стоять символы "_" (нижние  черточки).  Допус-

  кается означивание переменных этими символами с выполнением

  соответствующих замещений. Например, при успешном  примене-

  нии обсуждаемой продукции к сети с фрагментом дед(_,_) в ОП


 

                              - 12 -

        

  будет добавлено отец(_,??1) отец(??1,_). Здесь два  символа

  "_" могут соответствовать совершенно различным объектам.

 

                           Пример 5

 

            если UR1 _(_/X1) то MT(X1) ;

        

       У данной продукции нет имени (что допустимо). Эта про-

  дукция носит чисто служебный характер. Ее активизация  пос-

  редством активизации UR1 приведет к поиску в ОП  каких-либо

  одноместных фрагментов.при этом не важно, какие у них имена

  отношений и какие аргументы. Символ "_" в левой части  про-

  дукции означает, что на этих местах в упомянутых  одномест-

  ных фрагментах может стоять что угодно: константы, перемен-

  ные или такие же символы. При этом в упомянутых  фрагментах

  на местах двух различных символов "_" могут стоять  различ-

  ные константы или переменные.

       Если хотя бы один подобный фрагмент имеется в ОП и его

  имя не является аргументом мт(...), то продукция  сделается

  применимой. При этом X1 будет означена именем данного фраг-

  мента. За счет правой части на  основе  этого  имени  будет

  сформирован новый фрагмент. Например,  если  в  ОП  имеется

  фрагмент RR1(A1/DD1), то X1 будет означено DD1. В результа-

  те будет сформировано MT(DD1). Если же  последний  фрагмент

  уже был в ОП, то продукция в этом  варианте  применимой  не

  будет.

 

       Опишем вначале с помощью абстрактных понятий  действия

  применения продукций. Для этого введем необходимые понятия.

  Будем говорить, что одна сеть совпадает с точностью до имен

  фрагментов со второй, если первая может  быть  получена  из

  второй выполнением следующих действий:

 

         - удалением имен фрагментов;

 

         - введением имен фрагментов с  использованием  конс-

           тант в качестве таких имен;

 

         - заменой имен фрагментов (если  они  константы)  на

           переменные.

 

       Приведем примеры сетей,  совпадающих  с  точностью  до

  имен фрагментов.

 

 

                        Таблица 1

   ---------------------------------------------------------

   :    сеть 1      :    сеть 2    :     комментарии

   :--------------------------------------------------------:

   :1 R1(A1,A2/люди): R1(A1,A2)    : удаление имени         :

   :2 R1(A1,X1)     : R1(A1,X1/DD) : введение имени (конст.):

   :3 R1(A1,X1)     : R1(A1,X1/X8) : введение имени (перем.):

   :4 R2(X1/X3)     : R2(X1/функц) : замена имени           :

   :5 R1(A1,X1)     : R1(A1,X1/DD) : комплексные            :

    R2(X1/X3)       : R2(X1)       : действия               :

   ----------------------------------------------------------

        


 

                              - 13 -

 

 

       В пятой строчке сеть 1 может быть получена из  сети  2

  путем введения во фрагмент R2(X1) имени Х3  и  удаления  из

  первого фрагмента имени DD.

 

       Введем понятие соотвествия сетей. Будем говорить,  что

  одна сеть соответствует другой, если:

 

       во-первых, они совпадают с точностью до имен  фрагмен-

       тов;

 

       во-вторых, первая сеть может быть получена  из  второй

       путем следующих замен:

 

         - переменных на константы,  переменные  или  символы

           "_" (одна и та же переменная  заменяется  на  что-

           нибудь одно);

 

         - символа "_" на любую константу или переменную, при

           этом символы "_",  стоящие  на  различных  местах,

           могут заменяться на различные константы или  пере-

           менные.

 

       Описанные замены  эквивалентны  означиванию,  а  соот-

  ветствие - есть частный случай унификации.

       При установлении соответствия  учитывается  тот  факт,

  что фрагмент, записанный в виде R(...) преобразуется систе-

  мой в R(.../N+), где N -  некоторое  число.  Сформированное

  системой имя фрагмента также может участвовать в  означива-

  нии.

      Рассмотрим примеры соответствия отдельных фрагментов.

 

                                            Таблица 2

         ------------------------------------------------

      :фрагмент в    : соответствующий : результат   :

      :левой части   : фрагмент в ОП   : означивания :

      :продукции.    :                 :             :

      :-----------------------------------------------

      : R1(A1)       : R1(A1)          :             :

      : R(X1,X2)     : R(A1,A2)        :  X1 -> A1   :

      :              :                 :  X2 -> A2   :

      : R(_,X)       : R(A1,A2)        :  X  -> A2   :

      : R(X,_)       : R(X1,A2)        :  X  -> X1   :

      : _(A1,_)      : R(A1,A2)        :             :

      : R(A1,X)      : R(_,_)          :  X  ->  _   :

      : R(A1,X1,/X2) : R(A1,A2)        :  X1 -> A2   :

      :              :                 :  X2 -> K+   :

      : R(X1,X2)     : R(A1,A2/D)      :  X1 -> A1   :

      :              :                 :  X2 -> A2   :

      : R(X1,A2/X2)  : R(A1,A2/KK)     :  X1 -> A1   :

      :              :                 :  X2 -> KK   :

      ------------------------------------------------

 

       Здесь  через  "К+"  обозначено  имя  фрагмента  из  ОП


 

                              - 14 -

        

  "R(A1,A2)".  Поскольку  данный  фрагмент  своего  имени  не

  имеет, то система производит означивание переменной X2 оче-

  редным внутрисистемным кодом, например, "14+".

 

       Перейдем к описанию  на  абстрактном  уровне  действий

  применения отдельных продукций.

 

       Случай 1. В левой части продукции имеется только  один

  фрагмент. Применение  такой  продукции  сводится  к  поиску

  соответствующего фрагмента в ОП, согласно таблице  2.  Если

  такой фрагмент найден, то применение продукции  продолжает-

  ся, иначе - заканчивается и продукция считается  непримени-

  мой.  Результаты  означивания  запоминаются  в  специальном

  "стеке означиваний".

        

       Далее, на основе правой части продукции система форми-

  рует новые фрагменты. Для этого  переменные  из  фрагментов

  правой части заменяются на результат их  означивания  (т.е.

  на соответствующие константы, взятые из с тека означиваний).

  Если какой-либо переменной нет в стеке, то это значит,  что

  она входитодит только в правую часть продукции. В этом слу-

  чае переменная заменяется на внутрисистемный код. Указанным

  способом  формируются  новые  фрагменты.  Их   формирование

  производится во внутрисистемном буфере. При этом сама  про-

  дукция не меняется.

 

       После этого в ОП  проверяется  наличие  сформированных

  фрагментов. Если их там нет (или  одни  фрагменты  есть,  а

  других нет), то продукция считается  применимой.  При  этом

  все сформированные  фрагменты  из  внутрисистемного  буфера

  копируются (добавляются) в ОП. Если же  они  там  есть,  то

  продукция об'является неприменимой. В ОП ничего не меняется

  (не копируется).

 

       Случай 2. В левой части  продукции  имеется  множество

  фрагментов. Обозначим такое множество через W.  Остановимся

  на действиях применения такой продукции.

 

       Пусть в ОП находится сеть, содержащая другое множество

  фрагментов - V. Продукция может быть применимой, если  в  V

  имеется подмножество фрагментов - сеть, соответствующая  W.

  Словом, в V должны быть фрагменты, которые могут быть полу-

  чены из W путем описанных ранее замен: переменных на  конс-

  танты или переменные, или символ "_", а символа  "_"  -  на

  что угодно.

 

       Замещения переменных определяют  означивания,  которые

  заносятся в стек. Далее на основе  правой  части  продукции

  формируются новые фрагменты, то есть некоторая  сеть.  Если

  ее не было в ОП, то продукция об'является  применимой.  Эта

  сеть добавляется к фрагментам V. Если же до начала примене-

  ния эта сеть была в ОП, то продукция  считается  непримени-

  мой.

 


 

                              - 15 -

                                                Таблица 3

      ----------------------------------------------------

      :фрагменты в     : соответствующие    : результат  :

      :левой части     : фрагменты в ОП     : означивания:

      :продукции       :                    :            :

      :--------------------------------------------------:

      :R1(A1,X) R2(X)  : R1(A1,A3) R2(A3)   : X -> A3    :

      :R1( _, _) R2( _): R1(A1,A3) R2(A5)   :            :

      :R1(X1,X2)  _(A1): R1(A1,A3) R2(A1/DD): X1 ->A1    :

      :                :                    : X2 ->A3    :

      :R1(A1,X/X1)     : R1(A1,A3)          : X -> A3    :

      :                :                    : X -> K+    :

      ---------------------------------------------------:

       через "К+" обозначено имя фрагмента R1(A1,А3).

 

                           Пример 6

 

       Пусть условная (левая) часть продукции  из  примера  4

  содержит фрагмент муж(X1), представляющий, что X1 это  муж-

  чина. Тогда получим продукцию:

 

  SS1:если VV1 дед(X1,X2) муж(X1) то   отец(X1,X3) отец(X3,X2);

 

       Будучи активизирована, такая продукция станет примени-

  мой, если в сети, находящейся в ОП, имеются фрагменты  вида

  дед(AI,AJ) муж(AI), где AI,AJ - константы (это  могут  быть

  также переменные или символы "_"). Тогда X1 будет  означено

  AI, а X2 - AJ. Применение продукции вызовет такие же добав-

  ления, как и в случае продукции примера 4.

 

 

       2.3. Процесс применения продукций,последовательность

            действий

 

 

       Необходимые вам действия,  выражающиеся  в  применении

  отдельных  продукций,  были  описаны  путем  использованиял

  абстрактных замен. На самом  деле  программное  ядро,  осу-

  ществляющее применение продукций, реализует  последователь-

  ный процесс, в котором порядок  расположения  фрагментов  в

  продукции оказывается существенным.

       Действия применения  отдельной  продукции  сводятся  к

  последовательному выполнению элементарных акций,  связанных

  с поиском соответствующих фрагментов и означиваниями  пере-

  менных. Вначале  берется  первый  фрагмент, находящийся  в

  левой части продукции. Ищется соответствующий ему  фрагмент

  в ОП. Если он есть, то акция считается успешной. Тогда осу-

  ществляется означивание переменных ( в  текущем  варианте).

  Далее, берется второй фрагмент левой  части.  Ищется  соот-

  ветствующий фрагмент в ОП,  но  с  учетом  уже  выполненных

  означиваний. Если такого фрагмента нет, то акция  считается

  безуспешной. Осуществляется  возврат  к  первому  фрагменту

  левой части продукции с  поиском  другого  соответствующего

  ему фрагмента и выбором  другого  варианта  означивания,  и

  т.д.

       Процесс продолжается до тех пор, пока в  ОП  не  будет

  найдена подсеть (один или несколько фрагментов), соответст-

  вующая фрагментам левой части продукции. Если такая подсеть

  найдена, то  применение  продукции  продолжается,  иначе  -


 

                              - 16 -

        

  заканчивается и продукция об'является неприменимой.  Запом-

  ненное означивание переносится в правую часть. Далее после-

  довательно берутся фрагменты правой части с учетом означи-

  ваний. Проверяется их наличие в ОП (в общем случае -  нали-

  чие соответствующих им  фрагментов  в  ОП).  Если  фрагмент

  есть, то берется следующий фрагмент. Если очередного  фраг-

  мента нет, то продукция об'является применимой.  Фрагменты,

  сформированные за счет ее правой части, добавляются к ОП.

       Итак, продукция будет применимой, когда в ОП нет  хотя

  бы одного из проверяемых фрагментов, которые последователь-

  но берутся из правой части продукциии (более точно -  когда

  в ОП нет соответствующих им фрагментов). Если все фрагменты

  есть, то  продукция  будет  неприменимой.  Такая  продукция

  ничего не изменяет в ОП.

 

                           Пример 7

 

       рассмотрим применение продукции из примера 6. Пусть  в

  ОП имеются фрагменты :

 

        дед(A1,А2) муж(А3) дед(А3,А4),

 

      представляющие, что A1 является дедом А2 и А3 - мужчина.

 

       Процесс применения продукции начинается  с  того,  что

  берется ее первый фрагмент  -  дед(Х1,Х2).  Осуществляется

  поиск соответствующего фрагмента в ОП. Если такой  фрагмент

  имеется, то означиваются переменные X1  и  X2.  Означивания

  запоминаются в стеке.в данном примере X1 будет означено A1,

  а X2 - А2. Далее в продукции берется следующий  фрагмент  -

  муж(X1) как муж(A1), то есть  учитываются  уже  выполненные

  означивания. Данный фрагмент ищется в ОП. Оказывается,  что

  его нет. Тогда означивания (в стеке) стираются. Снова  осу-

  ществляется   переход   к   первому   фрагменту   продукции

  дед(X1,X2) с поиском соответствующего фрагмента  в  ОП,  но

  уже другого. Им будет дед(А3,А4). Переменная X1 означивает-

  ся A3, X2 - A4. В ОП ищется муж(А3). Он есть. Тогда  приме-

  нение продукции продолжается.  На  основе  правой  части  в

  буфере системы  будут  сформированы  фрагменты  отец(A3,1+)

  отец(1-,A4). Проверяется их наличие в ОП. Если их не  было,

  то продукция об'является применимой и эти  фрагменты  будут

  добавлены в ОП.

 

       Итак, поиск сети, соответствующий левой части  продук-

  ции, сводится к поиску  в  ОП  соответствующих  фрагментов.

  Такой поиск осуществляется последовательно  -  вначале  для

  первого фрагмента левой части, затем второго, и т.д. Анало-

  гичные проверки осуществляются и  для  правой  части  -  но

  только проверки на наличие и отсутствие. После  этого  про-

  дукция об'является применимой или неприменимой. В  связи  с

  описанным процессом очень важно,  какой  фрагмент  в  левой

  части продукции стоит первым.

       Если у  этого  фрагмента  есть  много  соответствующих

  фрагментов в ОП, то будет делаться много попыток применения

  продукции с выполнением возвратов (когда для  других  фраг-

  ментов из левой части не окажется соответствующих  фрагмен-


 

                              - 17 -

 

  тов). Чтобы таких попыток было меньше, лучше первым ставить

  фрагмент с "уникальными" константами, редко  встречающимися

  в ОП. Вообще, расположение и других фрагментов в левой час-

  ти должно определяться степенью уникальности входящих в них

  констант, например, имен отношений.  Таким  способом  можно

  значительно уменьшить обьем работы, выполняемой системой  в

  процессе применения продукции.

       Следует отметить, что если некоторая переменная  левой

  части продукции была означена символом "_" (нижняя  черточ-

  ка), то такое означивание не  считается  окончательным.  За

  счет других фрагментов будут  делаться  попытки  повторного

  означивания. Например, пусть в ОП имеется:

 

       дед (_,А2) муж (А3)

 

       Что означает: "неважно кто является дедом для А2, А3  -

  мужчина. Тогда при применении рассмотренной ранее продукции

  А1  будет  означено  "_".  Но  за  счет  второго  фрагмента

  "муж(Х1)" это означивание будет заменено на А3. Процесс  ее

  применения будет продолжен.

 

 

 

       2.4. Операторы в левой и правой частях продукций

 

 

 

       Напомним, что перед фрагментами в левой части  продук-

  ции могут стоять следующие операторы:"N:" - нет,"D:" - уда-

  ление и "B:" - выполнить. В процессе  применения  продукции

  последовательно берутся фрагменты ее левой части с выполне-

  нием действий поиска. Если перед фрагментом стоит оператор,

  то это означает необходимость выполнения других действий:

 

         - N:<фрагмент> - проверяется отсутствие в ОП фраг-

       мента, соответствующего указанному фрагменту, тоесть

       стоящему после N:. Только при его отсутствии продукция

       может быть применимой.

 

         - D:<фрагмент> - после того, как продукция оказалась

       применимой. Фрагмент, соответствующий указанному фрагм-

       енту из ОП удаляется.

 

         - B:<фрагмент> - выполняется процедура или функция,

       связанная с указанным фрагментом. Подобные фраг-

       менты будем называть встроенными. При этом в ОП не

       осуществляется поиска фрагментов, соответствующих

       указанному.

 

       Итак, описанные действия выполняются, когда при приме-

  нении продукции процесс дошел до  одного  из  перечисленных

  операторов. При этом учитываются произведенные ранее  озна-

  чивания.

 

       Акция, связанная с  выполнением  оператора  N:,  может

  быть успешной, когда фрагмент  не  найден.  И  безуспешной,


 

                              - 18 -

        

  когда фрагмент найден. В случае успешного  выполнения  про-

  цесс применения продукции продолжается,  иначе  -  заканчи-

  вается. Продукция считается неприменимой.

 

       Оператор D: срабатывает сразу же после того, как  про-

  дукция оказалась применимой. Тогда выполняется акция удале-

  ния (D),которая всегда будет успешной, то есть  обязательно

  будут вызваны необходимые изменения в ОП.

       Акции, связанные с выполнением оператора B:  из  левой

  части продукции, могут быть успешными и  безуспешными.  Это

  определяется вызываемой процедурой или функцией, с  которой

  связан стоящий за "В:" встроенный фрагмент. В случае успеш-

  ности акции  применение  продукции  продолжается,  то  есть

  берется следующий фрагмент и т.д. В случае безуспешности  -

  продукция считается неприменимой.

 

                           Пример 8

 

       Рассмотрим применение продукции, приведенной в примере

  1. Эта продукция имеет вид:

 

  SS1: если UR1 R1(X1) N:R2(X1) D:R3(X1,A1) TO R4(X1) B:A(X1)

  T:UR2(X1);

 

       При применении данной продукции первым  берется  фраг-

  мент R1(X1), за счет  которого  осуществляется  означивание

  переменной X1. Пусть X1 означена константой AI. Тогда  опе-

  ратором N:R2(X1) будет осуществляться  проверка  отсутствия

  фрагмента R2(AI) в ОП. Если  проверка  удовлетворяется,  то

  будет взят следующий фрагмент  -  D:R3(X1,A1).  Будет  осу-

  ществляться поиск в ОП фрагмента вида R3(AI,A1). Если такой

  фрагмент имеется, то применение продукции будет продолжено.

  Будет проверяться наличие в ОП фрагмента R4(AJ).  Если  его

  нет, то продукция будет применимой. Тогда вначале  фрагмент

  R3(AI,A1) будет из'ят из ОП, а затем уже к ОП будет  добав-

  лено R4(AI). Далее будет выполнена процедура с именем  "А",

  и  активизирован  индикатор  UR2(АI).  Если  фрагмент  вида

  R4(AI) есть в ОП, то продукция будет неприменимой.  Указан-

  ные действия из'ятия и добавления не будут выполнены.

 

       Отметим, что конструкции вида N:R2(X1) могут стоять  в

  продукции первыми. Тогда означивание X1 будет осуществлять-

  ся на основе других фрагментов, стоящих за первым.  Сказан-

  ное относится к любым переменным,  на  которые  распростра-

  няется действие оператора "N:".

 

                           Пример 9

 

       SS2:если  VV1  D:дед(X1,X2)  N:жен(X1)  то  отец(X1,X3

  отец(X3,X2);

 

       Здесь представлено, что если X1 является дедом X2 и X1

  не женщина (жен), то это значит, что X1 является отцом  для

  X3, а X3 отцом для X2. При этом предполагается, что отноше-

  ние "быть дедом" должно быть замещено на "быть отцом отца".

  Фрагмент,соответствующий фрагменту дед(X1,X2), должен  быть


 

                              - 19 -

        

  удален из ОП.

       Продукция будет применимой, когда в ОП  имеются  фраг-

  менты вида дед(AI,AJ) и отсутствует жен(AI).  В  результате

  применения продукции фрагмент дед(AI,AJ) будет удален из ОП

  и будет добавлено "отец(AI,N+) отец(N-,AJ)". Такие действия

  будут выполняться последовательно. Вначале будет  осуществ-

  лен поиск фрагмента, соответствующего "дед(X1,X2)", с озна-

  чиванием X1  и  X2.  Затем  будет  осуществлена   проверка

  отсутствия в ОП фрагмента жен(...). Если проверка не удово-

  летворяется,  то  ищется  новый  фрагмент,  соответствующий

  дед(X1,X2), и т.д.

 

 

                           пример 10

 

 

       Рассмотрим применение  продукции  примера  2.  Вначале

  выполняется процедура "I", осуществляющая  ввод  символа  с

  клавиатуры и означивание этим символом переменно й  X1.  Это

  действие всегда будет успешным. Далее проверяется  отсутст-

  вие в ОП одноместных фрагментов,  именем  которых  является

  считанный символ (пусть это будет символ AJ). Если проверка

  удовлетворяется, то применение продукции продолжается. Про-

  веряется наличие в ОП фрагмента мт(АJ). Если  его  нет,  то

  продукция считается применимой. Тогда активизируется  инди-

  катор UR3.

       Следует отметить, что с помощью оператора  "выполнить"

  (B), стоящего в левой части продукции, допускается  обраще-

  ние только к ограниченному числу процедур или функций.  Это

  могут быть лишь функции, осуществляющие  означивание  пере-

  менных и разного рода проверки  -  равенства,  неравенства,

  больше, меньше. Здесь не могут быть функции, осуществляющие

  вывод на экран, блокировки, стирания  и  т.д.  Иначе  может

  оказаться, что перечисленные действия будут выполнены, хотя

  продукция оказалась неприменимой. Такая ситуация недопусти-

  ма.

       Оператор N: может стоять не  только  перед  отдельными

  фрагментами, но и перед сетями, заключенными  в  квадратные

  скобки.  Тогда   осуществляется   проверка   одновременного

  отсутствия в ОП множества соответствующих фрагментов. Отме-

  тим, что такая проверка может быть не эквивалентной  после-

  довательной  проверке  отсутствия  фрагментов.  С   помощью

  конструкций вида N:[...] реализуются сложные  виды  отрица-

  ния.

 

                           Пример 11

 

       рассмотрим применение продукции примера 3. Такая  про-

  дукция имеет вид:

 

  UL2:   если   US1   TRUE(X1)   DAND(X1,X2)   N:[DAND(X3,X2)

  N:TRUE(X3)]

           то TRUE(X2);

 

       С помощью данной продукции обеспечивается  переход  по

  дугам "и" в графе "и-или". При этом ветви типа  "и"  предс-


 

                              - 20 -

        

  тавляются с помощью фрагментов DAND(...,...).

       Пусть в ОП имеются следующие фрагменты:

 

  DAND(A1,A3) DAND(A2,A3) TRUE(A1) TRUE(A2)

 

       Данная сеть означает, во-первых, что если истинны А1 и

  А2, то истинно А3 (см. Первые два фрагмента), и, во-вторых,

  что А1 - истинно, и что А2 - истинно (последние  два  фраг-

  мента).

 

       Остановимся на процессе применения продукции.  Вначале

  в ОП будет осуществляться поиск фрагмента, соответствующего

  TRUE(X1). Переменная Х1 будет означена Х1. Далее будет осу-

  ществляться поиск фрагмента, соответствующего  DAND(A1,X2).

  В результате Х2 будет означено А3. После этого  выполняется

  проверка отсутствия (N:) в ОП сети,  соответствующей  фраг-

  ментам, которые заключены в квадратные скобки.

       Для разных вариантов означивания Х3 (пусть это  АJ)  в

  ОП ищется фрагмент вида DAND(A5,A3), TAKOй, что отсутствует

  TRUE(AJ). Если такой фрагмент удается найти, то  выполнение

  оператора N: об'является безуспешным, а продукция -  непри-

  менимой. В приведенном примере подобного  фрагмента  нет  в

  ОП. Выполнение N: будет об'явлено  успешным,  а  применение

  продукции продолжено. В  результате  будет  сформировано  -

  TRUE(A3). Это делается только тогда, когда такого фрагмента

  в ОП ранее не было.

       С помощью описаннного процесса реализуется поиск  всех

  таких АI (Oни означивают Х2), для которых не удается  найти

  высказываний, связанных с АI дугой "и" и не отмеченных мет-

  кой TRUE(...). Словом, дугами "и" с АI должны быть  связаны

  только  истинные  высказывания.  Подобное  АI   об'является

  истинным - формируется TRUE(AI).

       Перед  фрагментами в  правой  части  продукции  может

  стоять лишь оператор B: -  "выполнить".  Допускаются  также

  индикаторы с оператором T: - "активизировать", о чем  будет

  говориться в следующем параграфе.  Эти  операторы  начинают

  свои действия только в том случае, если продукция оказалась

  применимой. Соответственно, ее переменные (левой части) уже

  означены. Тогда последовательно  берутся  фрагменты  правой

  части и осуществляются необходимые действия.

 

       Напомним, что если в правой части перед фрагментом нет

  операторов, то такие фрагменты просто добавляются  к  ОП  с

  учетом имевших место означиваний.

 

       Если встретился оператор B:R(...), то выполняется про-

  цедура или функция, связанная с R(...). При выполнении учи-

  тывается результат означивания, имевшего место при примене-

  нии продукции. Переменные в R(...) заменяются на соответст-

  вующие константы.

 

                           Пример 12

 

  если UT1 дед(X1,_) то мN1(X1) B:A(X1) ;

 

       У данной продукции нет имени (это допустимо). При этом


 

                              - 21 -

         

  B:A(...) - есть встроенный фрагмент выдачи на печать. Такая

  продукция будет осуществлять поиск  в  ОП  фрагментов  вида

  дед(AI,AJ) с выдачей на печать констант AI, не  входящих  в

  мТ1(AI). Если в ОП не было  фрагментов  вида  мТ1(...),  на

  печать будут выданы все константы и переменные,  обозначаю-

  щие дедов, то есть стоящие на первом  месте  во  фрагментах

  дед(...). При этом все, что выдается на печать будет сохра-

  нено в ОП и помечено "мТ1(...)".

 

       Выполнение оператора B:, стоящего в правой части  про-

  дукции, может привести к следующим результатам:

 

 

         - быть успешным (когда  получен  приемлемый  резуль-

           тат);

 

         - быть ошибочным;

 

         - вызвать прерывание работы с переходом в режим ожи-

           дания;

 

         - привести к прекращению работы ядра ДЕКЛАР и выходу

           в монитор ОС.

 

       В случае успешного выполнения процесс применения  про-

  дукции продолжается, то есть берется следующий фрагмент или

  оператор  из  ее  правой  части.  Соответствующий  фрагмент

  добавляется к ОП, а оператор - выполняется, и т.д.

 

       В случае  ошибочного  выполнения  выдается  сигнал  об

  ошибке. Процесс применения  продукции  также  продолжается.

  Например, такой случай имеет место, когда из буфера клавиа-

  туры считывается выражение, выходящее за  рамки  допустимых

  конструкций входного языка (это делается  встроенным  фраг-

  ментом "IN").

 

       Отметим, что  успешность  или  ошибочность  выполнения

  оператора "B:" из правой части продукции никак не влияет на

  применимость  или  неприменимость  продукции.  Применимость

  определяется по другим критериям - по  результату  проверок

  наличия в ОП фрагментов левой и правой части .

       Прерывание вызывает приостановку применения продукции,

  например, когда считывается очередной символ из буфера кла-

  виатуры, а его нет . Тогда система переходит на режим ожида-

  ния. В это время  никакие  продукции  не  применяются.  Как

  только такой символ появится (будет введен  пользователем),

  работа  возобновляется.  Выполнение   оператора   считается

  успешным. Применение продукции продолжается.

       В  случае  прекращения  работы  осуществляется   общий

  сброс. Из ОП удаляется программное ядро  системы  ДЕКЛАР  и

  все имеющиеся разделы знаний. На экране появляется  символ-

  приглашение ос. Начинать работу нужно сначала. Такой случай

  может возникнуть, например,  при  переполнениии  памяти,  а

  также, когда с диска требуется считать файл,  которого  там

  нет. ПоследнийE случай вызван особенностью обращения к фай-

  ловой системе языка паскаль, используемого  при  реализации


 

                              - 22 -

        

  программного ядра ДЕКЛАР.

 

 

 

       2.5. Управление применением продукций

 

 

       управление осуществляется следующими операторами:

 

  Т1:<индикатор>

         - оператор акивизации  продукций  с  их  однократным

           применением. Последовательно делаются попытки при-

           менения продукций. Вначале берется первая  продук-

           ция с указанным индикатором и делаются попытки  ее

           применения, затем - вторая и т.д. После того,  как

           одна из продукций  оказалась  применимой,  процесс

           заканчивается, то есть больше не делается  попыток

           применения других продукций с таким  же  индикато-

           ром.

 

  Т!:<индикатор>

         - оператор последовательной активизации продукций за

           "один проход".  Последовательно  делаются  попытки

           применения всех продукций с указанным  индикатором

           (во всех вариантах). Здесь может быть много приме-

           нимых  продукций.  Процесс  заканчивается,   когда

           доходит до последней продукции - после всех  попы-

           ток ее применения.

 

  T:<индикатор>

         - оператор циклической активизации продукций. После-

           довательно делаются попытки применения  всех  про-

           дукций с указанным индикатором во всех  вариантах.

           Но в отличие от предыдущего, процесс  не  заканчи-

           вается, когда доходит до последней продукции. Сно-

           ва берется первая продукция и т.д. Процесс  закан-

           чивается, когда нет применимых продукций с указан-

           ным индикатором.

 

       Будем  называть  их  операторами  активизации.  С   их

  помощью  обеспечивается  высокая   эффективность   процесса

  вычисления, минимизация числа попыток применения продукций.

       Операторы активизации могут  стоять  только  в  правой

  части какой-либо продукции. Выполнение каждого такого  опе-

  ратора вызывает прерывание процесса применения  активизиро-

  вавшей ее продукции. Такой процесс приостанавливается.  При

  этом активизация предыдущего индикатора (вызвавшего  приме-

  нение данной продукции) временно снимается и активизируется

  другой индикатор - стоящий после T:(или Т1:, или Т!:).  Это

  вызывает активизацию других продукций. Делаются попытки  их

  применения. После того, как такие попытки закончились  (при

  этом могло оказаться, что вовсе не было применимых  продук-

  ций), выполнение оператора активизациии об'является  успеш-

  ным. Прерывание первой продукции снимается.  Осуществляется

  переактивизация индикаторов - снова активизируется  индика-


 

                              - 23 -

        

  тор первой продукции и процесс ее применения  продолжается,

  то есть берется следующий ее фрагмент или оператор и т.д.

       Выполнение оператора активизации считается успешным  и

  в том случае, когда в ОП  не  было  продукций  с  указанным

  индикатором, то есть нечего было активизировать.

 

                           Пример 13

 

        ... :если UR1 ... То ... T:MM1... ;

        ... :если MM1 ... То ... ;

 

       В данном примере схематично  проиллюстрирован  принцип

  работы оператора T:. Здесь имеется  две  продукции.  Первая

  применяется при активизации UR1. Если она оказалась  приме-

  нимой, то выполняется T: и  активизируется  индикатор  MM1.

  Делается попытка применения второй продукции (в общем  слу-

  чае множества продукций с индикатором MM1). После окончания

  попыток осуществляется переход к первой продукции. Не труд-

  но видеть, что здесь  использован  принцип  возврата  (BACK

  TRACKING), реализуемый с помощью продукций.

 

       Следует отметить, что оператором вида Т: следует поль-

  зоваться с большой осторожностью. Такой оператор (в отличие

  от Т1: и Т!:) должен активизировать продукции, которые что-

  то изменят в ОП. За счет подобного  изменения  продукции  в

  конце концов должны сделаться неприменимыми. Иначе  процесс

  их вызова может быть безостановочным. Например, если вторая

  из только что рассмотренных продукций всегда применима,  то

  она будет активизироваться оператором Т:мм1 безостановочно.

  Система "зациклится".

 

      Продукции, у которых правая часть  состоит  только  из

  операторов T:, будем называть управляющими,  а  если  таких

  операторов нет, то - обрабатывающими. Возможны  и  промежу-

  точные случаи. С помощью управляющих продукций  реализуется

  принцип "двойной черной доски" (BLACK BOARD). Они  вызывают

  последовательную активизацию индикаторов. Причем  в  каждый

  момент времени может быжь активизирован лишь  один  индика-

  тор, и соответственно, делаются попытки  применения  сугубо

  ограниченного  множества  продукций  -  обрабатывающих  или

  управляющих. Таким способом можно задавать сложные  страте-

  гии вычислений. За счет левых частей управляющих  продукций

  можно придать процессу условный характер. При умелой  орга-

  низации процесса общее количество попыток  применения  про-

  дукций (и соответственно, об'ем работы, связанной с  вычис-

  лениями) может быть уменьшено во много  раз,  что  особенно

  важно при работе системы в реальном масштабе времени.

       В общем случае активизация индикаторов может сопровож-

  даться передачей параметров. Например, при выполнении  опе-

  ратора Т1:АN(Х1,Х2,Х3) активизируются продукции с индикато-

  ром АN(...), и в эти продукции передаются параметры  -  ими

  является результат означивания Х1,Х2 и Х3. Применение акти-

  визированных продукций будет  начинаться  уже  при  наличии

  означенных переменных, см. Пример 14.

 

       B системе ДЕКЛАР имеется один  индикатор  (он  обозна-


 

                              - 24 -

        

  чается латинским K), от которого как бы начинается вычисле-

  ние. Он называется "корень".  Корень  активизируется  самой

  системой, когда нет  других  активизированных  индикаторов.

  Такой процесс будет безостановочным.

 

                           Пример 15

 

         если UR00 то T:UK1 T:UK2 T:UR1 T:UR2 T:UR3;

 

       Данная продукция является управляющей.  Ее  применение

  вызывается активизацией индикатора  UK00.  Это  приведет  к

  последовательному включению в  работу  множеств  продукций:

  вначале с индикатором UK1, затем - UK2 и т.д.  Как  бы  все

  продукции разбиваются на уровни. Вначале  делаются  попытки

  применения продукций первого уровня (с UK1), затем  второго

  (с UK2) и, наконец, третьего (с UR3). Причем  на  любом  из

  уровней может быть пустое множество  продукций.  Все  равно

  процесс последовательного включения будет продолжаться.

       Описанное деление продукций на уровни является  весьма

  удобным с точки зрения обработки. Например, с уровнями  UK1

  и UK2  можно  связать  работу  лингвистического  процессора

  (соответствующих продукций), с уровнями с UR1 и UR2 -  про-

  дукций, осуществляющих решение  пользовательских  задач,  с

  UR3 - выдачи результатов. Тогда будет строго  регламентиро-

  вана  последовательность  действий:  поступающая  с  экрана

  информация  вначале  будет  обрабатываться  лингвистическим

  процессором, осуществляющим ее  преобразование  в  сеть  на

  языке РСС. Затем (уже с  помощью  других  продукций)  будет

  осуществлен анализ этой сети на предмет, является ли посту-

  пившая информация условием задачи. Если да, то  реализуются

  требуемые действия, связанные с решениемE, по их  окончании

  выдается результат и из ОП удаляются все ненужные сведения.

  Система готова к восприятию следующей информации, причем на

  каждом уровне могут быть свои управляющие продукции, напри-

  мер, реализующие по этапам работу лингвистического  процес-

  сора, и т.д.

       В заключение рассмотрим еще один пример,  иллюстрирую-

  щий принципы передачи параметров между продукциями  или  их

  группами (модулями).

 

 

 

                           Пример 16

 

 

        если UR1 ... R1(X) ... То ... T1:MM1(X);

 

 

        если MM1(X1) ... То ... ;

 

       Здесь схематично  проиллюстрирован  случай,  когда  от

  первой продукции передается параметр во вторую.  Причем,  в

  первой продукции этот параметр  вычисляется  -  в  качестве

  него берется результат означивания переменной X. Пусть  это

  - A1. Тогда при активизации второй продукции осуществляется

  передача константы A1 - ей означивается переменная X1. При-


 

                              - 25 -

        

  менение последней производится уже при  наличии  означенных

  переменных.

 

 

 

           3.    Встроенные предикаты, спецфрагменты

 

 

         Как  уже  говорилось,  в  системе  ДЕКЛАР  многие  функции

    поддерживаются  за  счет  знаний. Сказанное относится к системе

    команд, лингвистическим процессорам, поисковым операциям и т.д.

    Однако, для реализации некоторых видов  деятельности  требуются

    сугубо программные средства. Это прежде всего функции обращения

    к внешним устройствам (диску, терминалу), разного рода операции

    очистки  памяти,  блокировки,  включения-выключения программных

    модулей и др. Сюда же входят некоторые специальные операции над

    сетями, арифметические операции и др.

         Для обращения к программным  средствам  служат  встроенные

    фрагменты.  В  языке  ДЕКЛ  перед  такими  фрагментами ставится

    оператор B: - "выполнить".

         Обращение к той или иной  программе  (процедуре)  идет  по

    имени  отношения.  При  этом переменные, стоящие на аргументных

    местах встроенного фрагмента, служат для передачи параметров.

         Аналогом   встроенных   фрагментов   являются   встроенные

    предикаты   языка   ПРОЛОГ.  Ниже  будут  рассмотрены  основные

    встоенные фрагменты  системы  ДЕКЛАР,  работающие  во  всех  ее

    версиях.   Полный   перечень  таких  фрагментов    том  числе

    специфичных для версий на машинах  класса  IBM-PC)  приведен  в

    приложении 2.

 

         Будем различать два типа встроенных фрагментов:

 

     А.   Встроенные   фрагменты,   осуществляющие  означивания

    переменных. К ним относятся:

 

          +(...,...,...)   - сложить;

          *(...,...,...)   - умножить;

          DIV(...,...,...) - разделить;

          М-(...,...,...)  - вычесть;

          >(...,...)       - больше;

          <(...,...)       - меньше;

          >=(...,...)      - больше или равно;

          <=(...,...)      - меньше или равно;

          =(...,...)       - равно;

          #(...,...)       - не равно;

          SELF(...,...)    - означивание именем переменной;

          I(...)           - считывание символа с клавиатуры;

          SET(...,...,...) - установка требуемой константы на

                             определенное место фрагмента;

          ARG(...,...,...) - выделение компонент фрагмента

                             (аргументов).

         Перечисленные фрагменты могут стоять только в левой  части

    продукции, где перед ними ставится оператор B:.

         Б.   Встроенные  фрагменты, реализующие  функции  связи  с

    внешними устройствами, а  также  разного  рода  вспомагательные


 

                              - 26 -

        

    операции  - стирания, блокировки и т.д. Они могут стоять только

    в  правых  частях  продукций.  Такие  фрагменты  не  означивают

    переменные, но используют результаты выполненных означиваний.

         Помимо  встроенных фрагментов в системе ДЕКЛАР имеются так

    называемые  спецфрагменты.  Их   нахождение   в   ОП   вызывает

    срабатывание  тех  или  иных  программных  блоков. В отличие от

    встроенных фрагментов  перед  ними  не  ставится  оператор  B:.

    Достаточно  поместить  спецфрагмент в ОП, чтобы соответствующий

    программный блок включился.

                              

         3.1.    Арифметические операции

 

         Ниже   будут   рассматриваться    встроенные    фрагменты,

    реализующие следующие операции:

 

       +, *, DIV, м-, >, >=, <, <=.

 

         Все такие встроенные фрагменты могут стоять только в левой

    части продукции.

 

         Примечание.   Напомним,   что   в  данной  версии  системы

    допускается использование  только  целых  положительных  чисел,

    хотя   в  процессе  выполнения  арифметических  операций  могут

    возникать и целые отрицательные  числа,  которыми  означиваются

    переменные. Использование вещественных чисел не допускается.

 

       Сложение

 

         +(<число>,<число>,<переменная>)  -  вызывает сложение двух

    указанных целых  чисел.  Результатом  является  число,  которым

    означивается указанная переменная.

 

       Умножение

 

         *(<число>,<число>,<переменная>)  - вызывает умножение двух

    указанных целых  чисел.  Результатом  является  число,  которым

    означивается указанная переменная.

 

       Вычитание

 

         M-(<число>,<число>,<переменная>)  -  вызывает вычитание из

    первого  числа  второго.  Результатом  означивается   указанная

    переменная.  Если  первое  число меньше второго, то результатом

    будет отрицательное число.

 

       Деление

 

         DIV(<число>,<число>,<переменная>)   -   вызывает   деление

    первого  числа  на  второе.  Результат,  который  округляется в

    большую сторону и становится целым числом, означивает указанную

    переменную.

 

         В рассмотренных  фрагментах  на  первых  двух  аргументных

    местах  могут  стоять  не  числа,  а  переменные, которые перед

    выполнением оператора должны быть означены целыми числами.

 


 

                              - 27 -

        

                          Пример 4.1

 

        ЕСЛИ FF* B:+(5,30,X1) B:*(X1,6,X2) ТО ;

 

         Применение данной  продукции  вызовет  следующие  действия

    (5+30)*6=X2.   Результатом   будет  целое  число  900,  которым

 

    означится переменная X2.

 

                          Пример 4.2

 

        ЕСЛИ GR* D:GRAD(X1) B:*(X1,X1,X2) ТО B:A(X2) ;

 

         Данная продукция реализует команду  возведения  в  квадрат

    числа,  содержащегося  во фрагменте GRAD(X1). Пусть в ОП введен

    фрагмент GRAD(6).  Тогда  рассматриваемая  продукция  сделается

    применимой.  Переменная  X1 будет означена числом 6. Выполнение

    оператора  в:*(X1,X1,X2)  приведет  к   вычислению   6*6=36   и

    означиванию  X2  числом  36.  За  счет  в:A(X2) это число будет

    выдано на экран.

 

         Больше

 

         >(<число>,<число>) -  вызывает  сравнение  двух  указанных

    чисел. Выполнение оператора B:>(...,...) может быть:

 

         - успешным (если первое число больше второго);

 

         - безуспешным (если первое число  меньше  или  равно

           второму).

         В  первом  случае  применение продукции, у которой в левой

    части  есть  такой  оператор,   продолжается,   во   втором   -

    заканчивается (продукция считается неприменимой).

         В  рассматриваемом  встроенном  фрагменте  на  аргументных

    местах  могут  стоять  переменные,  которые  до   обращения   к

    фрагменту должны быть означены целыми числами.

 

         Меньше, больше или равно, меньше или равно

 

         <(<число>,<число>)  -  первое  число  должно  быть  меньше

    второго;

 

         =<(<число>,<число>) - первое число должно быть меньше  или

    равно второму;

 

         >=(<число>,<число>)  - первое число должно быть больше или

    равно второму.

 

         В остальном все сказанное ранее для  фрагмента  >(...,...)

    справедливо и для данных фрагментов.

 

                        Пример 4.3

 

         ЕСЛИ   MOR*   FUN(X1,X2)   B:DIV(X1,X2,X3)   B:>(X3,2)  ТО

    B:A("Да");

 


 

                              - 28 -

        

         Данная продукция проверяет следующее неравенство  X1/X2>2.

    Пусть  в  ОП находится фрагмент FUN(8,3). Он как бы играет роль

    команды вычисления указанной функции для  заданных  аргументов.

    Тогда  в  продукции  переменные  X1  и X2 будут означены 8 и 3,

    соответственно. В результате целочисленного деления (DIV) будет

    получено число 3, которое означит переменную X3. Так  как  3>2,

    то выполнение B:>(X3,2) будет успешным, а продукция применимой.

    На экран будет выдано слово - "Да".

 

        

       3.2.    Операции над именами

 

 

     Такие операции задаются встроенными фрагментами:

 

     =(...,...) - проверка равенства имен (констант, чисел);

 

     #(...,...) - проверка неравенства;

 

     SELF(...,...)   -   означивание   именем   переменной  или

     константой;

 

     FR(...,...,...) - выделение по имени  фрагмента  констант,

     стоящих на аргументных местах, и наоборот;

 

     SET(...,...,...) - установка во фрагменте указанной

     константы на указанное место;

 

     NEW(...) - создание новой константы (внутреннего кода);

 

     UN(...,...) - слияния, замены имен;

 

         Первые  четыре  встроенные  фрагмента (до FR включительно)

    могут стоять только  в  левой  части  продукции  (так  как  они

    осуществляют  действие  проверки и означивания), а оставшиеся -

    только в правой.

 

       Равенство (режим проверки)

         =(<константа>,<константа>)   -   вызывает   проверку    на

    совпадение  (графическое  равенство)  указанных  констант.  Ими

    могут быть и целые числа.

         На местах констант могут стоять переменные, которые должны

    быть означены ранее. Тогда осуществляется  такая  же  проверка.

    При этом выполнение оператора B:=(...,...) может быть:

 

         - успешным (имеет место совпадение);

 

         - безуспешным ( нет совпадения).

 

         В   первом   случае   применение  продукции  с  оператором

    B:=(...,...)  в  левой  части  продолжается,  а  во  втором   -

    заканчивается.

                          Пример 4.4

 

         ЕСЛИ JJ* NUM1(X1) NUM2(X2) B:=(X1,X2) ТО...;

 


 

                              - 29 -

        

         Продукция  будет применимой, если в ОП имеются одноместные

    фрагменты NUM1(...) и NUM2(...) с одним и тем же  аргументом  -

    им может быть константа или число.

         Аргументами  встроенного  фрагмента  =(...,...) могут быть

 

    символы  и  "_"  (нижняя  черточка).  Тогда  будет  происходить

    сравнение с данным символом (его кодом).

 

             Равенство (режим означивания)

 

         Такой  режим  имеет  место  в  случае,  когда у встроенного

    фрагмента =(...,...) одна из переменных  является  неозначенной.

    Тогда   осуществляется   ее   означивание.   Например,  если  до

    выполнения оператора B:=(A1,X) переменная X не была означена, то

    она   означивается   A1.    Аналогично    происходит    и    при

    последовательном  выполнении операторов B:=(X,A1) B:=(X1,X), где

    X1 будет  означена  A1.  В  случае,  когда  оба  аргумента  есть

    неозначенные  переменные,  не  происходит  никакого означивания.

    Применение продукции будет продолжено.

         Выполнение оператора  B:=(...,...)  в  режиме  означивания

    всегда является успешным.

 

       Неравенство (режим проверки)

 

         #(<константа>,<константа>)    -   вызывает   проверку   на

    несовпадение (графическое неравенство) указанных констант.  При

    этом на местах констант могут стоять означенные переменные.

         Встроенный  фрагмент  неравенства  в режиме означивания не

    работает. Хотя  его  выполнение  будет  считаться  успешным,  а

    применение  продукции  будет  продолжено. В остальном - как для

    равенства (=).

 

                          Пример 4.5

 

       ЕСЛИ SS* REL(X) X(X1/X3) D:X(X1/X4) B:#(X3,X4) TO ;

 

         Данная продукция обеспечивает выявление в  ОП  одноместных

    фрагментов  с  одним  и тем же именем отношения и аргументом. В

    результате  ее  применения  останется  только  один   из   этих

    фрагментов  - первый. При этом имя отношения задается с помощью

    - REL(...). Например,  если  в  ОП  есть  REL(R1)  REL(R2),  то

    действие продукции будет распространяться только на одноместные

    фрагменты вида R1(...) и R2(...).

 

       Означивание именем переменной (или константой)

 

         SELF(<переменная>,<переменная>)   -  вызывает  означивание

    второй  переменной  именем  первой  переменной.  Например,  при

    выполнении B:SELF(X1,X2) переменная X2 будет означена величиной

    X1.    Такое    означивание    оказывается    необходимым   при

    металогической обработке,  когда  к  именам  переменных  должны

    подсоединяться определенного вида фрагменты.

 

         При  выполнении B:SELF(A1,X2) переменная X2 будет означена

    константой A1. При выполнении B:SELF(...,...),  у  которого  на

    втором   месте   стоит  константа  или  означенная  переменная,


 

                              - 30 -

        

    никакого означивания не осуществляется.

         Выполнение B:SELF(...,...), который может стоять только  в

    левой  части  продукции,  всегда  является  успешным.  Во  всех

    случаях применение продукции будет продолжено.

 

        

       Слияние - объединение имен

 

         UN(<константа>,<внутренний код>) - вызывает замену во всех

    фрагментах, находящихся в  ОП,  второй  константы  (внутреннего

    кода)  на  первую.  Этот  фрагмент  не  осуществляет каких-либо

    означиваний и ставится в правых частях продукций.

 

         Например, если в ОП  имеются  фрагменты  R1(A1)  R2(A1,1+)

    R3(A3), то выполнение B:UN(A1,1-) приведет к - R1(A1) R2(A1,A1)

    R3(A1),  т.е. 1+ будет замещено на A1. И так во всех фрагментах

    из ОП, в которые входит константа (внутренний код) 1-.

 

         UN(X1  ,X2)  -  вызывает те же замены, о которых говорилось

    выше. Только обьекты замен - это величины, которыми означены  X1

    и X2.

 

         Выполнение    оператора   B:UN(...,...)   всегда   является

    успешным.

 

         Путем объединения имен во  многих  случаях  может  экономно

    выполняться действие замены фрагментов.

 

                          Пример 4.6

 

 

         ЕСЛИ MM* LR(X1,X2,X3) D:LR(X3,_,X5) TO B:UN(X3,X5);

 

         Данная   продукция  выявляет  цепочку,  состоящую  из  двух

    фрагментов. При этом второй фрагмент  удаляется  из  ОП,  а  его

 

    третий   аргумент   "сливается"  с  третьим  аргументом  первого

    фрагмента.

         Например,   если   в   ОП   были   фрагменты   LR(A1,B1,1+)

    LR(1-,X2,2+)   R(A3),   TO  в  результате  применения  продукции

    останется - LR(A1,B1,1-) R3(1-).

 

         Ограничения не  допускаются  когда  на  втором  агрументном

    месте  стоит  константа  -  не внутренний код. Тогда будет выдан

    сигнал об ошибке.

 

         Фрагмент SET (установить определенный аргумент)

 

         Встроенный фрагмент SET имеет следующий формат:

 

         SET(<имя фрагмента>,<номер позиции>,<константа>)

 

         Он  помещает  указанную  константу  на  указанную   позицию

    фрагмента  с  указанным  именем.  Считается,  что  в  позиции  0

    находится имя отношения, в позиции 1 - первый аргумент, и т.д.

 


 

                              - 31 -

        

         Например,  пусть  имеется  фрагмент  R1(A1,A2/AAA).   Тогда

    выполнение  оператора  B:SET(AAA,1,B1)  приведет  к замене этого

    фрагмента на R1(B1,A2/AAA). Выполнение оператора B:SET(AAA,0,R2)

    приведет к замене последнего на R2(B1,A2/AAA).

         Оператор  B:SET(...)  может  быть  только  в  правой  части

    продукции.  При  его  выполнении  пространственное  расположение

 

    фрагментов в ОП не  меняется.  Происходит  лишь  замещение,  что

    осуществляется достаточно быстро. При этом на аргументных местах

    могут  стоять  переменные,  которые  до  обращения  к B:SET(...)

    должны  быть  означены.  Если  они  не  означены,  то   операция

    замещения не будет выполнена.

 

         Оператор    B:SET(...)    позволяет   реализовать   принцип

    регистровой памяти. В ОП могут быть фрагменты, месторасположение

    которых остается постоянным, а содержимое -  постоянно  меняется

    за  счет  выполнения  обсуждаемого  оператора. Например, в таких

    фрагментах  ("регистрах")   удобно   хранить   коды   состояний,

    промежуточные результаты и т.д.

 

         Фрагмент FR (выделения компонент в указанном фрагменте)

 

         Встроенный фрагмент FR имеет следующий формат:

 

         ARG(<имя фрагмента>,<номер позиции>,<константа>).

 

         Он  осуществляет  поиск  по имени фрагмента его аргументов,

    стоящих на указанных  позициях,  и  наоборот.  С  помощью  этого

    фрагмента  осуществляется  означивание  переменных.  Поэтому  он

    может стоять лишь в левой части продукции.

 

         Например,  при  наличии  в   ОП   фрагмента   R1(A1,A2/AAA)

    выполнение  B:FR(AAA,1,X2)  приведет к означиванию X2 константой

    A1;  B:FR(X,1,A1)  -  к  означиванию   X   константой   AAA;   а

    B:FR(AAA,0,X3)   -   к   означиванию   X3   константой  R1.  При

    многократном выполнении B:FR(...) будут  иметь  место  различные

    варианты    означивания.    Например,    двукратное   выполнение

    B:FR(AAA,X1,X2) приведет к означиванию X1 и X2 вначале 1 и A1, а

    затем - 2 и A2.

 

         Оператор  B:FR(...)  позволяет   анализировать   фрагменты,

    находящиеся  в  ОП,  выделять их компоненты. Например, с помощью

    B:FR(X,_,A1)  могут  быть  выделены  все  фрагменты,  содержащие

    указанную  константу  -  A1. При многократном выполнении данного

    оператора перемнная X будет последовательно означиваться  именем

    этих фрагментов.

 

         Фрагмент NEW (создание внутреннего кода)

 

         Выполнение  B:NEW(X),  стоящего  в  правой части какой либо

    продукции, вызовет формирование в ОП  нового  внутреннего  кода,

    которым   означивается  переменная  X  (вне  зависимости  от  ее

    прежнего  значения).  Такой  оператор  необходим,  когда  в   ОП

    устанавливаются  различного  рода "метки" - стирания, блокировки

    (см. ниже). Роль  таких  меток  могут  играть  не  только  имена

    фрагментов,  но  и  новые внутренние коды, создаваемые с помощью


 

                              - 32 -

        

    B:NEW(<имя переменной>).

         Выполнение оператора B:NEW(...) всегда является успешным.

 

 

 

 

    3.3.    Пересылка информации из ОП  на  диск  и выдача на экран

 

 

 

         Для этой цели служат встроенные фрагменты:

 

         A(...)  -  вывод  указанных  строковых  констант    также

    фрагментов с указанными именами) из ОП на экран или их запись на

    диск;

 

         OUT(...)  - выделение в ОП зоны (по указанным меткам начала

    и конца) и ее вывод на экран или запись на диск;

 

         REW(...)  -  управляет  работой  первых   двух   встроенных

    фрагментов и определяет, куда выводить информацию - на экран или

    на диск (в какой файл);

 

         TT("T") - отменяет действие встроенного фрагмента REW(...),

    устанавливая выдачу информации на экран;

 

         ТT("F")   -   отменяет   действия  предыдущего  встроенного

    фрагмента, устанавливая выдачу в файл,  указанный  во  фрагменте

    REW(...);

         ВК - спецконстанта вывода на экран с новой строки.

 

         Выполнение  B:A(...)  приводит к выдаче на экран или записи

    на диск конкретных констант или фрагментов, указанных с  помощью

    аргументных мест.

 

         Выполнение  B:OUT(...)  -  приводит  к  выдаче на экран или

    записи на диск множества фрагментов.  При  этом  на  аргументных

    местах  OUT(...)  указывается,  от какого места в ОП и до какого

    брать эти фрагменты. Роль указателей играют имена фрагментов.

 

         Выполнение в:REW(...), B:TT("T") и B:TT("F")  устанавливает

    источник,  куда  осуществляется выдача (запись) информации. Если

    не выполнялся ни  один  из  этих  операторов,  то  по  умолчанию

    подразумевается,   что  фрагменты  A(...)  и  OUT(...),  если  в

    последнем специально  не  указывается  имя  файла,  осуществляют

    выдачу информации на экран.

 

         Остановимся на перечисленных фрагментах более подробно.

 

         REW("<имя  файла>","<расширение>")  -  устанавливает запись

    информации в файл <имя файла>.<расширение>. Например, выполнение

    B:REW("PROD","Z") устанавливает вывод информации в файл  PROD.Z.

    Такой файл как бы "открывается" для записи.

         TT("T"),    TT("F")    -    первый   отменяет,   а   второй

    восстанавливает   действие   встроенного   фрагмента   REW(...).


 

                              - 33 -

        

    Выполнение   B:TT("T")  отменяет  такое  действие,  устанавливая

    выдачу на  экран,  а  B:TT("F")  -  восстанавливает  его.  Будет

    осуществляться запись в "открытый файл", указанный в REW(...).

         Фрагмент "A" (вывод на экран слов или указанных фрагментов)

         A("<строковая  константа>")  -  осуществляет вывод на экран

    (или диск) цепочки символов, записанной  в  кавычках.  Строковой

    константой  может  быть  достаточно длинный текст, не содержащий

    внутри двойных кавычек.

         Например, выполнение B:A("Вводите текст *>") вызовет  вывод

    на  экран сообщения - Вводите текст *> (без кавычек). Если ранее

    был выполнен B:REW("ISS","Z"), то  сообщение  будет  записано  в

    конец файла ISS.Z.

         A(<имя  фрагмента>) - осуществляет вывод из ОП на экран или

    запись на диск фрагмента с указанным именем. Если такой фрагмент

    в ОП отсутствует,  то  ничего  не  будет  выдано  на  экран  или

    записано на диск.

 

         Например, если в ОП есть фрагмент RR(EE,CC/KK), то оператор

    B:A(KK)  вызывает выдачу его на экран (или запись на диск). Если

    в ОП нет фрагмента с именем KK, то ничего не будет выдано.

 

         Выполнение оператора B:A(...) всегда является успешным.

 

         А(X) - осуществляет вывод  на  экран  или  диск  константы,

    которой была означена X.

 

         Встроенный  фрагмент A(...) может иметь до пяти аргументных

    мест,  на  которых  могут  стоять  строковые  константы,   имена

    фрагментов или же переменные, которые должны быть означены.

 

                          Пример 4.7

 

     ЕСЛИ UR1 D:RR(X1,_) TO ВК B:A("ARG1 - ",X1);

 

         Многократное  применение  такой продукции приведет к выдаче

    на экран всех первых аргументов бинарного  отношения  RR.  Перед

    каждым таким аргументом будет стоять слово ARG1-, начинающееся с

    новой  строки.  При этом выдаче будет предшествовать удаление из

    ОП фрагментов RR(...). Так если в ОП были  фрагменты  RR(BB,CC),

    RR (EE,CC/KK), то они будут удалены из ОП и на экране появится:

 

 

          ARG1 - BB

          ARG1 - EE

 

 

                          Пример 4.8

 

     ЕСЛИ UK1 PRINT(X1) X1(_/X2) ТО ВК B:A(X2) ;

 

         С  помощью  этой  продукции  осуществляется выдача на экран

    всех одноместных фрагментов с указанным именем отношения. Каждый

    такой фрагмент появится на  экране  с  новой  строки  -  на  это

    указывает  спецконстанта  ВК.  Так,  если  ввести  в ОП фрагмент

    PRINT(RR) и в ОП есть одноместный фрагмент вида  RR(.../KK),  то

    продукция  сделается  применимой. Данный фрагмент будет выдан на


 

                              - 34 -

        

    экран.

         Если в ОП есть одноместные фрагменты RR(...), то  продукция

    тоже  будет применимой. На экран будет выдано RR(.../N+), где N+

    - некоторое число (внутрисистемный код).

 

         Фрагмент OUT (вывод зоны из ОП на экран или на диск)

         Зоной называется находящаяся  в  ОП  информация  (множество

 

    фрагментов),  в  начале  и  в  конце  которой  стоят фрагменты с

    определенными именами. Такие фрагменты называются метками начала

    и конца зоны. Отметим, что роль этих меток  могут  также  играть

    внетренние коды, создаваемые с помощью оператора B:NEW(...).

 

         Фрагмент OUT может работать в двух режимах:

 

         - в первом выдается на экран (или выводится на диск)

           зона вместе с метками начала и конца,

 

         - а во втором - без этих меток.

 

         У  фрагмента  OUT  может быть три аргументных места (когда

    зона должна  выдаваться  вместе  с  метками)  или  четыре  (без

    меток). Рассмотрим вначале первый из них.

 

     OUT(<имя файла>,<имя фрагмента>,<имя фрагмента>),  где:

 

               <имя фрагмента> --> <константа> <переменная>

 

         - осуществляет вывод из ОП  информации,  находящейся  между

    фрагментами  с  указанными  именами,  и запись ее на диск в файл

    <имя файла>.Z.  При  этом  константы  -  это  имена  фрагментов,

    отмечающих  начало  и  конец  считываемой информации, т.е. зоны.

    Фрагменты, ограничивающие  зону,  также  записываются  на  диск.

    Информация, записанная на диск, сохраняется и в ОП.

         Отметим,  что  когда  во  фрагменте  OUT(...),  указано имя

    файла, то действие B:REW(...) на него не распространяется. Вывод

    зоны осуществляется только в файл.

 

                          Пример 4.9

 

         Оператор B:OUT(AAA,X1,X2) обеспечивает поиск в  ОП  зоны  и

    запись  ее на диск. Пусть X1 и х2 были означены константами W1 и

    W2. Тогда в ОП ищутся фрагменты вида ...(.../W1) и  ...(.../W2),

    ограничивающие  зону. Все, что находится между этими фрагментами

    (вместе с ними,  но  кроме  фрагментов  вида  L(...),  Z(...)  и

    _(_/...)), выводится на диск в файл AAA.Z.

         Если файл AAA.Z, в который должен быть записан новый раздел

    знаний,  уже  был  на  диске,  то прежняя информация стирается и

    заменяется на новую.

         Примечание. В данной  версии  ДЕКЛАР  знания  имеют  статус

    файловых  данных,  защита  от стирания которых является функцией

    ОС, а не ДЕКЛАР. В последующих версиях системы данная  концепция

    будет существенно переработана.

         Выполнение  оператора  B:OUT(...)  может  быть успешным или

    ошибочным. Если хотя бы один  фрагмент  с  указанным  именем  не

    найден,   то  вывод  осуществляется  неправильно  или  вовсе  не


 

                              - 35 -

        

    осуществляется. При этом  информация,  находящаяся  в  указанном

    файле, может быть стерта.

         Следует помнить, что при формировании нового раздела знаний

    и его выводе на диск, раздел должен быть соответствующим образом

    оформлен,  т.е. в начале должен стоять фрагмент BEG(.../W1), а в

    конце- END(.../W2).

         OUT (X1,X2,X3) - делается то же  самое,  что  было  описано

    выше,  только  в  качестве имени файла и имен фрагментов берутся

    константы, означивающие X1,X2 и X3.

 

                          Пример 4.10

 

         K2:ЕСЛИ UK1 D: OUT(X1,X4) BEG(X1/X2) END(X1/X3) ТО

    B:OUT(X1,X2,X3) ;

 

         С помощью этой продукции поддерживается двухместная команда

    OUT(...)  -  записать  раздел  с  указанным  именем  на  диск  в

    указанный  файл.  При вводе с Kлавиатуры фрагмента OUT(AAA,II) и

    наличии  в  ОП  меток   BEG(AAA/...),   END(AAA/...)   продукция

    сделается  применимой.  В  результате все фрагменты, находящиеся

    между этими метками, будут записаны в файл II.Z.

 

         OUT(_,<имя  фрагмента>,<имя  фрагмента>)  -  в  отличие от

    того,  что  было  сказано  ранее  -  осуществляет  выдачу  зоны

    (множества  фрагментов)  вместе  с метками начала и конца не на

    диск,  а  на  экран,  на  что  указывает  символ  "_"   (нижняя

    черточка).  При  этом  на  OUT(_,...) начинает распространяться

    действие  оператора  в:RGW(_);  Если  им  для   записи   открыт

    какой-либо  файл, то при выполнении B:OUT(_,...) осуществляется

    вывод указанной зоны из ОП уже не на экран, а в конец файла 

    записью на диск), открытого оператором B:REW(...).

         Прейдем к рассмотрению второго режима.

 

         Если во фрагменте OUT(...) задействовано четыре аргументных

    места  (при  этом  не  важно, что стоит на четвертом аргументном

    месте),  то  зона  выдается  без  меток  начала  и  конца,  т.е.

    ограничивающих   ее  фрагментов.  В  остальном  режим  полностью

    аналогичен описанному ранее.

 

         Например,  выполнение  B:OUT(AAA,X1,X2,_),  где  X1  и   х2

    означены  именами  фрагментов, вызовет запись из ОП на диск зоны

    без упомянутых фрагментов, т.е. без меток начала и конца.

 

                          Пример 4.11

 

         ЕСЛИ UR1 D:OUT(X) BEG(X/X1) END(X/X2) ТО B:OUT(_,X1,X2,_);

 

         С помощью этой продукции поддерживается одноместная команда

    OUT выдачи на экран зоны ОП, содержащей указанный раздел знаний.

    Метки начала и конца зоны не выводятся.

 

 

       3.4. Ввод в ОП знаний и их компоновка

 

 

         Для этой цели служат следующие встроенные фрагменты:


 

                              - 36 -

 

         IN(...) - ввод информации с диска или с клавиатуры в ОП;

 

         VST(...) - вставка зоны в указанное место;

 

         UP(...) - перепись зоны в конец ОП.

 

         Все перечисленные фрагменты могут стоять  только  в  правой

    части  продукции.  Они  позволяют  компоновать  имеющуюся  в  ОП

 

    информацию, обеспечивая запись новой информации и ее пересылку в

    нужное место.

         Фрагмент IN (ввод информации в ОП)

         IN(<имя файла>,<раздел>) - осуществляет ввод с диска  в  ОП

    указанного  раздела  знаний,  записанного на РСС или ДЕКЛ. Такой

    раздел берется из файла <имя файла>.Z.

         Например, оператор B:IN(LIN,LIN) вызовет  считывание  в  ОП

    раздела LIN, находящегося на диске в файле LIN.Z.

 

         Выполнение B:IN(...) может быть:

 

         - успешным, когда требуемые файл и раздел найдены  и

           во  вводимых  знаниях  нет  синтексических  ошибок

           (т.е. записи удовлетворяют  синтаксису  языка  РСС

           или ДЕКЛ);

 

         - ошибочным, когда файл и раздел найдены, но в  раз-

           деле есть синтаксические ошибки, или  же  когда  в

           файле нет указанного раздела;

 

         - привести к  прекращению  работы,  если  требуемого

           файла вообще нет на диске.

 

         В  первых двух случаях применение продукции продолжается, а

    в последнем работа ДЕКЛАР  прекращается  и  управление  получает

    монитор  ОС. Во втором случае выдается сообщение об ошибке. В ОП

    правильно будут считаны лишь фрагменты, стоящие  до  ошибочного.

    Остальные  могут  быть  считаны неправильно. В случае отсутствия

    требуемого раздела или знака его  начала  ($)  ничего  не  будет

    считано  в  ОП.  Напомним,  что  этот  знак в сочетании с $(<имя

    раздела>) должен стоять в строке на первой позиции.

 

         IN(X,X1) - вызывает ввод с диска в  ОП  раздела  знаний.  В

    качестве  имен  файла  и  раздела  берутся  константы,  которыми

    означены X и X1.

 

         IN() -  вызывает  ввод  в  ОП  сети,  набранной  с  помощью

    клавиатуры  на  языке РСС или ДЕКЛ. Допускается также ввод одной

    или множества констант (слов).

 

         Выполнение B:IN() может быть:

 

         - успешным, когда информация на языке РСС или ДЕКЛ

           правильно набраны на клавиатуре;

 

         - ошибочным, когда во вводимых знаниях допущена син-

           таксическая ошибка;


 

                              - 37 -

 

         - с переходом на режим ожидания, когда на клавиатуре

           ничего не набрано.

 

         В первых двух случаях выполняются те же действия, что и для

    IN(...). Последний случай возникает, когда на клавиатуре не было

    набрано никакой информации или же не была нажата клавиша  ENTER.

    Система  будет  ждать,  пока какая-либо информация не появится в

    буфере.   При   поступлении   информации   сделается   возможным

 

    выполнение B:IN(). Применение продукции будет продолжено.

         При  выполнении  оператора  B:IN() к именам всех вводимых с

    клавиатуры фрагментов, а также к отдельным вводимым  константам,

    привешивается метка @@(...). Например, если в ОП введен фрагмент

    R1(A1/DD)   и   константа   AA,  то  дополнительно  в  ОП  будут

    сформированы фрагменты @@(DD) и  @@(AA).  Если  введен  фрагмент

    R1(A1),  то дополнительно будет сформирован фрагмент @@(N+), где

    N+ - внутрисистемное имя первого фрагмента.

         Привешивание меток @@(...) необходимо для  выделения  в  ОП

    только что введенных фрагментов и констант.

 

                          Пример 4.12

 

 

         SS1:ЕСЛИ L1 D:MT() ТО B:A("вводите условие *>") B:IN() ;

 

         Данная  продукция будет применимой, если в ОП есть фрагмент

    MT().  Ее  применение  вызовет  выдачу  на  экран  текста,   что

    осуществляется  с помощью в:A(...), и переход в режим ожидания -

    за  счет  B:IN().  После  того,  как  пользователь  наберет   на

    клавиатуре  соответствующую  информацию и нажмет ENT- ER, работа

    будет продолжена и информация введена в ОП.  Продукция  закончит

    свое применение.

 

         Фрагмент VST (вставка зоны в указанное место)

 

         VST(<имя   фрагмента>,<имя  фрагмента>,<имя  фрагмента>)  -

    осуществляется  поиск  в  ОП  зоны,  началом  и  концом  которой

    являются  первые  два  из  указанных  фрагментов.  Эта зона (без

    упомянутых фрагментов) переносится в другое место -  вставляется

    перед   третьим   фрагментом.   Например,  пусть  в  ОП  имеются

    фрагменты:

 

         BEQ(UL/2+)... END(UL/3+)... R1(AA/4+)

 

         Тогда выполнение B:VST(2-,3-,4-)  вызовет  выделение  в  ОП

    всех   фрагментов,   которые   находятся  между  первыми  двумя.

    Выделенные фрагменты будут перенесены и встанут перед R1(AA/4+).

 

                          Пример 4.13

 

         ЕСЛИ UR1 D:UNION(X1,X2) BEG(X1/X3) END(X1/X4) END(X2/X5) ТО

    B:VST(X3,X4,X5);

 

         Данная  продукция  реализует   команду   объединения   двух

    разделов,   находящихся  в  ОП.  Первый  раздел    именем  X1)

    помещается в конец второго раздела (с именем х2). Будет расширен


 

                              - 38 -

        

    второй  раздел.  Например,   если   на   вход   подать   команду

    UNION(GR1,GR2), то при наличии указанных разделов в ОП продукция

    сделается  применимой. В результате, содержимое первого раздела,

    т.е.  все,  что  находится  между  BEG(GR1)  и  END(GR1),  будет

    поставлено  перед END(GR2) (в конец второго раздела). Сами метки

    BEG(GR1) и END(GR1) будут удалены из ОП. Останутся только  метки

    второго раздела.

 

         Фрагмент UP (перепись зоны в конец ОП)

 

         UP(<имя  фрагмента>,<имя фрагмента>) - осуществляются те же

    действия, что и для VST(...), только указанная зона перемещается

    в  конец  ОП.  Она  встает  вслед   за   последним   фрагментом,

    находящимся в отведенной под знания части ОП.

 

 

      3.5. Удаление информации, очистка зон

 

         В  системе  ДЕКЛАР  имеется  только  одно хранилище текущей

    информации - часть ОП, отведенная под знания. Все, что  делается

    системой,  запоминается  в  ОП в виде множеств фрагментов. После

    выполнения какой-либо команды или решения задачи в ОП  останутся

    все   промежуточные  результаты.  Чтобы  подготовить  систему  к

    следующему  этапу  решения  или  очередной   задаче,   требуется

    удаление "отработавших" фрагментов, очистка соответствующих зон.

    При этом фрагменты, необходимые для выполнения следующих этапов,

    должны  быть  оставлены  в  ОП.  Для этой цели служат встроенные

    фрагменты:

 

         DEL(...) - удаление зоны из ОП (очистка);

 

         C(...) - удаление последней части знаний из ОП;

 

         SQU() - сжатие семантической сети в ОП.

 

         Помимо этого имеются:

 

         H(...) - спецфрагмент ("метка"), защита от удаления;

 

         DELH(...) - встроенный фрагмент удаления меток защиты.

 

         Перечисленные встроенные  фрагменты  могут  быть  только  в

    правой  части  продукции.  Перед  ними  ставится  оператор  B: -

    "выполнить".

 

         Фрагмент DEL (удаление зоны из ОП); Может быть  использован

    для удаления отдельных фрагментов.

 

         DEL(<имя фрагмента>,<имя фрагмента>) - вызывает удаление из

    ОП  указанной  зоны. Имена фрагментов играют роль меток начала и

    конца очищаемой зоны. Эти метки тоже удаляются из ОП.

 

         Например,  выполнение  в:DEL(W1,W2)  вызовет  поиск  в   ОП

    фрагментов  вида ...(.../W1) и ...(.../W2). Все, что дится между

    ними (вместе с ними) удаляется из ОП.

 


 

                              - 39 -

        

         Выполнение оператора B:DEL(...) может быть только успешным.

         Если в ОП не найден второй фрагмент (нет метки конца зоны),

    то очищается часть ОП, которая начинается с первого фрагмента  и

    до конца.

 

         Если  в  ОП  не  найден  первый  фрагмент (нет метки начала

    зоны),  то  очистка  не  производится.  Никакие   фрагменты   не

    удаляются из ОП.

 

         DEL  (<имя фрагмента><имя фрагмента>,H) - вызывает удаление

    из ОП указанной зоны, кроме фрагментов  с  метками  защиты,  см.

    ниже.

 

         DEL(<имя   фрагмента>)  -  осуществляется  удаление  из  ОП

    фрагмента  с  указанным   именем.   Например,   при   выполнении

    B:DEL(AA1) из ОП будет удален фрагмент с именем AA1.

 

         Ограничение.  С  помощью  таких  операторов  нельзя удалять

    фрагменты, имена которых являются аргументами каких-либо  других

    фрагментов.  Например,  если  в  ОП имеется R1(KH/DD) R2(DD), то

    выполнение B:DEL(DD) не вызовет какого-либо удаления.

 

         Фрагмент "C" (удаление последней части знаний)

 

         B:C(<имя  фрагмен   Если в ОП не найден второй фрагмент (нет метки конца зоны),

    то очищается часть ОП, которая начинается с первого фрагмента  и

    до конца.

 

         Если  в  ОП  не  найден  первый  фрагмент (нет метки начала

    зоны),  то  очистка  не  производится.  Никакие   фрагменты   не

    удаляются из ОП.

 

         DEL  (<имя фрагмента><имя фрагмента>,H) - вызывает удаление

    из ОП указанной зоны, кроме фрагментов  с  метками  защиты,  см.

    ниже.

 

         DEL(<имя   фрагмента>)  -  осуществляется  удаление  из  ОП

    фрагмента  с  указанным   именем.   Например,   при   выполнении

    B:DEL(AA1) из ОП будет удален фрагмент с именем AA1.

 

         Ограничение.  С  помощью  таких  операторов  нельзя удалять

    фрагменты, имена которых являются аргументами каких-либо  других

    фрагментов.  Например,  если  в  ОП имеется R1(KH/DD) R2(DD), то

    выполнение B:DEL(DD) не вызовет какого-либо удаления.

 

         Фрагмент "C" (удаление последней части знаний)

 

         B:C(<имя  фрагмен1(A1).   Операторы   типа   B:DEL(X1)  позволяют  осуществлять

    удаление фрагментов не сразу после того, как продукция оказалась

    применимой, а по мере выполнения действий ее правой части.

 

     ЕСЛИ DD*...TO M1(X1/X2)...B:DEL(X2,X2);

 

         Данная продукция  вначале  добавляет  в  ОП  фрагмент  вида

    M1(...),  затем будут выполнены какие-то другие действия (на что


 

                              - 40 -

        

    указывает многоточие), а в конце этот фрагмент будет  удален  из

    ОП.

     Спецфрагменты H(...)

 

         H(<константа>) - наличие этого спецфрагмента в ОП означает,

    что  если  в  очищаемой (с помощью B:C(...,H) или B:DEL(...,H) )

    зоне есть фрагмент,именем которого является указанная константа,

    то такой фрагмент доллжен быть оставлен в ОП. Имеет место защита

 

    от удаления. Такая защита не распространяется на  операторы  D:,

    B:C(<имя фрагмента>).

         Например,  пусть  в ОП имеются фрагменты R1(A1/DD) и H(DD).

    Тогда при удалении из ОП  зоны,  куда  они  входят  (если  такое

    удаление  осуществляется  операторами с константой H), останутся

    оба эти фрагмента. Если же применилась продукция, в левой  части

    которой  были  операторы  D:R1(X1/X2)  D:H(X2), то оба фрагмента

    будут удалены из ОП.

 

         DELH(<имя фрагмента>) - встроенный фрагмент удаления  меток

    защиты.  Такое  удаление  осуществляется  начиная  от указанного

    фрагмента.

 

         Например, выполнение B:DELH(KK) вызовет удаление в ОП  всех

    фрагментов  вида  H(...), расположенных после фрагмента с именем

    KK. Далее, если выполнить B:C(KK,H), то из ОП будут удалены  все

    фрагменты, начиная от KK (вместе с ним).

 

     Фрагмент SQU (сжатие сети)

         SQU()  -  осуществляется  сжатие  всей  семантической сети,

    находящейся в ОП.

 

         Применение продукций, у которых есть операторы D:, а  также

    выполнение  B:DEL(..),  приводит  к  образованию  в ОП свободных

    мест,  т.е.  "пустот".  Для  их  удаления  необходимо  выполнить

    B:SQU(). Это приведет к увеличению свободной части ОП, в которой

    могут располагаться новые знания. Напомним, что в системе ДЕКЛАР

    (для  IBM/PC  и  ЕС-1840)  под  знания отведено 64 кбайт ОП. При

    решении прикладных  задач,  требующих  большого  объема  данных,

    память (ОП) нужно использовать достаточно экономно.

         SQU(<имя   фрагмента>)   -   осуществляется   сжатие  в  ОП

    семантической сети, начиная от указанного фрагмента.

 

                          Пример 4.15

 

     ЕСЛИ D* MT1(X/X1) ... ТО B:SQU(X1);

 

         Применение  данной  продукции  приведет  к  сжатию   в   ОП

    семантической сети, начиная от фрагмента MT1(...).

 

         Ограничения.  Переменная  "X"  в  операторе B:SQU(X) должна

    означиваться в той же самой продукции. Не  допускается  передачи

    из другой продукции метки, указывающей начало сжатия.

 

 

 


 

                              - 41 -

        

            3.6. Операции с дисковой памятью

 

 

         В  системе  ДЕКЛАР  все знания хранятся на диске и в случае

    необходимости пересылаются в ОП или вызываются на  экран.  Ранее

    уже  были  описаны  средства  записи  на  диск (OUT). Ниже будут

    рассмотрены следующие встроенные фрагменты:

 

         F(...) - выдача раздела знаний с диска на экран;

        

         UNB(...) - выдача файла с диска на экран;

 

         REN(...) - копирование файлов на диске;

 

         OUT1(_) - запись знаний на диск в загрузочной форме.

 

     Фрагмент F (выдача с диска на экран)

 

         F(<имя файла>,<раздел>) -  вызывает  чтение  указанного  во

    фрагменте   раздела  знаний  из  файла,  находящегося  на  диске

    (напомним, что именем файла может быть лишь константа, состоящая

    из латинских букв и цифр). Раздел знаний может быть  записан  на

    языках  -  РСС,  ДЕКЛ,  или  содержать какие-либо тексты. Знания

    считываются из файла <имя файла>.Z.

         Например, выполнение B:F(PROD,GRFP) вызовет вывод на  экран

    раздела  знаний  GRFP,  находящегося  на диске в файле PR- OD.Z.

    Данный раздел состоит из продукций, записанных на языке ДЕКЛ.

 

     Выполнение оператора B:F(...,...) может быть:

 

         - успешным (если требуемые файл и раздел найдены);

         - ошибочным (если файл найден, но в нем нет  указан-

           ного раздела);

         - приводить  к  прекращению  работы  системы  ДЕКЛАР

           (если файла нет на диске).

 

         F(X,X1) - вызывает выдачу с диска на экран раздела  знаний.

    В  качестве  имени  файла  и  имени  раздела  берутся константы,

    которыми означены X и X1.

         Встроенный  фрагмент  F(...,...)  широко  используется  для

    выдачи  анкет,  меню, осуществляемой в процессе диалога. За счет

    продукций такая выдача может быть легко  связана  с  выполнением

    определенных условий.

 

                          Пример 4.16

 

     ЕСЛИ TERZN(X) KTL(X,X1) TO B:F(X1,X) ;

 

         Активизация  данной  продукции  с помощью оператора T1:TER-

    ZN(UL) вызовет поиск по каталогу (KTL) имени  файла,  в  котором

    находится   раздел   UL.   Пусть   в   KTL.Z   имеется  фрагмент

    KTL(UL,PROD).  Тогда  продукция  будет  применимой.   Выполнение

    B:F(PROD,UL)  приведет к считыванию из файла PROD.Z раздела UL и

    вывод его на экран терминала.

 

         Фрагмент UNB (выдача файла с диска на экран)

 


 

                              - 42 -

        

         UNB("<имя файла>","<расширитель>") - осуществляется  выдача

    на экран файла <имя файла>.<расширитель>.

         Например,  выполнение  B:UNB("PROD","Z")  вызовет выдачу на

    экран  содержимого  PROD.Z,  где  находится  несколько  разделов

    знаний.

         На  UNB(...) распространяется действие B:REW(...) - открыть

    файл для записи.  Если  такой  файл  открыт,  то  вместо  выдачи

    информации  на экран осуществляется ее запись в этот файл. Здесь

 

    также с помощью B:TT("T") и B:TT("F ") может  блокироваться  или

    возобновляться действие B:REW(...).

 

         Фрагмент REN (копирование файлов на диске)

         REN("<имя  файла>","<расширитель>")  - вызывает копирование

    указанного  файла  <имя   файла>.<расширитель>   в   файл   <имя

    файла>.BAK.

         Например,  выполнение B:REW("GRFF","Z") вызовет копирование

    файла GRFF.Z в GRFF.BAK. Информация,  находящаяся  в  GR-  FF.Z,

    сохраняется.   Подобные  действия  необходимы  в  случае,  когда

    использование каких-либо разделов знаний,  находящихся  в  одном

    файле,  связано  с  их  изменением.  Тогда  в ряде случаев нужно

    сохранять "первоисточник".

 

         Фрагмент OUT1 (запись знаний на диск в загрузочной форме)

 

         OUT1()  -  осуществляется  запись  всех   знаний,   которые

    находятся  в  ОП,  на диск в так называемой "загрузочной" форме,

    т.е.  в  виде  цепных  списков.  Знания  записываются   в   файл

    DECLAR.ZNN.

         Дело  в  том, что при считывании в ОП знаний, записанных на

    РСС и ДЕКЛ, они преобразуются в  чисто  машинное  представление,

    где  имеют  место  уже  не имена констант и переменных, а цепные

    списки, всевозможные переадресации и т.п.

         Для  обеспечения  быстрого  ввода   можно   воспользоваться

    "загрузочной"  формой. С помощью B:OUT1() машинное представление

    знаний  может  быть  записано  в  файл  DECLAR.ZNN.  Тогда   при

    считывании  этих знаний в ОП уже не будет требоваться трудоемких

    операций  перекодировки  имен  с  построением  цепных   списков.

    Загрузка знаний будет осуществляться гораздо быстрее.

         Оператор B:OUT1() может быть использован при первоначальной

    загрузке  в  ОП  разделов  знаний.

 

 

         3.7. Посимвольная обработка литеральных конструкций

 

         Для  организации посимвольной обработки литеральных цепочек

    служат встроенные фрагменты:

 

         R()  -  определяет  источник,  откуда  должна   считываться

    информация;

 

         G()  -  сдвигает  указатель  позиции, из которой может быть

    считан символ;

 

         I(X) - считывает символ из указанной позиции;

 


 

                  и переменных, а цепные

    списки, всевозможные переадресации и т.п.

         Для  обеспечения  быстрого  ввода   можно   воспользоваться

    "загрузочной"  формой. С помощью B:OUT1() машинное представление

    знаний  может  быть  записано  в  файл  DECLAR.ZNN.  Тогда   при

    считывании  этих знаний в ОП уже не будет требоваться трудоемких

    операций  перекодировки  имен  с  построением  цепных   списков.

    Загрузка знаний будет осуществляться гораздо быстрее.

         Оператор B:OUT1() может быть использован при первоначальной

    загрузке  в  ОП  разделов  знаний.

 

 

         3.7. Посимвольная обработка литеральных конструкций

 

         Для  организации посимвольной обработки литеральных цепочек

    служат встроенные фрагменты:

 

         R()  -  определяет  источник,  откуда  должна   считываться

    информация;

 

         G()  -  сдвигает  указатель  позиции, из которой может быть

    считан символ;

 

         I(X) - считывает символ из указанной позиции;

 


 

                  уры.

 

         Напомним, что информация  в  буфере  клавиатуры  становится

    доступной только после нажатия клавиши ENTER.

 

         Выполнение B:R() всегда будет успешным.

         R(<имя   файла>)   -   указывает,   что  информация  должна

    считываться из файла <имя файла>.Z.

         В этом случае действия, вызываемые B:G(), B:I(X), B:LN()  и

    B:EOLN  будут направлены на работу с указанным файлом. Например,

    B:R(LL1) - есть указание,  что  символы  должны  считываться  из

    файла LL1.Z.

 

     Выполнение B:R(<имя файла>) может быть:

 

       - успешным;

 

       - приводить к прекращению работы ДЕКЛАР (если на диске

         нет требуемого файла).

 

         Фрагмент "I" (чтение символа из указаной позиции)

 

         I(<переменная>)  -  вызывает считывание символа, на который

    направлен указатель. Этот символ означивает переменную.

 

         Например,  если  указатель  направллен  на  букву  "Д",  то

    выполнение B:I(X) приведет к означиванию X этой буквой.

 

         Выполнение B:I(<переменная>) всегда успешно.

 

         I("<символ>")  -  вызывает  проверку  того,  что  указатель

    направлен на отмеченный символ.

 

         Выполнение B:I("<символ>") может быть:

 

         - успешным (если указатель направлен на отмеченный символ);

 


 

                              - 44 -

        

         - безуспешным (если указатель направлен на другой символ).

         Например,  выполнение   B:I("S")   будет   успешным,   если

    указатель  направлен  на  символ  "S",  и  безуспешным - во всех

    других случаях.

 

         Фрагмент "G" (сдвиг указателя на следующую позицию)

 

         G(I) - вызывает перемещение указателя на следующую позицию.

 

    Перемещение осуществляется только в случае,  если  на  следующей

    позиции   есть   какой-нибудь   символ.   Если   его   нет,   то

    осуществляется переход  в  режим  ожидания.  Процесс  применения

    продукции  с оператором B:G() будет продолжен с появлением новых

    символов.

         Итак, выполнение в:G() может быть:

 

         - успешным;

 

         - приводить к переходу в режим ожидания (заполнения буфера

    экрана или акции считывания из файла).

 

         Источник, на который направлены действия B:G() и  B:I(...),

    определяется  оператором  B:R(...).  По умолчанию предполагается

    работа с клавиатурой.

 

                          Пример 4.17

 

         ЕСЛИ T01 D:MD(X1) B:I(X2) ТО LR(X1,X2,X3) MD(X3) B:G() ;

 

         С помощью этой  продукции,  вызываемой  посредством  T:T01,

    осуществляется  посимвольное считывание информации с построением

    пространственной структуры. При этом, если ранее  не  выполнялся

    оператор  B:R(<имя файла>), то считывание будет осуществляться с

    клавиатуры.

         Пусть в ОП имелся фрагмент MD(1+),  а  на  клавиатуре  были

    набраны  символы "ABC". Тогда нажатие ENTER приведет к их чтению

    в буфере и трехкратному применению продукции. В результате будет

    сформирована сеть:

 

       LR (1-,"A",2+) LR(2-,"B",3+) LR(3-,"C",4+) MD(4-)

 

         Это и есть пример пространственной  структуры  (ПС).  Метка

    MD(...)  указывает  на  последний элемент строящейся ПС. Вначале

    будет MD(1+). В результате первого  применения  продукции  будет

    считан  символ  "A",  построен  фрагмент  LR(1+,"A",2+), а метка

    MD(...) будет сдвинута, т.е. фрагмент MD(1-) будет удален из ОП,

    а MD(2+) добавлен. За счет  B:G()  указатель  будет  сдвинут  на

    следующую   позицию.  Не  трудно  видеть,  что  пространственная

    структура   цепочки,   состоящей   из   трех   символов,   будет

    сформирована   трехкратным   применением   указанной  продукции.

    Система перейдет в  режим  ожидания,  когда  все  символы  будут

    считаны.

 

         Фрагмент LN (перемещение указателя на следующую строку)

 

         LN()  -  вызывает  перемещение  указателя на первую позицию


 

                              - 45 -

        

    новой строки. Все символы, оставшиеся в предыдущей  строке,  как

    бы  игнорируются  (можно  считать - удаляются). Система готова к

    восприятию новой информации.

         Выполнение B:LN() может быть только успешным. Источник,  на

    который направлены действия, определяется оператором B:R(...).

 

                          Пример 4.18

 

         SS2:ЕСЛИ UK1 B:I(X2) ТО MTT(X2) B:LN() ;

 

         Эта  продукция прочитает с буфера клавиатуры первый символ,

    поставит на него метку MTT(...) и перейдет к  следующей  строке.

    Остальные символы текущей строки будут игнорированы.

         Фрагмент EOLN (проверка конца записи)

 

         Выполнение B:EOLN() будет:

 

         - успешным, если указатель находится в  позиции,  за

           которой в данной строке нет больше каких-либо сим-

           волов. В самой позиции должен быть символ  пробела

           (он всегда автоматически добавляется  к  считанной

           строке - при нажатии ENTER);

 

         - безуспешным во всех остальных случаях.

 

         Данный  фрагмент  необходим для установления момента, когда

    закончено считывание символов и требуется вызов  соответствующих

    отработавших продукций.

 

 

       3.8. Управление режимом работы

 

         Ниже будут рассмотрены следующие спецфрагменты:

 

         @BL(...) - спецфрагмент блокировки зон оп;

 

         PAR(...) - встроенный фрагмент, вызывающий включение или

    выключение дополнительных программных блоков системы ДЕКЛАР.

 

         Во многих случаях заранее известно, к каким разделам знаний

    или  зонам  в  ОП должны применяться (или не применяться) те или

    иные   продукции.   Чтобы   сделать   такое   применение   более

    направленным  необходимы  специальные средства. В системе ДЕКЛАР

    их роль играют спецфрагменты @B L (...). Они блокируют  зоны  от

    применения  продукций,т.е.  фрагменты,  входящие  в эти зоны, не

    рассматриваются   в   процессе   такого   применения.   Подобные

    спецфрагменты  позволяют исключить побочные эффекты, связанные с

    применением  одних  продукций  к  другим.  С  их  помощью  можно

    значительно   уменьшить  объем  работы,  связанной  с  попытками

    применения продукций. Для этого достаточно заблокировать зоны, к

    которым те или иные продукции заведомо не должны применяться,  а

    потом уж активизировать данные продукции.

 

         Фрагмент @BL (блокировка зоны)

 

         @BL(<имя   фрагмента>,<имя   фрагмента>)  -  наличие  этого


 

                              - 46 -

        

    спецфрагмента в  ОП  вызывает  блокировку  зоны  от  применениия

    продукций.  Метками  начала  и  конца  зоны являются фрагменты с

    указанными именами.

         Например,  наличие  в  ОП  фрагмента   @BL(W1,W2)   сделает

    невозможным  применение всех продукций к фрагментам, находящимся

    в ОП между ...(.../W1) и ...(.../W2),  в  том  числе  и  к  этим

    меткам.  Если  в  ОП  отсутствует  одна  из  указанных меток, то

    блокировка не срабатывает.

 

         @BL(<имя фрагмента>) - наличие  этого  спецфрагмента  в  ОП

    вызывает   блокировку  от  применения  продукций  зоны,  которая

    начинается с указанного фрагмента.  Блокировка  распространяется

    до конца ОП, отведенной под знания.

         Например,   наличие  в  ОП  спецфрагмента  @BL(W1)  сделает

    невозможным применение продукций к фрагментам, находящимся в  ОП

    после ...(.../W1).

         Если  в  ОП  отсутствует  указанный  фрагмент, то при вводе

    @BL(...) формируется фрагмент  _(/W1)  и  ставится  позади  всех

    фрагментов.

 

         Снятие блокировки осуществляется:

 

         - удалением фрагмента @BL(...) из ОП;

 

         - командой PAR("4" "5"), см. ниже.

 

                          Пример 4.19

 

         Пусть в ОП уже был считан раздел знаний с именем AAA. Пусть

    известно, что продукции, например с индикатором UU1, заведомо не

    должны  применяться  к  указанному разделу. Тогда их активизация

    может осуществляться следующим образом:

 

         ЕСЛИ UR1 BEG(AAA/X1) END(AAA/X2) ТО @BL(X1,X2) T:UU1 ;

 

         За счет левой части продукции в ОП выделяются метки  начала

    и  конца  раздела  AAA.  За  счет  правой  части  осуществляется

    блокировка  зоны  ОП,  в  которой  находится  этот   раздел,   и

    активизация других продукций.

         Программное  ядро  системы  ДЕКЛАР  состоит  из  блоков или

    процедур. Некоторые  из  них  выполняют  специальные  функции  -

    трассировки  с выдачей на экран тех или иных сообщений и т.д. Их

    включение  в   работу   осуществляется   с   помощью   оператора

    B:PAR(...).

 

         Фрагмент    "PAR"    (изменение   состояния   системы,   ее

    "параметров")

         Встроенный фрагмент PAR(...) имеет два аргументных места  -

    на  первое  ставится "параметр" (число от 1 до 4), а на втором -

    "значение  параметра"  (число  от  0  до  5).  Параметры  с   их

    значениями  определяют,  какие  дополнительные блоки должны быть

    включены в работу.  При  этом  параметр  -  "1"  определяет  вид

    трассировки;

 

         "2"   -   выдачу   на   экран   справочной   информации   о

    заблокированных зонах (для продукций);


 

                              - 47 -

 

         "3" - привешивание меток к введенным с экрана фрагментам;

 

         "4" - снимает или устанавливает режим блокировки зон.

 

         По умолчанию предпологается, что  параметр  имеет  значение

    "0",  т.е.  такое  значение ставится автоматически, если не было

    операторов B:PAR(...).

         Итак:

 

         PAR("<число 1>","<число 2>"),

 

          где <число 1> -->1,2,3,4;

 

              <число 2> -->0,1,2,3,4,4.

 

         PAR("1","2")   -   вызывает   включение    блока    простой

    трассировки. Этот блок следит за применением продукций. На экран

    выдаются продукции, которые оказались применимыми.

 

         B:PAR("1","5")    -   вызывает   включение   блока   полной

    трассировки. На  экран  выдается  вся  информация,  связанная  с

    попытками применения продукций.

 

         B:PAR("1","0") - вызывает выключение блоков трассировки. По

    умолчанию   предпологается,что   трассировка   выключена,   т.е.

    значение параметра равно "0".

 

         B:PAR("3","5") - вызывает привешивание ко всем  фрагментам,

    вводимым  с  экрана,  меток  @@(...).  Напомним,  что  на  месте

    многоточия во фрагменте метки стоит имя вводимого фрагмента.

 

         B:PAR("3","0") - метки @@(...)  к  вводимым  фрагментам  не

    привешиваются. Этот режим предпологается по умолчанию.

 

         Отметим,  что к отдельным вводимым константам метки @@(...)

    привешиваются всегда.

 

         B:PAR("4","5") - вызывает  снятие  режима  блокировки  зон,

    т.е.  разблокировку  всех  заблокированных  зон.  При выполнении

    B:PAR("4","5") продукции будут применяться ко  всем  фрагментам,

    находящимся в ОП. Спецфрагмент BL(...) игнорируется.

 

         B:PAR("4","0")  - вызывает включение режима блокировки зон.

    Спецфрагменты BL(...) начинают выполнять свои функции.

 

         Перечисленные режимы работы могут устанавливаться с помощью

    операторов B:PAR(...), а также  в  командном  режиме  с  помощью

    одноименной   команды  PAR(...)  -  установить  параметр  с  его

    значением. Подобная команда поддерживается следующей продукцией:

 

     ЕСЛИ UK1 D:PAR(X1,X2) ТО B:PAR(X1,X2) ;

 

         При  вводе  команды  с  экрана  будут  выполнены  действия,

    которые были описаны ранее.

 

         В  версиях системы ДЕКЛАР, работавших на ЭВМ класса IBM-PC,


 

                              - 48 -

        

    имеется    дополнительный    набор    встроенных     фрагментов,

    обеспечивающих  создание  окон, установки цвета, вызов редактора

    текста и др.

 

 

 

 

 

 

 

       4. Правила составления программ на языке ДЕКЛ.

 

 

 

       Как уже говорилось, язык ДЕКЛ заметно отличается  от

  языка ПРОЛОГ. В  ДЕКЛ  продукции  (правила)  имеют  более

  общий вид, допускается применение одних продукций к другим.

  Есть возможность управления применением продукций,  см.п.3.

  В ДЕКЛ выбрана другая процедура вычисления. Каждая  акти-

  визированная продукция применяется в  различных  вариантах.

  После этого становится возможным применение других  продук-

  ций, которые, в частности, могут активизироваться  текущей.

  Такое отличие порождает свои особенности  в  программирова-

  нии. Остановимся на  основных  правилах,  которые  позволят

  правильно писать программы на ДЕКЛ.

 

       Правило 1.

 

       Каждая    продукция,    активизированная    оператором

  Т:<индикатор>, должна что-то изменять в знаниях, находящих-

  ся в ОП, иначе она будет применяться безостановочно.

 

       Примечание. Сказанное не относится к продукциям, акти-

  визированным оператороми T!:<индикатор> и Т1:<индикатор>.

 

    Напомним, что изменение знаний в  ОП  может  осуществ-

  ляться:

 

         - во-первых, за счет оператора удалить (D:), стояще-

           го в левой части продукции,

 

         - во-вторых, за счет фрагментов, находящихся в  пра-

           вой части продукции и  не  являющихся  встроенными

           (они добавляются к ОП),

 

         - в-третьих, за счет встроенных фрагментов "слияния"

           (UN), "ввода знаний" (IN) и "удаления" (DEL,с) и

 

         - в-четвертых, за счет активизации других продукций,

           которые вызывают изменения.

 

       То или другое, или третье, или  четвертое  обязательно

  должно быть в любой продукции.

 

       Не допускаются  активизации  оператором  Т:<индикатор>

  такой продукции, у которой в левой части нет оператора уда-


 

                              - 49 -

        

  ления, а правая состоит только из встроенных  фрагментов  с

  оператором "В:" (кроме перечисленных).

 

                           Пример 17

 

        если UR1 R1(X1) то B:A(X1) ;

 

       Недопустима активизация данной  продукции  оператором

  Т:UR1. Для этого следует использовать оператор  Т!:UR1,  не

 

  вызывающий безостановочных попыток применения. При этом  на

  экран будут выданы  все  аргументы  отношения  R1.  Следует

  заметить, что  и  при  активизации  T:UR1  можно  исключить

  безостановочное применение. Для этого в правую  часть  про-

  дукции следует ввести фрагмент, играющий роль метки, или же

  можно перед фрагментом  R1(...)  поставить  оператор  "D:".

  Тогда вывод на экран будет сопровождаться  удалением  фраг-

  ментов.

 

       Правило 2.

 

       При составлении продукций помните о возможности приме-

  нения одних продукций к  другим.  За  счет  этого  возможны

  побочные эффекты.

       Напомним, что одна продукция будет применима к другой,

  если в последней есть фрагменты, соответствующие левой час-

  ти первой продукции - ее (!) фрагментам.

 

                           Пример 18

 

        TR1:если UR1 R1(X1) то ... ;

 

        TR2:если UR1 R1(X1) R2(X1,X2) то ... ;

 

        TR3:если UR2 R3(X1) то R1(X1) R2(X1,X2) ;

 

       Первая из этих продукций будет применяться  ко  второй

  (ее левой части) и третьей (ее правой части).  Вторая  про-

  дукция будет применяться к третьей (ее правой части). Такое

  применение, если оно не предусмотрено в  рамках  алгоритма,

  может вызвать порождение ненужной информации (фрагментов  в

  ОП).

 

       Чтобы одни продукции не применялись  к  другим,  можно

  воспользоваться следующими приемами:

 

         - заблокировать зону или разделы  в  ОП,  в  которых

           находятся продукции. Напомним, что  это  осуществ-

           ляется с помощью спецфрагмента  BL(...,...).  Про-

           дукции не будут примененяться к фрагментам,  нахо-

           дящимся в заблокированных  зонах.  Чтобы  избежать

           случая применения продукций, показанного в  преды-

           дущем примере, следует оформить их как раздел зна-

           ний: в начале поставить  метку  BEG(.../W1),  а  в

           конце - метку END(.../W2). Тогда  введением  в  ОП

           спецфрагмента BL(W1,W2)  будет  исключена  возмож-


 

                              - 50 -

        

           ность описанного применения  продукций  к  продук-

           циям.

       Примечание. Напомним, что такое применение  необходимо

  при металогической обработке, когда одни продукции  активи-

  зируют другие, находят необходимую информацию и т.д.  Тогда

  вторые из упомянутых продукций используются не как  средст-

  во, а как "материал" для поиска и обработки.

 

         - сделать в левой части  каждой  продукции  один  из

           фрагментов именованым и ввести в эту часть  допол-

           нительный фрагмент N:_(_,XJ), где XJ -  имя  фраг-

           мента. Это будет исключать возможность  применения

           одних продукции к другим.

 

                           Пример 19

 

        Eсли UR1 R1(X1/X2) N:_(_,X2) то ... ;

 

       Эта продукция не будет применима ни к  одной  из  трех

  продукций  примера  18.  Попытки  такого  применения  будут

  делаться, но все они  будут  безуспешными  из-за  фрагмента

  N:_(_,X2). Дело в том, что любая продукция,  записанная  на

  языке ДЕКЛ, вначале преобразуется на РСС  (что  осуществ-

  ляется при ее считывании в ОП). Только после этого преобра-

  зования становится возможным ее применение. В то же  время,

  при записи продукции на РСС имена всех ее фрагментов  вклю-

  чаются в так называемые "сборки". Однако, оператор  отрица-

  ния N:_(_,X2) будет проверять, чтобы таких сборок не было и

  чтобы фрагмент R1(X1/...) не входил в какие-либо продукции.

  Пользуясь  указанным  приемом,  можно  избежать  применения

  одних продукций к другим продукциям, расположенным в незаб-

  локированных зонах ОП.

 

       Правило 3.

 

       Путем умелого расположения фрагментов в левой (и  пра-

  вой) части  продукции  можно  значительно  уменьшить  об'ем

  работы, связанной с попытками применения  продукций.  Жела-

  тельно, чтобы первыми стояли фрагменты с константами, редко

  встречающимися в ОП, то есть "уникальными". Вообще, порядок

  расположения фрагментов  в  продукции  должен  определяться

  степенью уникальности констант, частотой  встречаемости  их

  комбинаций, и т.п.

 

       Правило 4.

 

       Чем меньше объем разделов знаний,  находящихся  в  ОП,

  тем быстрее будет осуществляться обработка. Дело в том, что

  сети (РСС) представляются в ЭВМ в виде цепных списков - для

  каждой константы будет свой список. Чем больше  раз  встре-

  чается та или иная константа в ОП,  тем  длинней  будет  ее

  список и, следовательно, больше времени будет тратиться  на

  работу (программное ядро постоянно пробегает такие списки).

  Итак, время  обработки  зависит  от  частоты  встречаемости

  констант в ОП. Если два раздела знаний  содержат  непересе-


 

                              - 51 -

        

  кающиеся множества констант, то наличие в ОП одного раздела

  никак не будет влиять на  время  работы,  осуществляемой  в

  рамках другого раздела. Если  разделы  содержат  одинаковые

  константы, то влияние будет иметь место.

 

       Правило 5.

 

       При очистке памяти встроенными фрагментами "DEL" и "с"

  следует предусмотреть,  чтобы  не  была  уничтожена  нужная

  информация. Для этого служат спецфрагменты защиты "BL".

       Особенность системы ДЕКЛАР состоит в том, что при при-

  менении продукций все вновь получаемые фрагменты помещаются

  вслед за имеющимися. Такие фрагменты могут быть  достаточно

  разнородными. Некоторые из них могут играть лишь  вспомога-

  тельную, второстепенную роль. Такие фрагменты  будут  нахо-

  диться "вперемешку" с другими. Поэтому возникает  специаль-

  ная задача - выделения "нужных" из них, которые, к  примре-

  ру, должны быть оставлены в ОП и в дальнейшем запомнены  на

  диске, или же использоваться при последующей обработке. Для

  этого и служат спецфрагменты защиты.

 

       Правило 6

 

       Не допускается формирование  новых  фрагментов,  имена

  которых совпадают с именами уже имеющихся в ОП констант.

       Дело в том, что  имя  фрагмента  есть  его  уникальная

  характеристика. Наличие двух фрагментов с одним  именем  не

  допустимо с точки зрения работы программного ядра. В  связи

  со сказанным недопустимы продукции следующего вида:

 

 

                      Пример 19

 

 

          если ... То ... R1(X1/DD) ... ;

 

 

       На месте "DD" должна стоять переменная, не входящая  в

  левую часть продукции.

 

       Правило 7.

 

       Не допускается наличие двух или нескольких продукций с

  одинаковыми именами. Напомним, что имен у продукций может и

  не быть. Тогда их роль будут играть  внутрисистемные  коды.

  Однако, это может оказаться неудобным при  отладке  продук-

  ций.

 

       Правило 8.

 

       Следует избегать циклов  в  процессе  последовательной

  активизации продукций, т.е. когда одна продукция  активизи-

  ровала другую, та - третью, а третья - первую. Нельзя соот-

  ветствующим образом располагать  индикаторы  в  продукциях.

  Например, нежелательно множество продукций вида:

 


 

                              - 52 -

 

        если W1 ... То ... T:W2 ... ;

        если W2 ... То ... T:W3 ... ;

        если W3 ... То ... T:W1 ... ;

 

       циклы возникают и при рекурсивном обращении, например,

 

         если W1(X) ... То ... Т1:W1(X1) ... ;

 

       Такого сорта обращения в общем случае допустимы. Одна-

  ко, следует помнить, что в случае большого количества шагов

  рекурсии (если их более, чем 256) может переполняться стек,

  в  котором  запоминается  "история"  активизации  продукций

  (стек необходим для выполнения возвратов).

       Чтобы этого не было, процесс применения продукций сле-

  дует организовывать таким же образом, как вызов  модулей  в

  структурном программировании: верхний модуль вызывает  ниж-

  ний, а тот, отработав, передает управление  вызвавшему  его

  модулю. Подобный вызов реализуется операторами активизации.

  Процесс активизации должен иметь вид дерева.

       В заключение следует отметить,  что  если  при  работе

  системы ДЕКЛАР произошло прекращение ее работы с выходом  в

  монитор ос, то основными причинами могут быть:

 

         - обращение к файлу, которого нет на диске (имя это-

           го файла выводится на экран);

 

         - переполнение части ОП, отведенной под знания;

 

         - переполнение стека  вызовов,  в  котором  хранится

           история активизации продукций.

 

       Если система "повисла",  то  основной  причиной  может

  быть неправильная активизация продукций, см. Правило 8.

 

 

 

                 5. Решение прикладных задач

 

 

 

         Система  обработки  знаний  ДЕКЛАР  может   иметь   широкое

    применение при решении задач логико-лингвистического характера в

    различных   предметных  областях.  В  этом  разделе  рассмотрено

    несколько   прикладных   задач   разной    степени    сложности,

    иллюстрирующих работу системы ДЕКЛАР.

 

 

 

     5.1. Поиск транзитивного замыкания на графе

 

 

         Введем  вначале  обозначения.  Символ  ">"  будет обозначть

    связку "принадлежать". Например, запись A > B означает,  что  "A

    принадлежит B". Перейдем к постановке задачи.

 


 

                              - 53 -

        

         Пусть  дан  граф  Q(VG,DG),  где VG - множество вершин V(I)

    графа, V(I) > VG, I=1,2,...,N, N - число вершин графа,  а  DG  -

    множество ориентированных дуг D(I,J), соединяющих вершины графа,

    D(I,J) > DG, I=1,...,N, J=1,...,N, I не равно J.

         На  этом  графе  выделяется  пара V(I) и V(J) - начальная и

    конечная вершины. Требуется  определить  все  пути,  ведущие  из

    начальной  вершины в конечную, и выдать на печать информацию обо

    всех дугах, входящих в эти пути (хотя бы в какой  либо  один  из

    них).

 

         Если обозначить через L(K) к-ый путь, ведущий из вершины

    V(I) в вершину V(J), то множество путей LG, L(K) > LG образуют

    транзитивное замыкание между вершинами V(I) и V(J).

         Такого  типа  задачи  часто  возникают  при  проектировании

    многослойных печатных плат, оптимальном управлении транспортными

    потоками и в ряде других областей.

 

         Предположим, для конкретности, что исходный  граф  Q(VG,DG)

    состоит из 9 вершин, что изображено на рис.1.

         На  этом  графе выделим начальную V1 и конечную V8 вершины.

    Топологию этого графа можно представить в виде следуюего  набора

    фрагментов. Они помещаются в раздел знаний с именем GRFF:

 

    DUG(V2,V5/D25)   DUG(V4,V8/D48)   DUG(V1,V3/D13)

    DUG(V3,V4/D34)   DUG(V1,V5/D15)   DUG(V2,V3/D23)

    DUG(V3,V6/D36)   DUG(V5,V7/D57)   DUG(V6,V8/D68)

    DUG(V5,V4/D54)   DUG(V5,V6/D56)   DUG(V8,V9/D89)

    DUG(V7,V9/D79)   DUG(V4,V9/D49)

 

    ------  D13   ------  D34  ------  D49  ------   D79

    !    !------->!    !------>!    !------>!    !<--------

    ! V1 !        ! V3 !       ! V4 !       ! V9 !        !

    !    !     -->!    !    -->!    !       !    !        !

    ------    /   ------   /   ------       ---.--        !

        \    /D23    \    /D54     \          /!\         !

         \  /         \  /          \          !D89       !

          \/           \/            \         !          !

          /\           /\             \        !          !

         /  \D15      /  \D36          \D48    !          !

    ------   \    ------  \    ------   \   ------      ------

    !    !    --->!    !   --->!    !    -->!    !      !    !

    ! V2 !  D25   ! V5 !  D56  ! V6 !  D68  ! V8 !      ! V7 !

    !    !------->!    !------>!    !------>!    !      !    !

    ------        ------       ------       ------      --.---

                   !                                     /!\

                   !                D57                   !

                   ----------------------------------------

 

 

                              рис. 5.1

 

         Здесь каждый фрагмент имеет имя отношения DUG (связь по ду-

    ге). На первом аргументном месте стоит имя вершины, из которой ис-

    ходит дуга, на втором - имя вершины, в которую входит дуга. На

    третьем аргументном месте после символа "/" (в соответствии с пра-

    вилами записи на РСС) стоит имя фрагмента. Оно соответствует ду-


 

                              - 54 -

        

    ге. Такое представление графа Q(VG,DG) компактно, что существенно

    в тех случаях, когда размерность графа Q велика, а матрица инци-

    дентности вершин редкая.

         Взаимное расположение фрагментов типа DUG(...) в разделе GR-

    FF не играет никакой роли. При изменении состава вершин и дуг

    граф легко модифицировать путем добавления или исключения фрагмен-

    тов, что может осуществляться в произвольном порядке.

 

         Будем решать эту задачу "волновым способом". Сущность этого

    способа  состоит  в  следующем.  Начальная  и  конечная  вершины

    метятся специальными метками.  Пусть  это  MET1  и  MET2.  Затем

    выделяется  "окрестность" начальной вершины, т.е. выделяются все

    вершины, в которые входят дуги, исходящие из начальной  вершины.

    Все   выделенные   вершины   также  помечаются  меткой  MET1,  а

    связывающие дуги - меткой MD2.  На  следующем  шаге  только  что

    выделенные   вершины   объявляются  начальными.  Теперь  вешины,

    входящие в их окрестности,помечаются меткой MET1.  Распространяя

    такую  "волну"  слева  направо  по  графу,  помечаем  весь граф.

    Аналогичную  "волну",  но  уже  справа  налево,  организуем   из

    конечной  вершины,  помечая  при  этом соответствующие вершины и

    дуги меткой MET2 и MD2, соответственно. Очевидно, что  те  дуги,

    которые  оказались  помеченными  сразу  двумя  метками MD1 и MD2

    будут принадлежать множеству путей LG транзитивного замыкания.

 

         Продукция,  поддерживающая  распространение  "волны"  слева

    направо  (начиная  от  вершины,  помеченной  меткой MET1), имеет

    следующий вид:

 

    MD1P:IF MET1*(X1) DUG(X1,X2/X3) N:MD1(X3) THEN MD1(X3)

                                                   T!:MET1*(X2) ;

        

        

         Пусть начальной и конечной являются вершины V1 и  V8,  т.е.

    созданы  фрагменты  MET*(V1)  и  MET*(V8). Tак как  в ОП имеется

    фрагмент MET1*(V1),то применение  данной  продукции  приведет  к

    означиванию   X1   именем  вершины  V1.  Затем  результат  этого

    означивания будет использован при  попытках  означивания  X2  во

    втором   фрагменте,   т.е.   в   DUG(V1,X2/X3).   В   результате

    многократных попыток поиска в ОП в разделе  GRFF  будет  найдено

    два  фрагмента,  содержащих  на  первом  месте  вершину V1 - это

    DUG(V1,V3/D13),  DUG(V1,V5/D15).  Выбрав   первый   из   них   -

    DUG(V1,V3/D13), система присвоит X2 значение V3, а X3 - значение

    D13.  Результаты  означивания  переменных  левой части продукции

    поступают в ее правую  часть,  на  основе  которой  в  ОП  будет

    создано  два  новых фрагмента: MET1*(V3) и MD1*(D13). Применение

    этой  же  продукции  к  фрагменту  DUG(V1,V5/D15),  приведет   к

    образованию еще двух новых фрагментов- MET1*(V5) и MD1*(D15).При

    появлении фрагментов- MET1*(V3) или MET*(V5), продукция MD1P как

    бы получит новую "пищу" и применится вновь и т.д. Пока  за  счет

    ее правой части будут создаваться все новые фрагменты.

 

         Продукция,  поддерживающая построение "волны" справа налево

    (начиная от вершины, помеченной  меткой  MET2*) имеет  следующий

    вид:

 


 

                              - 55 -

        

    MD2P:IF MET2*(X1) DUG(X2,X1/X3) N:MD2(X3) THEN MD2(X3)

        

                                                   T!:MET2*(X2) ;

 

         Применяется  она точно так же, как и продукция MD1P, только

    при  ее  применении  будут  создаватся  фрагменты  MET2*(...)  и

    MD2*(...).  Отметим   также,  что  переменная  X1  во  фрагменте

    DUG(X2,X1/X3) в продукции  MD2P  стоит  на  втором  месте,  а  в

    соответствующем  фрагменте  продукции  MD1P  -  на  первом.  Это

    связано с ориентацией  дуг  графа  Q.  Продукция  MD2P  закончит

    применяться   после   того,  как  перестанут  создаваться  новые

 

    фрагменты.

         Продукция,  обеспечивающая  выдачу  на  экран   результатов

    решения, имеет следующий вид:

 

    MD3P:IF UR2 D:MD1(X1) D:MD2(X1) DUG(X2,X3/X1)

    THEN M**(X1) T1:COL(5,14) B:A(" Дуга из ",X2," в ",X3) T1:CLR* ;

    MD4P:IF UR2 N:M**(X1)

    THEN M**(MD) BK T1:COL(5,11) B:A(" Нет решения ") T1:CLR*;

 

 

         Продукция  ищет  в  ОП фрагменты MD1(...), созданные первой

    продукцией. В процессе применения второй продукции переменной X1

    присваиваются определенные значения, например,V5. Тогда в ОП уже

    ищется фрагмент MD2(V5).

 

         Если такой фрагмент найден, то продукция станет применимой,

    что приведет к выдаче имени дуги на экран.

 

         Ранее было показано, что для успешной работы продукций MD1P

    и MD2P необходимо,  чтобы  были  указаны  начальная  и  конечная

    вершины,то есть в ОП были фрагменты MET1*(...) и MET2*(....).Это

    осуществляется следующей продукцией:

 

 

    PAT1:IF UR1 D:PATH(X1,X2) THEN T!:MET1*(X1) T!:MET2*(X2) ;

 

 

         Фактически с помощью нее поддерживаются  команды,  например

    PATH(V1,V8),   требующая   найти  транзитивное  замыкание  между

    вершинами V1 и V8.

         В конечном итоге в рабочем состоянии  продукции имеют  сле-

    дующий  вид:

 

 

    BEG(/1+)

    TRANZ: IF THEN B:IN(GRFF)  T!:VIV

                BK B:A("Введите исходные данные > ") B:IN()

                T!:UR1 T!:UR2 B:IN() B:DELFR(@@);

 

    VIV:IF  DUG(_,_/X3) THEN BK B:A(X3);

 

    MD1P:IF MET1*(X1) DUG(X1,X2/X3) N:MD1(X3) THEN MD1(X3) T!:MET1*(X2) ;

    MD2P:IF MET2*(X1) DUG(X2,X1/X3) N:MD2(X3) THEN MD2(X3) T!:MET2*(X2) ;

    MD3P:IF UR2 D:MD1(X1) D:MD2(X1) DUG(X2,X3/X1)


 

                              - 56 -

        

         THEN M**(X1) T1:COL(5,14) B:A(" Дуга из ",X2," в ",X3) T1:CLR* ;

    MD4P:IF UR2 N:M**(X)

          THEN M**(MD) BK T1:COL(5,11) B:A(" Нет решения ") T1:CLR*;

    PAT1:IF UR1 D:PATH(X1,X2) THEN T!:MET1*(X1) T!:MET2*(X2) ;

 

    END(/2+) @BL(1-,2-)

 

    Теперь  достаточно  войти в главное меню системы, выбрать пункт

    "решение задачи",ввести имя  файла, в   котором   содержатся

    знания о данной задаче и указать имя первой продукции(TRANZ),с

    которой начинается  решение.

 

        5.2. Вывод на "И-ИЛИ" графе

 

         Для    широкого   круга   применений   (сапр,   диагностика

    заболеваний, неисправностей оборудования и  т.п.)  перспективным

    представляется  использование  принципов  логического  вывода, а

    также иерархического пространства состояний,  заданного  в  виде

    графа "и-или". Пример такого графа показан на рис.2.

 

 

     INIT      INIT      INIT      INIT      INIT      INIT

    ------    ------    ------    ------    ------    ------

    !    !    !    !    !    !    !    !    !    !    !    !

    ! V0 !    ! V1 !    ! V2 !    ! V3 !    ! V4 !    ! V5 !

    !    !    !    !    !    !    !    !    !    !    !    !

    ------    ------    ------    ------    ------    ------

     !  \        /         \        /          \        /

     !   \      /           \      /            \      /

     !    \-и--/             \-и--/              \-и--/

     !    -\--/-             -\--/-              -\--/-

     !    !    !             !    !              !    !

     !    ! V6 !             ! V7 !              ! V8 !

     !    !    !             !    !              !    !

     !    ------             ------              ------

     !          \            /     \            /  !

     !           \          /       \          /   !

     !            \        /         \        /    !

     !             \      /           \--и---/     !

     !              \----/             \----/      !

     !              !    !             !    !      !

     !  ----------->! V10!             ! V9 !      !

     !  !           !    !             !    !

     !  !           ------             ------      !

     !  !              !                AIM        !

    ------             !                           !

    !    !             -----------------------------

    ! V11!

    !    !

    ------

     AIM

                            Рис. 5.2

 

         В  этом  графе  верхние  ("исходные") вершины соответствуют

    исходным фактам, сообщаемым пользователем. На рис.2 они помечены

    термином "INIT".  Вершины  других  уровней  графа  соответствуют


 

                              - 57 -

        

    посылкам,  которые вытекают из этих фактов. Самые нижние вершины

    графа,  помеченные   термином   "AIM",   соответствуют   целевым

    состояниям  или  конечным  посылкам. Между вершинами графа могут

    существовать связки как типа "И" (на рис.  2  они  отмечены  как

    "--и--"),   так  и  типа  "ИЛИ".  Логический  вывод  сводится  к

    передвижению меток "истинности" от одних вершин графа к другим.

         В общем случае задача  вывода  может  носить  вероятностный

    характер.  С  каждой  входной  вершиной  связывается вероятность

    появления соответствующего факта. В процессе вывода (перехода из

    состояния  в  состояние)  осуществляется  подсчет  вероятностей,

    например,  на  основе  аппарата нечетких множеств или по формуле

    Байеса.

                             

         Средства решения задачи вводятся в систему ДЕКЛАР  так  же,

    как  для  задачи  п.  5.1. Рассмотрим принципы ее представления.

    Пусть дан граф Q(VG,DG), где VG - множество вершин  V(I)  графа,

    V(I) > VG, I=1,2,...,N, N - число вершин графа, а DG - множество

    ориентированных  дуг D(I,J), соединяющих вершины графа, D(I,J) >

    DG, I=1,2,...,N, J=1,2,...,N, I не равно J.  Граф,  изображенный

    на  рис.2,  записывается  на  языке РСС в виде следующего набора

    фрагментов:

 

    $(GR1)

    BEG(GR1)

    DAND(V0,V6)  DAND(V1,V6)  DOR(V2,V7)  DOR(V3,V7)

    DAND(V4,V8) DAND(V5,V8)  DAND(V8,V9)  DAND(V6,V9)

    DAND(V7,V10) DAND(V8,V10) DOR(V10,V11)  DOR(V0,V11)

    DOR(V10,V11)  DOR(V0,V11)

    INIT(V0)  INIT(V1)  INIT(V2)  INIT(V3)  INIT(V4) INIT(V5)

    AIM(V9)  AIM(V11)

   END(GR1)

 

         Из рассмотрения рис.5.2 видно, что в  процессе  логического

    вывода  состояние V7 может быть объявлено истинным, если истинны

    состояния V2 или V3, а состояние V6 - если истинны состояния  V0

    и  V1.  Фрагменты  DOR  и  DAND,  связывающие  вершины  графа Q,

    представляют логические связки типа "ИЛИ" и "И". Верхние вершины

    помечены Mетками "INIT", а целевые вершины - метками "AIM".

         Вначале в режиме  меню-анкет  (который  реализуется  своими

    средствами)  осуществляется  ввод  исходных фактов. В результате

    верхние  вершины  отмечаются  специальной  меткой  истинности  -

    TRUE(...).   Логический   вывод  сводится  к  продвижению  меток

    истинности по ветвям дерева (графа Q) до тех пор, пока не  будет

    достигнута одна из целевых вершин. Это осуществляется следующими

    продукциями:

 

    UL1:ЕСЛИ US1 TRUE(X1) DOR(X1,X2) ТО TRUE(X2) ;

 

    UL2:ЕСЛИ US1 TRUE(X1) DAND(X1,X2) N:[DAND(X3,X2) N:TRUE(X3)]

      TO TRUE(X2) ;

 

    UL3:ЕСЛИ US2 AIM(X1) TRUE(X1) N:MT(X1) TO

          MT(X1) T1:TERZ(X1) ;

 

         Продукция  UL1  обеспечивает продвижение метки TRUE по дуге

    типа "ИЛИ". Если, например, в ОП  после  ввода  исходных  фактов


 

                              - 58 -

        

    оказался фрагмент TRUE(V2), то при применении продукции UL1 в ОП

    будет  осуществляться  поиск  фрагментов  типа DOR, у которых на

    первом аргументном месте стоит вершина V2. При нахождении такого

    фрагмента происходит означивание  переменной  X2.  В  частности,

    таким  фрагментом  является  DOR(V2,V7).  Поэтому  X2  означится

    вершиной V7. Результат этого  означивания  передается  в  правую

    часть. Будет сформирован фрагмент TRUE(V7).

         Продукция  UL2  обеспечивает продвижение метки TRUE(...) по

    дуге "И". В  левую  часть  входит  конструкция  N:[DAND  (X3,X2)

    N:TRUE  (X3)], Kоторая читается так: "Нет такой дуги, ведущей из

    вершины X3 в вершину X2, у которой не было бы метки TRUE". Иначе

    говоря, в вершину X2 должны входить только  дуги,  исходящие  из

 

    вершин, отмеченных меткой истинности.

         Продукция  UL3  проверяет  для  целевой вершины (помеченной

    меткой AIM), есть ли на ней метка  TRUE.  В  результате  на  эту

    вершину  ставится  метка  MT(...).  Это  делается  только  в том

    случае, если такой метки ранее не было. Для этого в левую  часть

    введено   отрицание  N:MT(X1).  На  каждую  вершину  может  быть

    поставлено не более  одной  метки  MT(...).  Далее  активируется

    системная продукция с индикатором TERZ(X1), обеспечивающая вывод

    на  экран  файла  с именем X1. В этот файл можно поместить текст

    или графический образ целевого состояния.

         В процессе вывода несколько целевых вершин  могут  получить

    метки  TRUE.  Если  в  этом  случае  необходимо выдать сообщение

    "обнаружено  множество  решений",  то   используется   следующая

    продукция:

 

         UL16:ЕСЛИ US2 AIM(X) AIM(X1) B:#(X,X1) D:TRUE(X) D:TRUE(X1)

    TO ВК B:A("Обнаружено множество решений");

 

         Эта  продукция применима только в случае, когда имеются две

    целевые  вершины,  помеченные  меткой  TRUE.  Эти   метки   TRUE

    удаляются, а за счет правой части продукции осуществляется вывод

    на экран с новой строки (ВК) сообщения, текст которого записан в

    кавычках.

         Пусть  в процессе вывода ни одна целевая вершина не получит

    метку TRUE.  Тогда  необходимо  вывести  сообщение  "Решение  не

    найдено". Это делается следующей продукцией:

 

         UL17:ЕСЛИ  US2  N:[AIM(X1)  TRUE(X)]  TO BK B:A("Решения не

    найдено")

         Продукции, осуществляющие ввод в систему исходных фактов от

    пользователя   и   объяснение   полученных   результатов   будут

    рассмотрены в п.5.3.

 

 

       5.3. Реализация компоненты объяснений

 

 

         Для объяснения результатов,  полученных  после  логического

    вывода,  используется  идея  "обратного"  прохода  от  вершин  к

    "исходным", т.е. соответствующим исходным  посылкам  (данным)  и

    последующего   объясняющего   прохода.  Вначале  метка  MT(...),

    которой был отмечен результат,  передвигается  снизу  вверх  (по

    вершинам,  отмеченным  TRUE). Таким образом выделяются пути , по


 

                              - 59 -

        

    которым должно идти объяснение. Для этого служат продукции:

 

     UL4:ЕСЛИ VV1 MT(X2) DAND(X1,X2) TO MT(X1) ;

 

     UL5:ЕСЛИ VV1 MT(X2) DOR(X1,X2) TRUE(X1) TO MT(X1) ;

         В результате их применения каждая  вершина  "И-ИЛИ"  графа,

    принявшая  участие  в  достижении  цели,  получает "объясняющую"

    метку  -  MT(...).  Сами  объяснения  хранятся   в   специальных

    фрагментах  (связанных  с  вершинами  "И-ИЛИ" графа) и имеют вид

    строковых констант. Объяснения выдаются в  процессе  еще  одного

    прохода  ("объясняющего")  -  сверху  вниз,  но  уже  по  меткам

    MT(...). По каждой вершине,выделяемой в процессе такого прохода,

    выдаются тексты "посылок" и объяснений. Например, при переходе к

    вершине VI по дуге типа DAND выдаются:

 

         - тексты (посылок), связанные с вершинами (VJ), от  которых

           идут  дуги  DAND  к   VI.   Связь   задается   фрагментом

           FACT(VJ,"<текст>");

 

         - текст объяснения, который связан с VI с помощью фрагмента

           EXPL(VI,"<текст>");

 

         - текст результата. Для его  выделения  используется

           фрагмент FACT(VI,"<текст>").

 

         Такая выдача управляется следующей продукцией:

 

     UL7:ЕСЛИ VV2 TRUE(X1) INIT(X1) MT(X1) DAND(X1,X2) MT(X2)

      TO BK B:A("Я знаю ответ") MAND(X2) T:VVV2 INIT(X2)

      B:A("Нажмите "ВК"") B:G(_) ;

 

         Продукция устанавливает метки MAND на те вершины, на основе

    которых  необходимо  выдать  объяснения,  и  передает управление

    следующей продукции (с индикатором VVV2):

 

 

    UL8:ЕСЛИ VVV2 MAND(X2) DAND(X1,X2) D:MT(X1) FACT(X1,X3)

      TO BK B:A(X3) ;

 

         Эта продукция "осматривает" вершины, от которых  идут  дуги

    DAND  к исходной вершине (X2) и выдает на экран связанные с ними

    тексты посылок. Текст объяснения выдается продукцией:

 

         UL9:ЕСЛИ VVV2 D:MAND(X1) EXPL(X1,X3) FACT(X1,X4)

      TO BK B:A(" Мной применено правило:",X3)

      B:A(" В результате получено",X4);

 

         Аналогичные тексты объяснений, но для  вершин  типа  "ИЛИ",

    выдаются другой продукцией:

 

    UL6:ЕСЛИ VV2 TRUE(X1) D:MT(X1) INIT(X1)  DOR(X1,X2)  MT(X2)

 

      FACT(X1,X3) EXPL(X2,X4)  FACT(X2,X5) TO BK

      B:A(" Я знаю, что:",X3) B:A(" мной применено правило:",X4)

      B:A(" в  результате получено:",X5) INIT(X2)

      B:A("нажмите BK") B:G();


 

                              - 60 -

 

         Эта  продукция  (как  и UL7) применяется только к вершинам,

    отмеченным  MT.  Рассмотрим  пример  ее  применения.  Пусть  при

    означивании  переменная  X1 приняла значение V1, а X2 - значение

    V6. Пусть в ОП имеются три фрагмента:

 

         FACT(V1,"число абонентов более 40,")

         EXPL(V4,"Если число абонентов в системе более 40 и они уда-

         лены на расстояния более 200 м...")

         FACT(V6,"требуется ЭВМ телеобработки абонентов").

 

         Тогда в  результате  применения  продукции  UL6  на  экране

    появится следующий объясняющий текст:

 

         "Я знаю, что:

 

         число абонентов в системе более 40, мной применено правило:

 

         Если  число  абонентов  в системе более 40 и они удалены на

    расстояния более 200 м...

 

       В результате получено:

 

         требуется ЭВМ телеобработки абонентов"

 

         Последовательность объяснений  определяется  метками  INIT,

    которые  "перевешиваются"  продукциями  UL7  и  UL6  в  процессе

    "объясняющего" прохода -  сверху-вниз  (движение  осуществляется

    только  через  вершины, отмеченные меткой MT). При этом метки MT

    для вершин, уже получивших объяснения, уничтожаются.

                                                          

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        

        


 

                              - 61 -

        

        

                        Приложение 1.

                        

    

    

                Встроенные фрагменты

                ____________________

        

        

    

         Перед  встроенными  фрагментами  в   продукциях   ставится

   оператор  В:,  например:  IF  B:I(X)  THEN  B:A(X)  B:G();.  при

   обращении к встроенному  фрагменту  выполняется  соответствующая

   "встроенная  функция".  Результат может быть успешным ("истина")

   или  безуспешным  ("ложь").   При   этом   могут   осуществяться

   означивания  переменных.  При безуспешном выполнении встроенного

   фрагмента,  стоящего  в   левой   части   продукции,   продукция

   обьявляется  неприменимой.  Безуспешное  выполнение  встроенного

   фрагмента, стоящего в правой части продукции, вызывает окончание

   процесса ее применения.

         Для описания встроенных  фрагментов  будут  использоваться

   следующие обозначения:

 Кi    - константы или переменные, означенные константами;

 Цi    - целые числа или переменные, означенные этими числами;

 _     - символ "_" (подчеркивание) или переменные, означенные этим

         символом;

 Xi    - неозначенные переменные;

 Пi    - переменные, означенные или неозначенные;

 Сi    - символы или переменные, означенные этими символами;

 Ai    - переменные (означенные или неозначенные),константы,символ "_";

 FNAME - строковые константы - имена файлов;

 RAS   - строковые константы - расширения файлов;

 RNAME - строковые константы - имена разделов.

 

=======+=============+========+===========+===========================

Номер, I  Допустимые I Резуль-IВыполняемыеI      Название

  имя  I   варианты  I   тат: I функции:  I   и краткое описание

встроен- означиваний IуспешныйI означива- I   функционирования

 ного  I  аргументов I(истина), ние пер., I   встроенного фрагмента

фраг-  I встроенного I безус- I изменение I

 мента I  фрагмента  I пешный I сем.сети  I


 

1      I             I        I          I

   =   I =(К1,К1)    I истина I          I

       I =(_,_)      I истина I          I

равен- I =(K1,K2)    I ложь   I          I

ство   I =(_,К1)     I ложь   I          I

       I =(К1,_)     I ложь   I          I

       I =(X1,X2)    I ложь   I          I

       I =(К1,X1)    I истина I означ.X1 I Переменная X1 будет означена

       I =(X1,К1)    I --//-- I ---//--- I константой К1.

       I =(_,X1)     I истина I означ.X1 I Переменная X1 будет означена

       I =(X1,_)     I --//-- I ---//--- I символом "_" (подчеркиван.)

       I             I(ложь)  I и т.д.   I

-------+-------------+--------+----------+----------------------------

                             -62 -

     

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

2      I             I        I          I

   #   I #(К1,К1)    I ложь   I          I

       I #(_,_)      I ложь   I          I

неравен- #(X1,X2)    I ложь   I          I

ство   I #(K1,K2)    I истина I          I

       I #(_,К1)     I истина I          I

       I #(К1,_)     I истина I          I

       I #(К1,X1)    I истина I          I

       I #(X1,К1)    I истина I          I

       I #(_,X1)     I истина I          I

       I #(X1,_)     I истина I          I

-------+-------------+--------+----------+----------------------------

3      I             I        I          I

   >   I >(Ц1,Ц2)    I истина,I          I Результат будет "истина",

       I             Iложь(и/л)          I если Ц1 больше Ц2,

больше I             I        I          I где Ц1 и Ц2  целые числа.

       I в остальн.  I ложь   I          I

       I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

4      I             I        I          I

   >=  I >=(Ц1,Ц2)   I и/л    I          I Результат будет "истина",

       I             I        I          I если Ц1 больше или равно Ц2,

больше I             I        I          I где Ц1 и Ц2  целые числа.

или    I в остальн.  I ложь   I          I

равно  I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

5      I             I        I          I

   <   I  <(Ц1,Ц2)   I и/л    I          I Результат будет "истина",

       I             I        I          I если Ц1 меньше Ц2,

меньше I             I        I          I где Ц1 и Ц2  целые числа.

       I в остальн.  I ложь   I          I

       I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

6      I             I        I          I

   <=  I <=(Ц1,Ц2)   I и/л    I          I Результат будет "истина",

       I             I        I          I если Ц1 меньше или равно Ц2,

меньше I             I        I          I где Ц1 и Ц2  целые числа.

или    I в остальн.  I ложь   I          I

равно  I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

7      I             I        I          I

   +   I +(Ц1,Ц2,П3) I истина I означива-I Переменная П3 получает зна-

       I             I        I ется     I чение Ц1+Ц2 (независимо от

сложитьI             I        I(означ.)П3I своего прежнего значения).

       I в остальн.  I ложь   I          I

       I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

8      I             I        I          I

   *   I *(Ц1,Ц2,П3) I истина I означ.П3 I Переменная П3 получает зна-

       I             I        I          I чение Ц1*Ц2.

умно-  I             I        I          I

 жить  I в остальн.  I ложь   I          I

       I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

                            - 63 -

    

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

9      I             I        I          I

   M-  I M-(Ц1,Ц2,П3)I истина I означ.П3 I Переменная П3 получает зна-

       I             I        I          I чение Ц1-Ц2.

вычестьI             I        I          I

       I в остальн.  I ложь   I          I

       I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

10     I             I        I          I

   DIV I DIV(Ц1,Ц2,П3) истина I означ.П3 I Переменная П3 получает зна-

       I             I        I          I чение Ц1/Ц2.

целочис-             I        I          I

ленное I в остальн.  I ложь   I          I

делениеI    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

11     I             I        I          I

   +%  I +%(Ц1,Ц2,П3)I истина I означ.П3 I Переменная П3 получает зна-

       I             I        I          I чение Ц1+Ц2-((Ц1*Ц2)/100).

сложе- I             I        I          I

 ние   I             I        I          I

процен-I в остальн.  I ложь   I          I

 тов   I    случаях  I        I          I

-------+-------------+--------+----------+----------------------------

12     I             I всегда I          I

  SELF I SELF(П1,П2) I истина I означ.П2 I Переменная П2 означивается

       I             I        I          I именем переменной П1

означи-I             I        I          I из продукции.

 вание I             I        I          I

именем I             I        I          I

перемен-             I        I          I

 ной   I             I        I          I

-------+-------------+--------+----------+----------------------------

13     I             I всегда I управляет

   PAR I             I истина I трассир. I

       I             I        I и т.п.   I

управ- I PAR("1","0")I        I          I Отключает трассировку.

 ление I PAR("1","2")I        I          I Включает простую трассиров.

режимомI PAR("1","5")I        I          I Включает полную трассировку.

работы I PAR("3","0")I        I          I Отключает разметку фрагмен-

       I             I        I          I   тов при работе IN().

       I PAR("3","5")I        I          I Включает разметку фрагментов

       I             I        I          I   при работе IN().

       I PAR("4","0")I        I          I Включает блокировку.

       I PAR("4","5")I        I          I Отменяет блокировку.

-------+-------------+--------+----------+----------------------------

14     I             I всегда I означ.П2 I Переменная П2 получает зна-

  KARG I KARG(K1,П2) I истина I          I чение равное количеству ар-

       I             I        I          I гументных мест во фрагменте К1

       I             I        I          I с именем К1.

-------+-------------+--------+----------+----------------------------

                            - 64 -

    

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

15     I             I        I          I

   FR  I             I        I          I

       I             I        I          I

выделе-I FR(X1,X2,X3)I ложь   I          I

 ние   I FR(X1,X2,K3)I и/л    I          I Выделение фрагментов,

компо- I             I        I          I содержащих К3. X1 означива-

 нент  I             I        I          I ется именем фрагмента, а

       I             I        I          I X2 - номером позиции, где

       I             I        I          I расположена К3.

       I             I        I          I

       I FR(X1,Ц2,X3)I ложь   I          I

       I FR(X1,Ц2,К3)I и/л    I          I Выделение фрагментов,

       I             I        I          I у которых в позиции Ц2

       I             I        I          I находится К3.

       I             I        I          I

       I FR(К1,X2,X3)I        I          I Выделение компонент фрагмен-

       I             I        I          I та с именем К1. X2 означи-

       I             I        I          I вается номером позиции, а

       I             I        I          I X3 - что на нем стоит.

       I             I        I          I

       I FR(К1,X2,K3)I        I          I Поиск во фрагменте К1

       I             I        I          I позиции, на которой стоит К3.

       I             I        I          I

       I FR(К1,Ц2,X3)I        I          I Выделение в К1 аргумента,

       I             I        I          I стоящего на позиции Ц2.

       I             I        I          I

       I FR(К1,Ц2,K3)I и/л    I          I Проверка того, что во фраг-

       I             I        I          I менте К1 в позиции Ц2

       I             I        I          I стоит К3.

-------+-------------+--------+----------+----------------------------

16     I             I всегда I изменяет I Во фрагменте с именем К1

   SET I SET(K1,Ц2,К3) истина I в ОП     I изменяет аргумент в пози-

       I             I        I сем.сеть I ции с номером Ц2 и делает

       I             I        I          I его равным К3.

-------+-------------+--------+----------+----------------------------

17     I             I всегда I изменяет I

   UN  I  UN(К1,K2)  I истина I в ОП     I Заменяет во всех фрагментах,

слияниеI             I        I сем.сеть I находящихся в ОП, К2 на К1.

окрест-I             I        I          I

 ностейI             I        I          I

-------+-------------+--------+----------+----------------------------

18     I             I всегда I изменяет I Добавляет в сем.сеть фраг-

   NP  I  NP()       I истина I в ОП     I мент @@(FFF,@@), где FFF -

       I             I        I сем.сеть I имя последней примененной

       I             I        I          I продукции.

-------+-------------+--------+----------+----------------------------

19     I             I всегда I          I Присваивает переменной П1

  FRI  I FRI(П1)     I истина I означ.П1 I значение,равное размеру сво-

       I             I        I          I бодной памяти для сем.сети.

-------+-------------+--------+----------+----------------------------

20     I             I всегда I изменяет I Порождает новую вершину в

  NEW  I NEW(П1)     I истина I в ОП     I сем.сети и переменной П1

       I             I        I сем.сеть,I присваивает ее код.

       I             I        I означ.П1 I

-------+-------------+--------+----------+----------------------------

                            - 65 -

    

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

21     I             I всегда I вывод на I На экран (или диск)

   A   I  A(A1)      I истина I диск или I выводятся A1,A2,A3,A4,A5.

вывод  I  A(A1,A2)   I        I на экран I  Например, это могут быть

на экран  A(A1,A2,A3)         I          I строковые константы (они

(или   I  A(A1,A2,A3,A4)      I          I распечатаются без двойных

  диск)I  A(A1,A2,A3,A4,A5)   I          I кавычек).

-------+-------------+--------+----------+----------------------------

22     I             I всегда I вывод на I

    F  I F(FNAME,RNAME) истинаI экран    I Выводит на экран содержимое

выдача I             I        I          I раздела RNAME из текстового

 меню  I             I        I          I файла FNAME.Z.

-------+-------------+--------+----------+----------------------------

23     I             I всегда I вывод на I

  OUT  I             I истина I диск и   I

       I             I        I на экран I

вывод  I OUT(FNAME,K2,K3)     I          I Вывод из ОП зоны, т.е. всего

из ОП  I             I        I          I что находится между фрагмен--

указан-I             I        I          I тами с именами К2 и К3, в

 ной   I             I        I          I файл FNAME.Z.

зоны   I             I        I          I

       I OUT(FNAME,K2,K3,1)   I          I Вывод из ОП зоны (от фраг-

       I             I        I          I мента с именем К2 до К3, не

       I             I        I          I включая их) в файл FNAME.Z.

       I             I        I          I

       I OUT(_,K2,K3)         I          I Вывод из ОП зоны (от К2 до

       I             I        I          I К3) на экран или в текущий

       I             I        I          I файл, открытый с помощью

       I             I        I          I REW(...).

       I             I        I          I

       I OUT(_,K2,K3,1)       I          I Вывод из ОП зоны (от фраг-

       I             I        I          I мента с именем К2 до К3, не

       I             I        I          I включая их) на экран или в

       I             I        I          I текущий файл, открытый с

       I             I        I          I помощью REW(...).

-------+-------------+--------+----------+----------------------------

24     I             I всегда I вывод на I Выводит из ОП на диск в фаил

  OUT1 I OUT1(FNAME) I истина I диск и   I FNAME.ZNN всю сем.

       I             I        I          I сеть в закодированной форме.

-------+-------------+--------+----------+----------------------------

25     I             I всегда I          I

  REW  I             I истина I          I

       I REW()       I        I          I Настраивает фрагменты вывода

управ- I             I        I          I (OUT, A) на экран.

 ление I             I        I          I

выводомI REW(FNAME,RAS)       I          I Настраивает фрагменты вывода

       I             I        I          I (OUT, A) на запись в файл

       I             I        I          I FNAME.RAS. старый файл с тем

       I             I        I          I же именем - уничтожается.

       I             I        I          I

       I REW(FNAME,RAS,STR)   I          I Настраивает фрагменты вывода

       I             I        I          I (OUT, A) на запись в файл

       I             I        I          I FNAME.RAS. выведенная инфор-

       I             I        I          I мация записывается после

       I             I        I          I контекстной строкой STR.

       I             I        I          I если такой строки нет, то -

       I             I        I          I запись в конец файла.

-------+-------------+--------+----------+----------------------------

                            - 66 -

    

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

26     I             I всегда I          I

  TT   I             I истина I          I

       I TT(TRUE)    I        I          I Настраивает фрагменты вывода

управ- I             I        I          I (оUT, A) на экран.

 ление I             I        I          I

выводомI TT(FALSE)   I        I          I Если вывод был переключен на

       I             I        I          I экран с диска с помощью

       I             I        I          I TT(TRUE), то переключает его

       I             I        I          I обратно на диск.

-------+-------------+--------+----------+----------------------------

27     I             I        I          I

  EOLN I EOLN()      I истина,I          I Результат будет "истина",

проверка             I ложь   I          I когда головка считывания

конца  I             I (и/л)  I          I находится на конце строки.

строки I             I        I          I

-------+-------------+--------+----------+----------------------------

28     I             I всегда I изменяет I Устанавливает головку счи-

    G  I  G()        I истина I состояниеI тывания на следующий символ

сдвиг  I             I        I буфера   I в буфере входного текста

головкиI             I        I вх.текстаI (при вводе с клавиатуры или

считывания           I        I          I из файла).

-------+-------------+--------+----------+----------------------------

29     I             I всегда I изменяет I Удаляет до конца строки все

   LN  I  LN()       I истина I состояниеI символы из буфера входного

чистка I             I        I буфера   I текста, расположенные пра-

буфера I             I        I вх.текстаI вее головки считывания.

входного             I        I          I

текста I             I        I          I

до конца             I        I          I Оставляет головку считыва-

строки I             I        I          I ния на прежней позиции.

-------+-------------+--------+----------+----------------------------

30   I I             I        I означива-I X1 означивается символом,

ввод   I I(X1)       I истина I ется     I на который указывает

одного I             I        I(означ) X1I головка считывания.

символаI             I        I          I

(с кла-I I(C1)       I истина,I          I Результат будет "истина",

виатурыI             I ложь   I          I когда головка указывает на

или из I             I (и/л)  I          I символ С1, и "ложь" в про-

файла) I             I        I          I тивном случае.

-------+-------------+--------+----------+----------------------------

31     I             I всегда I изменяет I

   IN  I             I истина I в ОП     I

       I             I        I сем.сеть I

ввод   I   IN()      I        I          I Ввод с клавиатуры или из

в ОП   I             I        I          I файла фрагментов, продукций

выраже-I             I        I          I и отдельных констант Ki.

 ний,  I             I        I          I Они "метятся" с помощью

записан-             I        I          I фрагментов вида:   @@(Ki).

ных на I             I        I          I

декл   I IN(FNAME)   I        I          I Ввод из файла FNAME.Z

       I             I        I          I всех фрагментов

       I             I        I          I и продукций, не оформленных

       I             I        I          I в виде раздела знаний.

       I             I        I          I

       I IN(FNAME,RAZD)       I          I Ввод раздела RAZD из файла

       I             I        I          I FNAME.Z .

-------+-------------+--------+----------+----------------------------

                            - 67 -

    

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

32     I             I всегда I          I Настраивает фрагменты ввода

   R   I   R(FNAME)  I истина I          I IN, G на файл FNAME.Z

управ- I             I        I          I

 ленниеI             I        I          I

вводом I             I        I          I

текста I             I        I          I

-------+-------------+--------+----------+----------------------------

33     I             I всегда I изменяет I

   C   I             I истина I в ОП     I

удале- I             I        I сем.сеть I

 ние   I    C(K1)    I        I          I Удаление из ОП всех фраг-

фраг-  I             I        I          I ментов, записанных после

 ментовI             I        I          I фрагмента с именем К1

       I             I        I          I (вместе с ним).

       I             I        I          I

       I    C(K1,H)  I        I          I Удаление из ОП всех фраг-

       I             I        I          I ментов, записанных после К1,

       I             I        I          I кроме фрагментов вида:

       I             I        I          I ...(.../KK) H(KK), где KK -

       I             I        I          I имя фрагмента.

-------+-------------+--------+----------+----------------------------

34     I             I всегда I изменяет I

   DEL I             I истина I в ОП     I

удале- I  DEL(K1,K2) I        I сем.сеть I Удаляет в ОП все те фрагмен-

 ние   I             I        I          I ты от К1 до К2 (зону), у ко-

фраг-  I             I        I          I торых имена не входят во

 ментовI             I        I          I внешние для этой зоны фраг-

       I             I        I          I менты.

       I             I        I          I

       I DEL(K1,K2,H)I        I          I Удаляет в ОП все фрагменты

       I             I        I          I от К1 до К2, кроме защищен-

       I             I        I          I ных фрагментов (имеющих вид:

       I             I        I          I  ...(.../KK) H(KK),

       I             I        I          I где KK - имя фрагмента), и

       I             I        I          I тех фрагментов, у которых

       I             I        I          I имена не входят во внешние

       I             I        I          I для этой зоны фрагменты.

       I             I        I          I

       I  DEL(K1)    I        I          I Удаляет фрагмент К1.

-------+-------------+--------+----------+----------------------------

35     I             I всегда I изменяет I Удаляет из ОП все незаблоки-

 DELFR I  DELFR(К1)  I истина I в ОП     I рованные фрагменты сем.сети,

       I             I        I сем.сеть I имеющие имя отношения К1.

-------+-------------+--------+----------+----------------------------

36     I             I всегда I изменяет I Удаление из ОП всех фраг-

  DELH I  DELH(К1)   I истина I в ОП     I ментов, имеющих имя отноше-

       I             I        I сем.сеть I ния H  и записанных после

       I             I        I          I фрагмента с именем К1.

-------+-------------+--------+----------+----------------------------

37     I             I всегда I изменяет I Выполняет сжатие сем.сети

  SQU  I SQU(К1)     I истина I в ОП     I (удаляет в ней пустоты) от

       I             I        I сем.сеть I фрагмента с именем К1 и до

       I             I        I          I конца.

-------+-------------+--------+----------+----------------------------

                            - 68 -

    

=======+=============+========+==========+============================

   1   I      2      I    3   I     4    I        5

=======+=============+========+==========+============================

38     I             I всегда I          I Вызывает редактор текста

  CALL I CALL(FNAME,RAS)истинаI          I LEXICON.     (IBM PC)

-------+-------------+--------+----------+----------------------------

39     I             I всегда I          I Вызывает редактор текста

  EDIT I EDIT(FNAME,RAS)истинаI          I LEXICON.     (IBM PC)

-------+-------------+--------+----------+----------------------------

40     I             I всегда I          I Останов программы.

  EXIT I EXIT()      I истина I          I              (IBM PC)

-------+-------------+--------+----------+----------------------------

41     I             I всегда I          I Устанавливает цвет фона.

  COLD I COLD(Ц1)    I истина I          I              (IBM PC)

-------+-------------+--------+----------+----------------------------

42     I             I всегда I          I Устанавливает цвет текста.

  COLT I COLT(Ц1)    I истина I          I              (IBM PC)

-------+-------------+--------+----------+----------------------------

43     I             I истина I          I Устанавливает размеры окна.

  WIND I WIND(Ц1,Ц2,Ц3,Ц4)    I          I              (IBM PC)

-------+-------------+--------+----------+----------------------------

44     I             I истина I          I Устанавливает размеры преды-

  OLDW I OLDW()      I        I          I дущего окна. (IBM PC)

-------+-------------+--------+----------+----------------------------

45     I             I всегда I вывод    I

   OKR I             I истина I на экран I

       I   OKR(К1,H) I        I          I Выводит на экран окрестность

       I             I        I          I К1 (т.е. все фрагменты, со-

       I             I        I          I держащие константу К1).

       I             I        I          I

       I   OKR(К1)   I        I          I Выводит на экран все неза-

       I             I        I          I блокированные фрагменты, со-

       I             I        I          I держащие константу К1.

-------+-------------+--------+----------+----------------------------

46     I             I всегда I вывод    I Выдает на экран информацию

  LIPS I   LIPS()    I истина I на экран I о количестве логических вы-

       I             I        I          I водов, выполненных от момен-

       I             I        I          I та пуска программы.

-------+-------------+--------+----------+----------------------------

                         

                          Приложение 2.

                          

                Стандартные процедуры (продукции)

                _________________________________

    

         Стандартные процедуры записываются в виде продукций. такие

   продукции   будут   называться  стандартными.  Обращение  к  ним

   происходит так же как к обычным продукциям - с помощью оператора

   T1:,  за  которым  ставится  индикатор  стандартной   продукции,

   например, T1:INZ(GRFF).

         Для  описания  стандартных  процедур  будут использоваться

   следующие обозначения:

 RNAME - имена разделов: строковые константы или переменные, означен-

         ные такими константами; каждый такой раздел оформляется соот-

         ветствующим образом и описывается в каталоге в виде -

         KTL(RNAME,FNAME), где FNAME - имя файла (без расширения),

         содержащего раздел RNAME;

 SCEEN - имена подсценариев диалога: строковые константы или перемен-

         ные, означенные такими константами;

 N     - целые числа или переменные, означенные этими числами.


 

                              - 70 -

        

=========+=============+=========+====================================

Имя      I Индикатор   I В каком I

стандарт-I соответству-I разделе I  Краткое описание

     ной I        ющей I знаний  I             стандартной процедуры

процедурыI стандартной I описана I

         I продукции   I         I

=========+=============+=========+====================================

   1     I      2      I    3    I            4

=======+=============+========+==========+============================

ввод     I             I         I Если раздела RNAME нет в ОП и он

раздела  I  INZ(RNAME) I   SYS   I описан в каталоге, то он вводится

в ОП     I             I         I в ОП. Если же его нет ни в ОП ни в

         I             I         I каталоге, то выдается сообщение:

         I             I         I "Раздел не может быть введен -

         I             I         I  отсутствует в каталоге /KTL/".

---------+-------------+---------+------------------------------------

удаление I             I         I Если раздела RNAME имеется в ОП,

раздела  I DELZ(RNAME) I   SYS   I то он удаляется оттуда. В противном

из ОП    I             I         I случае ничего не делается.

---------+-------------+---------+------------------------------------

вывод    I             I         I Если раздела RNAME есть в ОП,

раздела  I OUTZN(RNAME)I   SYS   I то он выводится в файл RNAME.Z. В

в файл   I             I         I противном случае выдается сообщение:

         I             I         I "Раздел не может быть выведен на

         I             I         I  диск".

---------+-------------+---------+------------------------------------

вывод    I             I         I   Если раздела RNAME описан в ката-

раздела  I TERZ(RNAME) I   SYS   I логе, то из соответствующего файла

на экран I             I         I на экран выдается содержимое этого

         I             I         I раздела. В противном случае содержи-

         I             I         I мое этого раздела выдается из ОП.

         I             I         I   Если же раздела RNAME нет ни в ка-

         I             I         I талоге ни в ОП, то выдается сообще-

         I             I         I ние: "Раздел отсутствует в KTL".

---------+-------------+---------+------------------------------------

вывод    I             I         I Из ОП на экран выдается раздел

(из ОП)  I TEROP(RNAME)I   SYS   I RNAME.

раздела  I             I         I

на экран I             I         I

---------+-------------+---------+------------------------------------

вставка  I             I   SYS   I Раздел RNAME2 - удаляется, а его

в раздел I VSTZ(RNAME1,RNAME2)   I содержимое вставляется в конец раз-

         I             I         I дела RNAME1. Это происходит одно-

         I             I         I временно и в ОП и на диске.

---------+-------------+---------+------------------------------------

установкаI             I         I Устанавливается цвет фона N1 и

цвета    I  COL(N1,N2) I   SYS   I текста N2.     (IBM PC)

---------+-------------+---------+------------------------------------

возврат  I             I         I Устанавливается цвет фона N1 и

цвета    I     CLR*    I   SYS   I текста N2, которые задаются для

         I             I         I текущего подсценария диалога

         I             I         I SCEEN - с помощью фрагмента

         I             I         I CLR(SCEEN,N1,N2). Если такой фраг-

         I             I         I мент отсутствует, то устанавливается

         I             I         I цвет: черные буквы на белом фоне.

         I             I         I                (IBM PC)

---------+-------------+---------+------------------------------------

         


 

                              - 71 -

        

=========+=============+=========+====================================

   1     I      2      I    3    I            4

=======+=============+========+==========+============================

централь-I             I         I  Выдает содержимое раздела RNAME в

     ное I WIND1(RNAME)I   SYS   I окно, расположенное в центре экрана.

окно     I             I         I  Размер окна -

         I             I         I 50(букв по горизонтали) * 6(строк).

         I             I         I                (IBM PC)

---------+-------------+---------+------------------------------------

правое   I             I         I  Выдает содержимое раздела RNAME в

окно     I WIND2(RNAME)I   SYS   I окно, расположенное в правом верхнем

         I             I         I углу экрана. Размер окна - 48 * 11.

         I             I         I                (IBM PC)

---------+-------------+---------+------------------------------------

                          

                           Приложение 3.

    

                          Системные имена

                          _______________

 

            1.  Раздел PROD

 

  Продукционные сборки:

     P  - продукционное отношение,

     S  - обычная сборка,

     D  - удаление,

     N  - отрицание,

     B  - выполнить встроенную функцию,

     T  - циклический вызов продукций,

     T1 - однократный вызов продукций,

     T! - однопроходный вызов продукций.

        

  Спец.имена, по которым нельзя вести поиск фрагментов

   (используемые программным ядром):

     V  - метка переменных,

     Z  - имя-значение,

     L  - соединение букв,

     H  - защита,

     _  - подчеркивание,

     _D - удаленный аргумент.

 

  Спец.имена, используемые программным ядром:

     K            - корень,

     @BL          - блокировка,

     @@           - метка ввода с клавиатуры,

     если ESLI IF - выделение условной части продукций,

     то TO THEN   - выделение следствия,

     SYS          - имя системного раздела,

     PROD         - файл, в котором находится системный раздел.

 

 

  Имена встроенных фрагментов:

     = # > >= < <= + * M- DIV +% SELF PAR KARG FR SET UN NP FRI NEW

     A  F  OUT OUT1 REW TT EOLN G  LN I  IN R  C  DEL DELFR DELH SQU

     CALL EDIT  EXIT  COLD  COLT  WIND OLDW

     OKR LIPS RET MORFOL*

 


 

                              - 72 -

         

                         Приложение 4.

 

               Некоторые рекомемендации пользователю.

 

 

       (Последовательности операций пользователя в некоторых

 

        конкретных ситуациях при работе с ДЕКЛ)

 

 

    1. Как запустить систему ДЕКЛ?

 

         Пуск  системы  осуществляется  с  помощью  команды    DD,

    которая осуществляет загрузку основного модуля системы.  После

    загрузки  системы  перед  пользователем  на  экране появляется

    страница с номером версии системы. Для  перехода  к  стартовой

    странице пользователю необходимо нажать клавишу <Enter>, после

    чего в верхней  части  экрана  появится  стартовое  меню, а  в

    нижней  части  экрана   строка  подсказка,  напоминающая   как

    распределены   различные  команды  по функциональным  клавишам.

   

    Возможности, предоставляемые  стартовым  меню:

    

       ФАЙЛ    :

     - инициирование работы с продукциями;

     - получение справочную информацию;

     - окончание сеанса работы.

       РЕДАКТОР:

     - вызов для редакции файла MAIN.Z. в стартовом варианте,

       а  также  любого  другого  файла.

       РЕЖИМ   :

     - переход на работу со скроллинговым вариантом;

     - определение   соответствия   между   цветами   текста

       и фона и значением числа, используемого во встроенных

       фрагментах, работающих с окнами,которое  сопоставлено

       данной паре.

      

         Например: если вы остановились в своем выборе на  позиции

    ФАЙЛ и при этом нажали на клавишу <Enter>, то  на экране  поя-

    вится:

                  Что Вы хотите ?

                  решать задачу

                  получить справки

                  закончить работу

       

         При выборе пункта "решать задачу"  <Enter>  на экране  по

    явится  перечень  файлов с расширением .Z. Теперь, достаточно,

    аналогичным способом, выбрать любой файл из этого перечня, как

    соответствующие продукции начнут активизироваться.

         Пользователю  напоминается, что для получения  справочной

    информации по работе с системой ему необходимо воспользоваться

    клавишей F1 (подсказка), для возврата в процессе работы с сис-

    темой к предыдущему меню необходимо использовать клавишу  ESC,

    а для перехода к верхнему меню - клавишу F10.

 

 


 

                              - 73 -

              

              

              

    2. Как работая с системой воспользоваться текстовым редактором?

    

    

         Система    настроена  на редактор  LEXICON.  Для перехода к

    процессу   редактирования  файлов  знаний  (Z-файлов) необходимо

    проделать следующую последовательность действий:

 

      - нажать  функциональную клавишу <F10> (для перехода в верхнюю

        строку-меню);

       

      - курсорными клавишами выбрать в строке-меню графу "Редактор";

     

      - для загрузки тектстового редактора нажать клавишу <Enter>.

 

         После   завершения  процесса  редактирования   и  выхода из

    редактора  система  возвращается  в  состояние   соответствующее

    моменту вызова редактора.

               

              

    3. Как получить справочную информацию?

     

     

         Для  получения   справочной    информации   необходимо либо

    воспользоваться функциональной клавишей <F1>, либо клавишей <Н>.

   

    Если   пользователь   находится  в  стартовом   меню системы, то

    достаточно  выбрать  позицию  ФАЙЛ  <Enter>, затем  при   помощи

    курсорных  клавиш  переместиться  на  позицию "получить справки"

    и  нажать  клавишу <Enter>.

   

         Требуемую справочную информацию   пользователь  получает от

    системы   выбирая  соответствующие  ей  графы выводимых на экран

    меню.

        

        

    4. Как ввести новый файл знаний?

        

        

         Для ввода новых знаний в новом Z-файле, необходимо следующее:

         

      - войти в тектовый редактор (см. пункт 3 данного приложения);

 

      - ввести имя файла (обязательно с расширением Z);

        

      - далее ввести в текущий файл новые знания на языке ДЕКЛ

        руководствуясь  методикой  ввода  новых  знаний;

 

      - выйти из редактора с сохранением введенных знаний;

 

        


 

                              - 74 -

                             

 

    5. Как выйти из системы ДЕКЛ?

        

        

         Находясь   в  стартовом  меню  для  выхода  из  системы ДЕКЛ

    пользователю   достаточно   выбрать   позицию   "ФАЙЛ"  и  нажать

    клавишу <Enter>. После  чего  выбрать  графу "закончить работу" и

    также  нажать  клавишу  <Enter>.

         Если  же  система  находится   в  одном   из  рабочих  меню,

    то пользователю  необходимо провести следующую последовательность

    действий:

 

      - нажать  функциональную клавишу <F10> (для перехода  в позицию

        ФАЙЛ  стартового  меню);

 

      - далее  по  известному  алгоритму.

 

    Возможен  также  выход  по CTRL/C.

                                      

                                      

                                      

    6. Как  включить  трассировку?

        

        

    В системе  существует  два  вида  трассировок:

        

      - полная (F),при этом на экран выдаются результаты примене-

        ния  всех  продукций;

        

      - сокращенная (T),  при  этом  на  экран  выдаются  только

        применимых  продукций;

                         

    Включение  полной  трассировки  производится  нажатием клавиш

    CTRL/F,    сокращенной    CTRL/T.    Выключение    трассировок

    осуществляется  нажатием  клавиш CTRL/D.

        

                                                               

                                                                

                                                               

                                                               

                                                               

                                                                

                                                               

                                                               

                                                               

                                                                

                                                               

                                                               

                                                               

                                                                

                                                               

                                                               

                                                               

                                                                

                                                               

                                                               

        


 

                              - 75 -

                              

                      Приложение 5.

    

            Основные элементы и конструкции языка РСС

        

                   1. Основные символы

 

 

       РСС использует следующие основные символы:

 

         - буквы (латинские A - Z,русские а - я);

 

         - цифры (0 - 9);

 

         - знаки пунктуации (пробел, запятая, ; " : / (  )  [

           ], а также код клавиши "вк" или "ENTER" );

 

         - знаки операций ( + = * < > # ? );

 

         - спецсимволы ( - . & % _ ).

 

     В новейших версиях операционных систем допускается приме-

  нение как бол ьших, так и малых букв (они считаются различны-

  ми символами - в стандарте ASCII они имеют свои коды).

 

       

               2. Константы

       

 

       Константа - это последовательность букв, цифр, знаков,

  операций и спецсимволов,которые начинаются  не  с  буквы  X

  (лат. или русс.) и не с цифры.

     Итак, константа не может содержать знаков пунктуации. Чис-

  ла не являются константами, т.к. Они начинаются с цифры. В то

  же время отдельные знаки операций или их сочетания - э то

  константы.

                       Примеры констант:

 

       а12, **, **15, иван1, брат, JANE-1, F125, +, <, >, = .

 

       Константы служат для обозначения  об'ектов,  понятий  и др.

 

              3. Строковые константы

 

 

       строковая константа -это последовательность  символов,

  которая обрамляется кавычками (").

 

              Примеры строковых констант:

   

       "15","а12","ИВАН","++1","X1","ввести текст"

        

       В строковых константах допускаются  знаки  пунктуации,

  операций, а также спецсимволы.

       Если в начале и в конце любой константы или переменной

  поставить кавычки, то образуется строковая константа.

 

       Строковые константы - это ничего не обозначающие  пос-


 

                              - 76 -

        

  ледовательности символов. Напрмер, "ИВАН1"  рассматривается

  системой как последовательность букв. В то же время ИВАН1 -

  это уже обозначение об'екта.

     Каждая строковая константа есть константа.

         

        

                4. Число

 

 

       Число - это  последовательность  цифр,  после  которой

  ставится нижняя черточка. Например, 2_, 345_, 824_, 1286_ -

  это числа.

 

       Допускаются только целые числа от 0  до  сколь  угодно

  большой  величины.  Естественно,  между  цифрами  не  может

  стоять каких-либо знаков пунктуации - точек, запятых и т.д.

 

       Каждое число есть константа.

 

 

                5. Знаки арифметических операций

 

                                         

       РСС использует следующие знаки  арифметических  опера-

  ций:

 

       +  - сложить

       *  - умножить

       м- - вычесть

      DIV - разделить (цело-численное деление)

        < - меньше

       <= - меньше или равно

       >= - больше или равно

        = - равно

        # - не равно

        > - больше

 

       Kаждая арифметическая операция есть константа.

 

 

                6. Внутрисистемные коды

 

 

       Различаются два вида таких кодов. Первые -  это  числа

  от 1 до 128, которые играют роль кодов символов (в стандар-

        

  те ASCII). Например, 46 - есть код точки, 44  -  запятой  и

  т.д.

     Вторые - это числа от 0 до 99, к которым добавляется знак

  плюс (+) (когда вводится новое имя) или знак минус (-) (когда

  используется уже введенное имя). Такие числа играют роль имен

  или обозначений, порождаемых самой системой, к примеру, когда

  генерируются новы е знания или требуется представить не обоз-

  наченный об'ект.

       Например, "1+" и "1-" - есть обозначение одного и того

  же об'екта (или отношения), а "2+" и "2-" - уже другого,  и


 

                              - 77 -

  т.д.

     Если еще раз встретится "1+", то это будет уже обозначение

  третьего об'екта (знак "+" означает - появился новый об'ект).

  Все последующие "1-" будут соответствовать третьему об'екту.

  Следует отметить, что хотя первый и третий об'екты обозначены

  одинаково "1+", однако система всегда будет отличать один от

  другого. С каждым плюсом, следующим после числа, будет заго-

  тавливаться свое представление.

         

       Количество внутрисистемных имен, сопоставляемых об'ек-

  там, может быть достаточно большим, и ограничивается только

  об'емом памяти оп, выделяемой под знания.

 

       Каждое внутрисистемное имя есть константа.

 

       Итак, в системе деклар последовательности цифр исполь-

  зуются:

 

         - для представления чисел (тогда за последней цифрой

          

           ставится нижняя черточка);

 

         - в качестве кодов символов;

 

         - в качестве внутрисистемных имен или  кодов  (тогда

           за последней цифрой ставится знак "+" или "-").

 

 

 

                   7. Переменные

 

 

 

       Переменная - это  последовательность  символов  (кроме

  знаков  пунктуации),  начинающаяся  с  буквы  X  (лат.  Или

  русс.).

 

                      примеры переменных:

 

      х, х1, ха1, х**, х-брат, х-JANE1

 

       Переменные служат для обозначения  неизвестных  обьек-

  тов, отношений и др.

 

        

        

                8. Простейшие фрагменты

 

 

     Они составляются из констант и переменных следующим обра-

  зом. На первом месте ставится константа или переменая, назы-

  ваемая именем отношения. Это может быть и знак арифметической

  операции. На следующих местах (в круглых скобках) ставятся

  константы или переменные , называемые аргументами отношения .

  Они отделяются запятыми и представляют (или обозначают)

  об'екты, участвующие в отношении.

 


 

                              - 78 -

        

                      Примеры отношений:

 

       дед(ИВАН1,ПЕТР1)

 

       Этот  фрагмент  представляет  отношение  "дед"   между

  об'ектами (людьми), обозначенными через "ИВАН1" и "ПЕТР1".

 

       Муж(х1,маша1)

 

       Этот фрагмент представляет, что некоторый  неизвестный

  об'ект (человек) х1 является мужем для "маша1". Здесь "муж"

  - имя отношения.

     Для простеших фрагм ентов выбрана предикатная форма запи-

  си. Это не случайно, так как простейший фрагмент представляет

  ту же информацию, что и элементарные предикаты в логике. Од-

  нако в общем случае понятие фрагмента шире, чем предиката,

  что будет показано ниже.

     Простейшие фрагменты могут иметь различную N-местность (но

  не превышающую числа 5). Это позволяет представлять отношения

  достаточно высокой ар-ности. Выше были проиллюстрированы дву-

  местные фрагменты, представляющие бин арные отношения.

 

       Рассмотрим другие примеры.

 

       Школ(маша1)

 

       Это  одноместный   фрагмент,   представляющий   "маша1

  является школьницей". В качестве имени отношения  использо-

  вано школ - означающее "быть школьницей". Здесь представле-

  но свойство, которое рассматривается как унарное отношение.

       

       х1(\)

 

       Это нульместный фрагмент, где именем отношения являет-

  ся переменная. Такая запись допускается в РСС.

 

       Имя("ИВАН1",1+) это двуместный фрагмент,  представляю-

  щий, что строковая константа "ИВАН1" именует (имя OTношения

  -"имя") новый об'ект, которому сопоставлен  внутрисистемный

  код 1+.

 

       +(27_,X1,30_) такая запись означает: 27 + X1 =30.

        

     Следует отметить,что деление на об'екты и отношения явля-

  ется весьма условным. Допускаются случаи, когда на аргумент-

  ных местах в каких-либо фрагментах ставятся имена отношений,

  или же обозначение об'ектов используется в качестве имен от-

  ношений. Однако, желательно, чтобы при этом не терялась со-

  держательная интерпретация.

     Среди множества имен отношений выделяются "системные", ко-

  торые интерпретируются и обрабатываются программным ядром.

  Это константы, которые записываются в виде одиночных букв -

  латинских или русских. К ним относятся обозначения операторов

  (D, T, B, N), имя продукционного отношения (P), отношения "ч

  асть-целое" (S), а также имена встроенных фрагментов и спецф-

  рагментов. В связи с этим использование отдельных букв в ка-

  честве несистемных имен отношений следует избегать.


 

                              - 79 -

 

 

                 9. Именованные фрагменты

 

       

      Они включают в себя те же компоненты, что и обычные фраг-

  менты. Но в конце добавляется часть, служащая для именования

  всей конструкции. В качестве имени используются константы или

  переменные. Эта часть записывается после всех аргументов и

  отделяется от них косой линией.

 

       Рассмотрим следующие примеры:

        

       дед(ИВАН1,ПЕТР1/D1)

 

       Это фрагмент, поименованный константой  D1.  Константа

  D1 обозначает "комплексный" об'ект, состоящий из предыдущих

  (ИВАН1,ПЕТР1) с учетом их отношения.

 

       Школ(маша1/X1)

 

       Это фрагмент, поименованный переменной X1. Она ставит-

  ся в том случае, когда имя фрагмента неизвестно, но сущест-

  венно.

 

       FFF(/2+)

 

       Это нуль-местный фрагмент с именем 2+ (внутрисистемным

  кодом).

       Следует отметить, что два фрагмента обязательно должны

  иметь различные имена. Имя - это уникальная  характеристика

  фрагмента (его  "код"),  которая  необходима  по  следующим

  соображениям.

     Во-первых, именование фрагментов необходимо, когда об'екты

  и связывающее отношение рассматриваются как единое целое, что

  было проиллюстрировано в приведенных ра нее примерах. Тогда

  это целое может быть обозначено своей константой или перемен-

  ной, которая может участвовать для представления отношений

  этого целого с какими-либо другими об'ектами. Это содержа-

  тельная сторона;

        

     Во-вторых, именование фрагментов необходимо с точки зрения

  поиска, обработки - для правильной работы программного ядра.

  Поэтому при вводе простейших фрагментов они автоматически

  "именуются", т.е. становятся именованными. При этом в качест-

  ве имени берется внутрисистемный код. Например, при вводе

  фрагмента "школ(маша1)" будет автоматически сформировано

  "школ(маша1/1+)", где "1+" - очередное внутрисистемное имя.

 

       Каждый простейший фрагмент есть фрагмент.

 

       Каждый именованный фрагмент есть фрагмент.

 

       Следует отметить, что понятие фрагмента шире, чем пре-

  диката по трем соображениям.

 

     Во-первых, во фрагментах имя отношения в некотором смысле


 

                              - 80 -

        

  равнозначно именам об'ектов - на соот ветствующих местах мо-

  гут стоять одни и те же константы или переменные.

 

       Во-вторых,  в  предикатах  отсутствуют   средства   их

  именования,которые есть во фрагментах, и,

 

       В третьих, понятие фрагмента, в отличии от  предиката,

  никак не связано  с  логическим  значением  "истинности"  и

  "ложности", хотя такие значения всегда могут  быть  введены

  во фрагмент - для них может быть выделено свое  аргументное

  место.

 

 

            10. Символ "_" (нижняя черточка)

 

                                         

       Символ "_" ставится во фрагменте на места, которые  не

  существенны или не играют роли, т.е. не важно, что  на  них

  стоит, какой представлен об'ект. Этот символ есть константа

  (специального назначения).

 

                            пример

 

       дед(ИВАН1,_).

 

       Здесь представлено, что ИВАН1 является дедом - не важ-

  но кому.

       Символы "_" могут стоять в  различных  местах,  в  том

  числе, и на месте  имени  отношения.  Такие  символы  могут

  соответствовать  различным  об'ектам  или  отношениям,   не

  играющим какой либо роли или несущественным с точки  зрения

  интерпретации, например:

 

       друг(_,_/DD)

 

       Это именованный фрагмент, который  означает  :  кто-то

  кому-то является другом. Это могут быть разные люди.

 

                            Пример

 

       (ИВАН1,ПЕТР1)

 

     Этот фрагмент представляет, что ИВАН1 и ПЕТР1 как-томежду

  собой связаны, но не важно как.

 

       Символ "_" не может стоять на месте  имени  фрагмента.

  Например, запись типа R1(х1/_) недопустима. В  этом  случае

  следует использовать другую эквивалентную запись -  R1(х1).

  Следует отметить, что именованный фрагмент, в  котором  имя

  не играет роли (содержательно нигде не используется)  запи-

  сывается как простейший фрагмент. Напомним, что  при  вводе

  такого фрагмента ему будет присвоено свое имя  -  некоторое

  число.

     Формально п онятие фрагмента определяется следующим обра-

  зом:

 


 

                              - 81 -

        

       <имя отношения>  -->  <константа> \ <переменная>

       <имя фрагмента>  -->  <константа> \ <переменная>

            <аргумент>  -->  <константа> \ <переменная>

 

  <простейший фрагмент> -->

 

  <имя отношения>() \ <имя отношения>(<аргумент>) \

 

  <имя отношения>(<аргумент>,...,<аргумент>)

 

  <именованый фрагмент> -->

 

  <имя отношения>(/<имя фрагмента>) \

 

  <имя отношения>(<аргумент>/<имя фрагмента>) \

 

  <имя отношения>(<аргумент>,..., <аргумент>/<имя фрагмента>)

 

  <фрагмент> -->

 

  <простейший фрагмент> \ <именованный фрагмент>

 

       В данном определении обратная косая черта играет  роль

  разделительного "или".

 

     Следует отметить, что для записи констант или переменных,

  обозначающих об'ект или отношение, лучше использовать лишь

  заглавные буквы - латинские или русские (в данной версии сис-

  темы дек лар использованы заглавные латинские буквы). Это

  позволяет избежать многих ошибок, вызванных привычкой инвари-

  антного использования больших и малых букв (напомним, что в

  системе ДЕКЛАР - это различные символы).