Главная Страница > Инструм.среда

    Инструментальная среда ДЕКЛ

 

          Инструментальная среда ДЕКЛ , разработанная в конце 90-х годов, включает  в себя язык ДЕКЛ , предназначенный для обработки структур знаний (РСС),а также собственную базу данных  - для хранения РСС и текстов. Позволяет быстро строить прикладные интеллектуальные системы, лингвистические процессоры, базы знаний, экспертные системы, оболочки экспертных систем . Если использовать для этих целей языки более низких уровней (PASCAL, C++ ), то получаются очень сложные программы, которые трудно отлаживать. На языке ДЕКЛ эти программы оказываются достаточно простыми и компактными. Более того, они легко налаживаются и корректируются.

           

          Язык ДЕКЛ использует парадигму – демоны за круглым столом , которая широко используется в области «искусственный интеллект».

 

 

 

 

 

Имеется круглый стол с пищей. За ним сидят демоны, которые смотрят на стол (ЛЧ) . И  если имеется подходящая пища , то демон срабатывает и делает определенные действия (ПЧ). Например, он может положить новую пищу на стол.

Если эта пища подходящая для других демонов, то они смогут сработать и т.д..

            Парадигма хороша в силу параллелизма: можно сажать все новых и новых демонов , которые будут делать все более сложную работу. Однако, в чистом виде парадигма не используется по следующим причинам. В один и тот же момент могут хотеть взять пищу сразу несколько демонов. Возникают коллизии от того , какой демон срабатывает первым, зависит, по какому пути пойдет дальнейший процесс. Поэтому, во-первых, вводят ранг каждого демона. В случае коллизии  пищу берет демон наиболее высокого ранга. Во-вторых, делает демонов не активных (которые смотрят на стол) и спящих. Когда какой-либо демон срабатывает , то он может (кроме всего прочего ) разбудить других демонов (или активизировать их),  а сам – уснуть.

            Именно такая схема используется в языке ДЕКЛ. Круглый стол – база знаний – РСС. Демоны - это правило ЕСЛИ…ТО…, которые содержат правую (ПЧ) и левую (ЛЧ) части. Для ЛЧ ищутся сопоставимые структуры в БЗ .Подходящая пища демона , если в БЗ оказалась сеть (РСС), сопоставимая с ЛЧ правила. Тогда правило делается применимым и выполняются действия, записанные в ПЧ этого правила. В частности, могут быть вызваны другие правила  (активизации демонов).

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

Язык ДЕКЛ предназначен для обработки структур знаний - в виде РСС.

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

     

            1. Основные компоненты языка ДЕКЛ.

 

Обычные константы. Это последовательность букв и цифр. Они не могут начинаться с цифры, буквы X (с X начинаются переменные) и иметь внутри пробелы. Примеры констант: ИВАН1, А21, АА_ _, _125. (Не правильные буквосочетания - XX_1, 23_BB, 2G4A). При этом константы, записанные большими и маленькими буквами, считаются различными, например, ИВАН и Иван - это различные константы.

Строковые константы. Любые символы в кавычках. Например: "Введите текст +> ", " Нажмите ENTER ". Внутри не может быть других кавычек.

Числа. Целые числа: положительные и отрицательные, например, 125, -33. Дробные числа: 0.25, 12.44.

Знаки арифметических операций:

+ (сложить), * (умножить), - (вычитание), DIV (деление), < (больше),

<= (больше или равно), = (равно), # (неравенство).

Внутрисистемные коды N+ N-:

1+ - создается новая вершина без имени.

1- - вершина без имени используется.

Внутрисистемные коды соответствуют определенным вершинам без мнемонических обозначений. Причем, кодов 1- может быть множество. Они соответствуют одной и той же вершине РСС. Но если опять встретится код 1+, то заводится новая вершина и последующие 1- подсоединяются к ней.

В качестве внутрисистемного кода может быть использовано любое целое число (не более 300) с знаками + и -, например, 125+, 125-,...,125-. Такие коды сопоставляются безымянным объектам, которые постоянно порождаются и используются в БЗ.

Переменные: X<целое число>, например, X1, X25, ...Они соответствуют  х-вершинам РСС.

Символ пустого места "_" (нижняя черточка). Он соответствует объекту, который не играет роли, и ставится на аргументных местах, которые не участвуют в обработке.

Пример: БРАТ(ИВАН1,_) - неважно, кто брат для ИВАН1. Если на месте "_" поставить X1, то это значит, что нужно искать брата.

Элементарные фрагменты (ЭФ) или просто фрагменты. Это именованные предикаты, которые имеют вид:

<имя отношения>(<арг1>,<арг2>,...,<аргN>/<код фрагмента>),

где <арг1>,<арг2>,...,<аргN> - аргументные места, на которых могут

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

области. Код фрагмента соответствует комплексному объекту, т.е.

упомянутым объектам вместе с их отношением, которые рассматриваются

как единое целое. Код фрагмента может отсутствовать. Тогда ЭФ примет

более простой вид:

<имя отношения>(<арг1>,<арг2>,...,<аргN>).

Внутри ЭФ не должно быть пробелов.

Расширенная семантическая сеть (РСС) или просто семантическая сеть - это множество ЭФ, разделенных пробелами (внутри ЭФ их не должно быть).

Пример 2.1.1. "Иван умный и способный" представляется с помощью РСС:

ИМЯ(ИВАН,1+) УМНЫЙ(1-) СПОСОБНЫЙ(1-),

где 1+ и 1- соответствуют одному и тому же человеку.

Пример 2.1.2. ИВАН1 связан с ИВАН2 (но это не играет роли) представляется с помощью РСС: _(ИВАН1,ИВАН2), где на месте отношения стоит символ пустого места.

Пример 2.1.3. Для представления арифметических выражений используется бэкусовская нормальная форма. Равенство 25+X1+3=X2 представляется в виде +(25,X1,X4) +(X4,3,X2).

Другое равенство 2*X1+34=88 представляется в виде:

*(2,X1,X2) +(X2,34,88), где X2 сопоставляется результату 2*X1.

 2. Продукции (правила ЕСЛИ...ТО...).

Продукции применяются к базе знаний (БЗ) и имеют вид:

<имя продукции>(...):IF <ЛЧ> THEN <ПЧ>;

где <имя продукции>(...) - это фрагмент, который необходим для вызова продукции. Такой фрагмент может содержать аргументные места - переменные (при вызове продукции с передачей параметров). Если вызов идет без передачи параметров, то будет - <имя продукции>().

ЛЧ - левая часть продукции, в которой задается условие ее применения. В случае их выполнения продукция считается  применимой. При этом означиваются переменные, имеющиеся в ЛЧ.

ПЧ - правая часть продукции, которая задает действия. Они выполняются, если продукция оказалась применимой. Значения переменных передаются из ЛЧ в ПЧ и учитываются при выполнении действий.

ЛЧ и ПЧ содержат наборы фрагментов (в которых не более 5 аргументных мест) и встроенные предикаты (обращение к процедурам, которые выполняются отдельными программами на языке PASCAL).

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

Условие применения продукции заключается в сопоставлении фрагментов ее ЛЧ с фрагментами базы знаний (БЗ). Если соответствующая структура в БЗ найдена, то продукция считается применимой и означиваются переменные ее ЛЧ (см. сопоставление по образцу). Такие означивания передаются в ПЧ и учитываются при выполнении действий.

Если в ПЧ имеется фрагмент, то в случае применения продукции он добавляется к БЗ.

Пример 2.1.

UR1():IF ИМЯ(ИВАН,X1) УМНЫЙ(X1) THEN СПОСОБНЫЙ(X1);

Пусть БЗ имеет вид:

ИМЯ(ИВАН,А1) УМНЫЙ(А1)

ИМЯ(ИВАН,А2) ГЛУПЫЙ(А2)

Тогда в процессе применения продукции к БЗ переменная X1 будет последовательно означиваться константами А1, А2, потому что для ИМЯ(ИВАН,X1) в БЗ имеются 2 сопоставимых фрагмента ИМЯ(ИВАН,А1) и ИМЯ(ИВАН,А2). Таким образом X1=А1,А2. Вначале берется первое значение X1=А1 и передается на следующий фрагмент: везде в ЛЧ и ПЧ продукции на место X1 ставится А1. Для УМНЫЙ(А1) ищется сопоставимый фрагмент в БЗ. Он имеется. Поэтому продукция будет применимой. Выполняются действия ПЧ. К БЗ будет добавлен фрагмент СПОСОБНЫЙ(А1). Далее берется X1=А2 и передается на следующий фрагмент. Для УМНЫЙ(А2) нет сопоставимых фрагментов в БЗ. В этом варианте продукция будет не применимой.

Пример 2.2. Преобразование представлений.

"Отец отца - дед" представляется в виде продукции:

UR2():IF ОТЕЦ(X1,X3) ОТЕЦ(X3,X2) THEN ДЕД(X1,X2);

Пусть БЗ имеются фрагменты: ОТЕЦ(А1,А2) ОТЕЦ(А2,А3).

Тогда для ОТЕЦ(X1,X3) в БЗ будет сопоставимый фрагмент ОТЕЦ(А1,А2), что вызовет означивания (X1,X3)=(А1,А2). Для ОТЕЦ(А2,X3) также есть сопоставимый фрагмент ОТЕЦ(А2,А3), что вызовет означивание X2=А3. Продукция будет применимой, что вызовет добавление к БЗ фрагмента ДЕД(А1,А3).

Программа  может содержать множество продукции. Все переменные каждой продукции локальны. Переменная X1 в разных продукциях означиваются независимо.

 

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

Т1:<имя продукции>(). Такие операторы могут быть трех типов:

Т1 - вызов до первого применения продукции;

Т! - вызов во всех вариантах означивания;

Т: - вызов, пока продукция применима.

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

Т1:UR2() - продукция UR2() будет вызываться до первого ее применения. Если в БЗ много фрагментов, представляющих "отец отца", то все одно к БЗ будет добавлен только один ДЕД.

Т!:UR2() - продукция UR2() будет вызываться во всех вариантах означивания. Для всех фрагментов, представляющих "отец отца", к БЗ будет добавлен ДЕД.

Т:UR2() - вызов UR2() пока применима. Это означает, что вначале будет вызвана T!:UR2(). И если она хотя бы один раз применилась, то снова будет вызвана T!:UR2(). Итак до тех пор, пока продукция ни разу не применится.

Вызовом T: можно пользоваться, если при применении продукции БЗ изменяется таким образом, что исключает повторное ее применение. Иначе будут бесконечные вызовы. Например, при вызове Т:UR2() к БЗ будет постоянно добавляться один и тот же фрагмент ДЕД(А1,А3). Процесс не остановится.

Множество продукций могут иметь одно имя. Пусть имеется продукция, представляющая: "мать матери - бабушка":

UR2():IF МАТЬ(X1,X3) МАТЬ(X3,X2) THEN БАБУШКА(X1,X2);

Тогда будет две продукции с одним именем UR2(). Рассмотрим варианты их вызова:

Т1:UR2() - вызов до первого применения хотя бы одной продукции. Вначале будет вызываться первая продукция. Если она была применимой, то процесс заканчивается. Если нет - то начинает применяться вторая продукция - до первого применения.

Т!:UR2() - вначале первая продукция будет вызываться во всех вариантах означивания, затем вторая.

Т:UR2() - что вначале будет вызвана T!:UR2(). И если хотя бы одна из продукций один раз применилась, то снова будет вызвана T!:UR2(). Итак до тех пор, пока ни одна продукция ни разу не применится.

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

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

N:<фрагмент> - нет (проверить отсутствие фрагмента в БЗ);

B:<фрагмент> - выполнить встроенную процедуру (встроенный предикат), связанный с фрагментом.

Пример 3.1. (использование оператора удалить - D:).

UR3():IF ИМЯ(ИВАН1,X1) D:УМНЫЙ(X1) THEN СПОСОБНЫЙ(X1);

Пусть БЗ имеет вид:

ИМЯ(ИВАН,А1) УМНЫЙ(А1)

ИМЯ(ИВАН,А2) ГЛУПЫЙ(А2)

Тогда продукция T1:UR3() будет применимой (см. пример 2.1). Из БЗ будет изъят фрагмент УМНЫЙ(А1) и добавлен СПОСОБНЫЙ(А1).

Пример 3.2. (использование оператора нет - N:).

UR4():IF ИМЯ(ИВАН,X1) N:УМНЫЙ(X1) THEN ГЛУПЫЙ(X1);

При вызове T!:UR4() вначале (см. пример 2.1) будет означена X1=А1. Далее будет проверяться отсутствие фрагмента УМНЫЙ(А1) в БЗ. Но он есть. Поэтому в данном варианте продукция будет не применимой. Далее берется X1=А2. Будет проверяться отсутствие фрагмента УМНЫЙ(А2) в БЗ. Такого фрагмента нет. Поэтому к БЗ будет добавлен фрагмент ГЛУПЫЙ(А2).

При вызове T:UR4() фрагмент ГЛУПЫЙ(А2) будет добавляться к БЗ до бесконечности. Чтоб этого не было, следует вставить еще один оператор "нет":

UR4():IF ИМЯ(ИВАН,X1) N:УМНЫЙ(X1) N:ГЛУПЫЙ(X1) THEN ГЛУПЫЙ(X1);

Пример 3.3. (использование оператора выполнить - B:).

UR5():IF SUB(СТУДЕНТ,X1) D:ВОЗРАСТ(X1,X2) В:+(X2,1,X3) THEN

ВОЗРАСТ(X1,X3);

Пусть в БЗ представлен возраст студентов:

SUB(СТУДЕНТЫ,СТ_1) ВОЗРАСТ(СТ_1,20)

SUB(СТУДЕНТЫ,СТ_2) ВОЗРАСТ(СТ_1,18) ...

Тогда при вызове T!:UR5() начале будет означено: X1=СТ_1, X2=20.

Оператор сложения В:+(X2,1,X3) добавит к 20 число 1 и означит X3=21.

Из БЗ будет изъят фрагмент ВОЗРАСТ(СТ_1,20) и добавлен ВОЗРАСТ(СТ_1,21).

При повторном применении из БЗ будет изъят фрагмент ВОЗРАСТ(СТ_2,18) и добавлен ВОЗРАСТ(СТ_2,19). В результате в БЗ к каждому студенту будет добавлено по одному году.

         4. Структура программы на ДЕКЛ

Программа на ДЕКЛ оформляется в виде отдельного файла, которому присваивается имя - достаточно произвольное, например, TEST.Z. Выполнение программы осуществляется по команде ДЕКЛ_WIN,.EXE <имя программы>, например, ДЕКЛ_WIN.EXE TEST.Z. Тогда файл TEST.Z вводится в оперативную память (если в файле записана БЗ, то вместе с ней). Выполнение начинается с продукции, имеющей имя START - T1:START.

Структура файла:

Служебные фрагменты или компоненты БЗ.

Начало программы - фрагмент с кодом начала  BEG(/91+).

Тело программы. ... START ... Продукции ...

Конец программы с ее блокировкой - фрагмент с кодом конца END(/92+)  и  блокирующий фрагмент @BL(91-,92-).

Блокирующий фрагмент @BL(91-,92-) необходим, чтоб исключить применение продукций к самим себе. Дело в том, что сами продукции считываются и выполняются в БЗ, где они представляются в виде РСС. Это обеспечивает металогические уровни: возможность одних продукций автоматически строить другие и вызывать их применение. В приводимых примерах этого не требуется. Поэтому с помощью блокирующих фрагментов выделяются зоны от 91+ до 92+,  к которым продукции не примеряются.

Фигурные скобки (как и в языке PASCAL) используются в качестве комментариев.

Пример 4.1. Программа выдачи студентов группы ГР_1.

{== База знаний ==}

СТУДЕНТ(ГР_1,STUD_1) ФАМ(IVANOV,STUD_1) ИМЯ(IVAN,STUD_1)

СТУДЕНТ(ГР_1,STUD_2) ФАМ(PETROV,STUD_2) ИМЯ(PETER,STUD_2)

СТУДЕНТ(ГР_1,STUD_3) ФАМ(SIDOROV,STUD_3) ИМЯ(IVAN,STUD_3)

СТУДЕНТ(ГР_1,STUD_4) ФАМ(SMIRNOV,STUD_4) ИМЯ(PETER,STUD_4)

СТУДЕНТ(ГР_1,STUD_5) ФАМ(IVANOV,STUD_5) ИМЯ(ANDREY,STUD_5)

СТУДЕНТ(ГР_1,STUD_6) ФАМ(PETROV,STUD_6) ИМЯ(OLEG,STUD_6)

{== Программа ==}

BEG(/91+) {= начало программы - код 91+ =}

{= с продукции START начинается применение программы =}

START:IF THEN

B:PAR(1,9) {= Включение трассировки. B:PAR(1,0) - выключение =}

T!:STUD_OUT(ГР_1)

B:IN()               {= ДЕКЛ встает и ожидает нажатия клавиши =}

B:HALT();       {= Выход из ДЕКЛ =}

{== Поиск по группе X1 ее студентов X2 с выдачей ФИО ==}

STUD_OUT(X1):IF СТУДЕНТ(X1,X2) ФАМ(X10,X2) ИМЯ(X20,X2) THEN

B:BK() {= Переход на новую строку =}

B:A(" Студент гр. ",X1)  {= Выдача на экран =}

B:A(": ",X10," ",X20);

END(/92+)  {= Конец программы - код 92+ =}

@BL(91-,92-)  {= указывает на зону, к которой не должны применяться продукции =}

Если записать эту программу в файл TEST_1.Z и выполнить

ДЕКЛ_WIN.EXE TEST_1.Z, то на экран будет выдано следующее:

Студент гр. ГР_1: IVANOV IVAN

Студент гр. ГР_1: PETROV PETER

Студент гр. ГР_1: SIDOROV IVAN

Студент гр. ГР_1: SMIRNOV PETER

Студент гр. ГР_1: IVANOV ANDREY

Если снять комментарии с B:PAR(1,9) = Включение трассировки =, то на экран будет выдан процесс применения продукций с означиванием переменных.

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

Продукция в общем виде:

<имя продукции>(...):IF <ЛЧ> THEN <ПЧ>;

В правой части (ПЧ) продукции могут быть: фрагменты, встроенные предикаты (процедуры) и операторы вызова других продукций. Рассмотрим возможные варианты.

5.1. Если в ПЧ находится фрагмент (ЭФ), то он добавляется к БЗ. При этом переменные фрагмента должны быть означены в левой части (ЛЧ). Например, если в ПЧ имеется СТУДЕНТ(X1), то вершина X1 должна быть означена в ЛЧ и к БЗ будет добавлен фрагмент, где на месте X1 стоит ее значение. Если X1 не означена, то она заменяется на внутреннюю константу.

5.2. Встроенные предикаты выдачи на экран.

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

В:А(<константы или означенные переменные>).

Предикат может иметь не более 5 аргументных мест – B:A(…,…,…,…,…).

В:ВК() - переход на новую строку.

В примере 4.1 для выдачи на экран использованы предикаты

B:BK() B:A(" Студент гр. ",X1). Если было означивание X1=ГР_1, то на экран с новой строки будет выдано: "Студент гр. ГР_1".

5.3. Операторы вызова продукций с передачей значений переменных.

Как уже говорилось, оператор вызова (это фрагмент с именем продукции) может содержать аргументные места - переменные. Тогда будет вызов продукции с передачей значений переменных (параметров).

Пример 5.1. Выдать всех людей с указанным именем. Пусть в БЗ представлены фамилии и имена студентов:

ИМЯ(Иван,СТ_1) ФАМИЛИЯ(Иванов,СТ_1)

ИМЯ(Иван,СТ_2) ФАМИЛИЯ(Петров,СТ_2)

ИМЯ(Иван,СТ_3) ...

Тогда можно воспользоваться следующей продукцией:

US1(X1):IF ИМЯ(X1,X2) ФАМИЛИЯ(X3,X2) THEN

В:ВК( ) B:A(" - ",X1," ",X3);

Если вызвать данную продукцию Т!:US1(Иван), то на экран будут выданы все люди с именем Иван:

- Иван Иванов,

- Иван Петров,

- ...

Другой вариант записи той же программы:

US1(X1):IF ИМЯ(X1,X2) THEN T1:US2(X1,X2);

US2(X1,X2):IF ФАМИЛИЯ(X3,X2) THEN

В:ВК( ) B:A(" - ",X1," ",X3);

US2(X1,X2):IF THEN В:ВК( ) B:A(" - ",X1);

      При вызове Т!:US1(Иван) вначале будет означено X2=СТ_1 и вызвана T1:US2(Иван,СТ_1). Эта продукция найдет фамилию (означит X3) и все это выдаст на экран. Далее будет X2=СТ_2 и т.д. Если у кого-либо фамилии нет (например у СТ_3), то первая продукция US2 не применится, а вторая (она всегда применится) выдаст одно имя - Иван.

5.4. Оператор ввода файла в БЗ.

Оператор ввода имеет вид В:IN(<имя файла>).

Он позволяет записывать БЗ в файле (в виде РСС) и вначале программы вводить ее в оперативную память (ОП) - для обработки продукциями.

Например, пусть БЗ находится в файле ВВВ.KN. Тогда при выполнении

START:IF THEN В:IN('BBB.KN') ...;

файл будет введен в ОП и обрабатываться продукциями. Таких файлов

может быть множество (БЗ разбита на части) и ввод может осуществляться в любом месте программы

Оператор В:IN() вызовет остановку программы (процесса применения продукций) и ожидание нажатия клавиш.

5.4. Параметры, которые определяют режимы работы.

В:PAR(1,9) - включить трассировку (или с клавиатуры Ctrl^Y).

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

B:PAR(1,0) - выключить трассировку (Сtrl^D).

Другие параметры будут рассматриваться ниже.

5.5.. Выдача в редактор.

B:EDFILE1(<имя файла>) - выдача указанного файла в редактор.

Если установить параметр В:PAR(39,2) B:EDFILE1('DDD.TXT'), то делается возможным редактирование файла.

B:PAR(39,0) - запрещается редактирование (изменения не будут запомнены).

B:PAR(18,1) –  использование EDFILE1 в роли меню, см. п. 16.

B:PAR(18,0) – EDFILE1  в роли редактора.  

5.6. Запись результатов в файл.

С помощью операторов B:REW(<имя файла>) ... B:REW() можно переключить операторы выдачи на экран - на выдачу в указанный файл.

Пример 5.2.

Если к примеру 5.1 добавить продукцию:

START:IF THEN B:REW('DDD.TXT') {= создать и открыть данный файл 'DDD.TXT' =}

T!:US1(Иван)

B:REW() {= закрыть файл =}

B:EDFILE1('DDD.TXT'); {= выдаст файл в редактор =}

Тогда операторы B:BK() и B:A(...) в продукции UR1 будут выдавать сообщения не на экран, а в файл. Люди с именем Иван будут выданы в вновь созданный файл DDD.TXT, который будет выдан в редактор. Если файл DDD.TXT уже был, то вначале он будет удален.

 

5.8. Создать окно.

Для выдачи файла B:EDFILE1('DDD.TXT') в любую часть экрана и для изменения его размеров используются окна. Перед B:EDFILE1(...) ставится оператор:

B:GETWINDOW(X1,X2,N1,N2,"текст")

Он создает окно следующего вида:

X1,X2 - координаты левого верхнего угла,

N1 - количество позиций в строке (всего из 78).

N2 - количество строк (всего их 21),

"текст" - текст в верхней части окна.

Например,

... B:GETWINDOW(1,3,78,21,"Люди с именем Иван:") B:EDFILE1('DDD.TXT')...;

Тогда файл DDD.TXT будет выдан на весь экран.

      

       5.9. Меню

Для построения меню используется оператор B:MENU(X1,X2,<риска>), где X1,X2 - координаты левого верхнего угла (не X1 позиция в строке, а X2 - номер строки), <риска> - число, указывающее на выделенный пункт меню.

Вначале используются операторы B:BK() и B:A(...), которые переключаются на выдачу в специальную внутреннюю память - B:REW(MEMORY) ... B:REW(). С их помощью формируется картинка, которая с помощью B:MENU(X1,X2,<риска>) выдается как меню. Причем первая строчка картинки - это запись в верхней рамке меню - его оглавление.

Пример 5.3.

START:IF THEN

B:REW(MEMORY)  {= переключение на выдачу в внутр. память =}

B:A("Студенты:")     {= заглавие меню =}

B:BK() B:A("1. Студент Иванов")

B:BK() B:A("2. Студент Петров")

B:REW()                   {= конец построения картинки =}

B:MENU(2,2,1)        {= выдается меню =}

B:HALT();

На экран будет выдано меню:

---- Студенты: -----

| 1. Студент Иванов  |

| 2. Студент Петров  |

Размер меню определяется размером строк - его пунктов. Каждый пункт должен начинаться с первой позиции. Если пункт больше размера экрана, то он размещается на нескольких строках.

Пример 5.4.

Если к примеру 6.1 добавить продукцию:

START:IF THEN

B:REW(MEMORY)

B:A("Люди с именем Иван:")  {= заглавие меню =}

T!:US1(Иван)         {= построение пунктов меню =}

B:REW()

B:MENU(3,3,1);

Тогда на экран (в левом верхнем углу) будет выдано меню:

-- Люди с именем Иван: -----

| - Иван Иванов                         |

| - Иван Петров                          |

| - ...                                             |

При выборе N-го пункта меню в БЗ появляется фрагмент @@(N) и устанавливается параметр PAR(7,N). Например, при выборе п.2 будет @@(2) и PAR(7,2). При нажатии F2 - будет @@(F2) и PAR(7,2). Организация работы с меню - см. п.13.

5.8. Верхний и нижний регистры.

 Для выдачи на экране сообщения в виде строки используется оператор: B:LINES(<первая позиция в строке>,<номер строки>). Сообщение формируется в MEMORY:

... THEN B:REW(MEMORY)  B:A("<текст>") B:REW() B:LINES(1,1);

На экран (с первой позиции первой строки) будет выдан <текст>. Если использовать B:LINES(1,25), то <текст> будет выдан в нижней строке. Такие операторы служат для выдачи различных сообщений, касающихся задачи и хода ее решения.

5.9. Другие операторы в ПЧ.

А) Оператор удаления фрагментов с указанным именем.

B:DELFR(@@) - удалить из БЗ все фрагменты с именем @@, т.е. @@(...) @@(...,...) и др. Например, оператор B:DELFR(ИМЯ) удалит из БЗ имена всех людей.

Б) Оператор создания новой вершины (внутрисистемного кода) в БЗ - B:NEW(X1). Например, продукция

IF ... THEN B:NEW(X2) B:NEW(X3) БРАТ(X2,X3) ....;

создаст внутренние коды 1+ и 2+, соответствующие ранее неизвестным людям, и свяжет их отношением БРАТ(1-,2-). Этот оператор будет использоваться для выделения зон, см. п.15.

В) Оператор удаления файла из текущей директории -

B:DELFILE(<имя файла>)

Г) Установка цвета слов при выдаче на экран:

B:COLT(<число от 1 до 15>) B:A("текст")

Например, B:COLT(10) B:A("текст") - ярко зеленый цвет текста,

11 - голубой, 12 - бордовый, 13 -красный, 14 - желтый, 15 - белый.

(Из монографии Кузнецова И.П., Мацкевича А.Г. Семантико-ориентированные системы

 на основе баз знаний. Связьиздат М, 2007 г.- 1-я часть описания)