Принципы видимости шаблонов из текущего понятия

Е. М. Бениаминов

1. Основные определения

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

            Понятие – это модуль (фрагмент), в котором вводятся некоторые определения, имена областей (доменов), элементов этих областей, подобластей, отображений (операций) между областями и соотношения между ними. Для управления вычислениями в понятии могут вводиться правила переписывания. Для формирования пользовательского языка в понятии могут вводиться языковые конструкции пользователя и правила грамматики.

            Библиотека понятий или онтология – это база данных связанных между собой понятий. Каждое понятие имеет имя, текст и внутреннее представление.

            Имя идентифицирует понятие.

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

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

            Пользователь может выбрать и открыть доступные ему онтологии из пункта меню «База понятий»/«Открыть другую БП (базу понятий)». Пользователь может также скопировать любую открытую им онтологию (включая ядерную) в любую папку, отличную от системной (где лежит ядерная онтология), из пункта меню «База понятий»/ «Сохранить БП как..». Далее пользователь может добавлять в онтологию новые понятия и удалять старые, формируя собственную онтологию (базу понятий).

Текущее понятие (активное) – это то понятие, которое открыто пользователем как текущее, формируемое в текущий момент. Только к текущему понятию можно обращаются с вопросом.

Сделать текущим понятие, которое есть в данной базе понятий, можно открыв окно папок понятий из пункта меню «База понятий»/ «Показать папки понятий», выбрав в списке имен нужное понятие и нажав кнопку «Сделать текущим». Работа с текущим понятием осуществляется из пунктов меню «Текущее понятие» и «Команда».

            Понятие может быть также загружено в систему в качестве среды, и пользователь может  создавать новые понятия в среде загруженного понятия. Соответственно, отношение быть средой является отношением иерархии. Языковые средства (кроме тех, которые были объявлены локальными) и определения, введенные в понятии-среде, являются доступными для всех понятий, разработанных в этой среде.

            Кроме того, понятия могут использовать другие понятия. Использование другого понятия может быть определено в текущем понятии специальными командами-шаблонами, например, «Используем понятие @Имя_понятия» или «Используем текст понятия @Имя_понятия». Другой способ загрузки в текущее понятие другого понятия обратиться к нему через его внешний интерфейс понятия, определенный в виде набора шаблонов с внешним типом доступа. Языковые средства (кроме тех, которые были объявлены локальными) и определения, введенные в используемом понятии, становятся доступными в текущем понятии. Отношение использования между понятиями является транзитивным. Отношение быть средой является частным случаем отношения использования.

           

2. Способы ввода терминов и шаблонов языка

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

            Для просмотра доступных шаблонов и терминов онтологии в системе используется пункт главного меню «Словарь».

2.1. Ввод терминов

Шаблоны–термины могут вводиться пользователем с помощью системных шаблонов с аргументами типа «new». Примерами таких шаблонов являются некоторые шаблоны в папке шаблонов «Команды»/«Создание областей элементов и отображений» или в папке шаблонов «Команды»/«Ввод переменных». Это шаблоны: «@имя - область», «@имя - отображение», «@A_new - подобласть области @B», «@новый_элемент - элемент области @область», «@переменная : @тип_переменной» и т.д.

Выражение типа «new» -  это либо новое слово, либо любой текст в кавычках или в квадратных скобках.

            Использование  некоторых из этих шаблон можно найти, например, в базе понятий «Examples» в папке «Папки понятий»/«Особые примеры»/«Простой пример» в понятии «цвет».

 

                        Пример из базы понятий «Examples».

Текст понятия из «Папки понятий»/«Особые примеры»/«Простой пример»/ «цвет»  

   

[Цвета] - область.     

      "теплые цвета" < цвета.

  " холодные цвета" < цвета.  

    "Красный", "желтый" - элементы области теплые цвета.

    Пусть  зеленый, синий, белый - холодные цвета.

   Теплые цвета - подобласть области цвета.

   Холодные цвета < цвета.

  

   /*    Примеры вопросов к понятию:

   Элементы области цвета?

     Желтый вета?

     Оранжевый вета?

      Холодные цвета< цвета?

      Равны ли желтый  и оранжевый?

     

    */.

           

            Заметим, что в приведенном примере текст, заключенный между знаками «/*» и «*/» - это комментарий, игнорируемый системой, но используемый для пояснений. В ядре системы комментарием является также текст от знака %% до конца строки.

 

            Новые термины могут быть введены и с помощью шаблона равенства «@Новый_термин =@Старый_термин» или «@Старый_термин = @Новый_термин». При этом приравненные термины становятся синонимами.

                       

 

 

                        Пример из базы понятий «Examples».

Текст понятия из «Папки понятий»/«Особые примеры»/«Введение шаблонов»/ «Создание синонимов»/ «Синонимы для цвета»   

 

Используем понятие "цвет".

 оранжевый=желтый.

 %% Новый термин становится главным синонимом.

 

 %% Пример вопроса: Чему равно желтый?

 .

 

            Новые термины можно вводить  с помощью шаблонов введения синонимов:

«"@текст_синонима" - новый синоним @термин»,

«"@текст_синонима" - новый синоним @термина [@комментарий]».

 

 

                     Пример из базы понятий «Examples».

Текст понятия из «Папки понятий»/«Особые примеры»/«Введение шаблонов»/ «Создание синонимов»/ «Синонимы для цвета1»          

 

Используем понятие "цвет".

 

Апельсиновый - новый синоним желтый [Ярко желтый].

 

оранжевый - элемент области цвета.

желтый  - синоним оранжевый  .

 оранжевый=желтый.

 

 %% Если желтый не сделать синонимом оранжевого, но написать равенство,

 %% то при построении внутреннего представления по тексту понятия

%% система спросит: сделать ли термины синонимами,

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

 

 /* Примеры вопросов:

                     Чему равно желтый?

                     Элементы области цвета?

*/

 .

 

            С помощью шаблонов введения синонимии пользователь может изменить системные шаблоны для кавычек и выделения комментариев.

 

   Пример из базы понятий «Examples».

Текст понятия из «Папки понятий»/«Особые примеры»/«Комментарии»/ «Пример определения новых скобок комментария»

 

/* Это комментарий */

/* Введем новые скобки для комментария:           */

 

" < >" - новый синоним "[/*]  [*/]".

 

< Это комментарий в новых скобках>.

<*******************************************************************>

 

%% Это комментарий.

%% Введем новые скобки для комментария этого типа:

               "%  [

]" - новый синоним "[/*]  [*/]".

              

% Это комментарий в новых обозначениях  от знака процента до конца строки

.

%********************************************************************

%                                                                                                                                      *

%   C помощью шаблона синонимии можно изменить скобки для кавычек   *

%                                                                                                                                     *

%********************************************************************

 

["//"  "//"] - новый синоним ["[" "]"].      % Одинарные / будут конфликтовать

                                                                              %со скобками комментария /*  */

 

//два слова// - область.     % Проверка новых кавычек

.

  

   Для введения нового термина можно также воспользоваться шаблоном:

 

Заменить термин "@Термин" типа @Тип

на "@Новый_термин"

[@текст_пояснения],

 

который находится в  «Папки шаблонов»/ «Управление шаблонами».            Действие этого шаблона состоит в построении синонима термина и удаление самого термина из текущего понятия (внешние шаблоны не удаляются, а становятся недоступными из текущего понятия).

2.2. Ввод шаблонов   

            При вводе шаблона общего вида пользователи указывают вид шаблона, типы переменных в определяемом шаблоне, тип результата действия шаблона и само действие шаблона. При необходимости пользователи могут определить условие применения определяемого шаблона. Для ввода шаблонов пользователями имеется специальный шаблон в системе в паке шаблонов «Управление шаблонами» вида:

 

Введем шаблон "@текст_шаблона"

с переменными:

"@список_переменных"

и переменной результата " @переменная_:_Тип " ;

Пояснения: [@текст_пояснения]

Условие применения шаблона:

[@список_условий]

Действие шаблона:

[@действие]

Тип доступа шаблона:[@внешний_наследуемый_локальный]

 

            Тип доступа шаблона служит для управления видимостью шаблона. Локальный тип доступа означает, что вводимый шаблон будет видим только из понятия, в котором этот шаблон  вводится.

            Приведем пример ввода нового шаблона  Sum(@x1,@x2) для сложения чисел. Это делается с помощью выражения:

 

Введем шаблон " Sum(@x1, @x2)"

с переменными:

"x1, x2 : real"

и переменной результата " z: real";

Пояснения: [Сумма двух чисел, но не выражений.]

Условие применения шаблона:

[]

Действие шаблона:

[z=x1+x2]

Тип доступа шаблона: [локальный].

 

            Теперь, если вы введете в окне «Команда или вопрос» выражение «Sum(3,5)?» система поймет вас и выдаст в ответе число 8. Однако, если вы зададите выражение «Sum(3,5*2)?»  система выдаст сообщение об ошибке, так как выражение  5*2 имеет тип не real, а real_выражение.

            Если вы хотите, чтобы в качестве аргументов нового шаблона можно было бы использовать не только числа, а произвольные числовые выражения, нужно отредактировать (в главном меню выбрать пункт «Текущее понятие»/«Редактировать») предыдущий текст определения шаблона в виде:

 

Введем шаблон " Sum(@x1,@x2)"

с переменными:

"x1, x2 : real_выражение"

и переменной результата " z: real " ;

Пояснения: [Сумма двух чисел, но не выражений]

Условие применения шаблона:

[]

Действие шаблона:

[z=(x1)+(x2)]

Тип доступа шаблона:[локальный].

 

/* Пример вопроса:  3+Sum(3*2, 3^2)/3? */.

 

 

и запустить в главном меню пункт «Текущее понятие»/«Построить все».

Теперь система сможет производить любые арифметические вычисления с использованием нового шаблона. Например, если в окне «Команда или вопрос» вы введете выражение «3+Sum(3*2, 3^2)/3?», то система правильно вычислит это выражение. Данный пример можно найти в базе понятий «Examples» в папке «Папки понятий»/«Особые примеры»/«Введение шаблонов» в понятии «Пример правильного ввода шаблона для сложения».

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

 

 

 

Пример из базы понятий «Examples».

Текст понятия из «Папки понятий»/«Особые примеры»/«Введение шаблонов»/ «Пример условного шаблона деления »

 

Введем шаблон " @x1 div @x2"

с переменными:

"x1: слагаемое;  x2 : степенное real_выражение "

и переменной результата "z: слагаемое";

Пояснения: [Деление числа на число, неравное 0]

Условие применения шаблона:

[ ~x2==0]

Действие шаблона:

[z=(x1)/(x2)]

Тип доступа шаблона: [локальный].

 

            В этом примере условием применения шаблона является неравенство нулю первого аргумента.

            Вводимый шаблон может использоваться в определении действия самого шаблона, т.е. допустимо рекурсивное определение действия шаблона. Пример такого определения используется в понятии «Факториал» (см. онтологию «Examples», папку понятий «Особые примеры»/«Введение шаблонов»/ «Рекурсивные определения»):

 

                        /* Определение понятия факториал*/

Введем шаблон "fact(@n,@i,@y)"

с переменными:

"n,i,y :real_выражение"

и переменной результата " z:real_выражение  " ;

Пояснения: [Вычисляет факториал]

Условие применения шаблона:

[]

Действие шаблона:

[

if n==i then z=y else z=fact(n,i+1,(y)*(i+1))

]

Тип доступа шаблона:[локальный].

 

Введем шаблон "@n!"

с переменными:

"n :real"

и переменной результата " z:real  " ;

Пояснения: [Вычисляет факториал]

Условие применения шаблона:

[]

Действие шаблона:

[

z=fact(n,1,1)

]

Тип доступа шаблона:[внешний].

 

Более короткий вариант определения факториала имеет вид:

 

 

Введем шаблон "factorial(@n)"

с переменными:

"n :real_выражение"

и переменной результата " z:real_выражение  " ;

Пояснения: [Вычисляет факториал]

Условие применения шаблона:

[]

Действие шаблона:

[

if n==1 then z=1 else z=(factorial(n-1))*(n)

]

Тип доступа шаблона:[внешний].

 

Дополнительные скобки в выражении (factorial(n-1))*(n) введены для того, чтобы можно было применить шаблон умножения @*@ к  factorial(n-1) и n, которые имеют тип real_выражение.

Удаление шаблонов можно выполнить с помощью шаблона:

Удалить шаблон "@текст_шаблона"

с переменными типа:

"@список_переменных"

и типом результата  @Тип.

            Например, для удаления шаблона factorial(@) можно ввести командную строку в окне «Команда или вопрос» вида:

Удалить шаблон " factorial(@k)"

с переменными типа:

"k : real"

и типом результата  real.

            Эта команда на самом деле не удаляет шаблон из системы (если только текущим понятием не является то, в котором это понятие было введено), а делает его невидимым из текущего понятия. После выполнения этой команды  она будет отражена в тексте текущего понятия, и этот шаблон будет невидим из текущего понятия при вводе последующих команд.

            Тот же результат получается, если в меню «Словари» выбрать словарь, а в словаре выбрать шаблон

factorial(@n) и нажать кнопку удалить.

            Для замены (редактирования) шаблона можно воспользоваться шаблоном:

Заменить шаблон "@текст_шаблона"

с переменными:

"@список_переменных"

и типом результата  @тип

на [@Новый_шаблон_с_теми_же_переменными]

и пояснением [@текст_пояснения].

            При этом в новом шаблоне должны быть те же переменные, но могут быть в другом порядке. Этот шаблон производит удаление старого шаблона (в том же смысле, как было объяснено выше) и вводит новый шаблон с тем же действием. Примеры использования этого шаблона приведены в онтологии «Examples» в папке понятий «Введение шаблонов»/ «Примеры создания среды с измененными шаблонами».

 

 

3. Видимость шаблонов

            Принципы видимости отражены на рис.1 и могут быть перечислены в следующем виде.

1. Из текущего понятия видны все термины и шаблоны, введенные в этом понятии и не удаленные в последующих предложениях.

            2. Из текущего понятия видны все термины и шаблоны (за исключением тех, которые были объявлены как локальные), введенные в понятиях, используемых в текущем понятии, и не удаленные в последующих предложениях.

            3. Шаблоны, определенные как внешние, видны из текущего понятия только те, которые введены в понятиях, построенных в  средах, используемых в текущем понятии.

            4. При удалении шаблонов, не введенных в текущем понятии, шаблоны не удаляются, а становятся невидимыми из текущего понятия.

 

            Системные шаблоны введены в ядре системы, которое является частью среды для любого понятия. Поэтому шаблон ядра системы виден из любого текущего понятия, если только в самом текущем понятии или в его среде (или части среды) не удален (или заменен) этот шаблон.

            Для перевода системных шаблонов на английский, французский или немецкий языки можно, например, построить понятия в среде ядра системы с именами «English», «French» или «German», в  которых переводятся на соответствующий язык системные шаблоны. Далее, используя построенные понятия в качестве среды, появляется возможность работать с системными шаблонами на разных языках. Если потребуется в некотором понятии работать с системными шаблонами на двух языках, например английском и французском, одновременно, то в это понятие (или его среду) можно подгрузить понятия  «English»и «French», и тогда это станет возможным.

            Объявление понятий в качестве сред, может использоваться для организации разделов онтологий со своими вариантами понятий и шаблонов языка. Так, в среде ядра системы можно построить понятия «Алгебра», «Механика», «Системные примеры», «Бениаминов», которые будут содержать лишь тексты комментариев. Если эти понятия использовать в качестве сред для последующих понятий, то мы получим соответственно  разделы понятия алгебры, механики, системных примеров, Бениаминова, и шаблоны, введенные в одном разделе, не будут видны из понятий другого раздела. С другой стороны, внешние шаблоны, введенные в понятиях одного раздела видны из понятий этого же раздела. Если в текущем понятии требуется открыть доступ к шаблонам некоторого раздела, например алгебры, то, добавив команду «Используем понятие [Алгебра]», из текущего понятия открывается доступ к внешним шаблонам, введенным в понятиях раздела  «Алгебра».

 

 

            Для каждого вводимого внешнего шаблона типы его  аргументов и тип результаты должны быть видимы в среде понятия, в котором вводится этот шаблон. Тогда, когда будет видим сам шаблон, то будут видны и доступны типы его аргументов и результата.

                       

4. Вычисление шаблонов и принципы загрузки понятия

            В этом разделе описывается, что происходит при выполнении команды сделать некоторое понятие текущим, при сохранении текущего понятия, а также при загрузке другого понятия в текущее при его использовании.

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

            Из текущего понятия, как было объяснено в предыдущем разделе, видны не все шаблоны языка, а только те, которые составляют язык контекста текущего понятия. Пользуясь этими шаблонами в специальном окне «Новая команда или вопрос» пользователь системы может сформировать текст команды или вопроса и запустить процесс обработки сформированного текста.

            При обработке текста команды или вопроса запускается программа грамматического анализа, которая по доступным из текущего понятия шаблонам языка и отношения между типами во внутреннем представлении понятия строит терм текста. Далее терм текста обрабатывается программой вычисления терма, которая последовательно производит вычисления по дереву терма, в вершинах которого стоят идентификаторы шаблонов.

            При вычислении выражения, содержащего внешний шаблон, в текущее понятие загружается (если еще было не загружено) понятие, в котором этот шаблон был введен. При вычислении выражения, содержащего шаблон с загруженным в текущее понятие описанием его действия, выполняется действие шаблона в соответствии с его определением. При этом если тип всего выражения является вопросом, то после получения ответа на вопрос и его отображения в окне «Ответ на вопрос» происходит откат к состоянию текущего понятия до построения ответа на вопрос. Если тип обрабатываемого выражения – предложение, то это предложение вносится в текст текущего понятия и сохраняется новое состояние внутреннего представления текущего понятия в оперативной памяти (но не в базе понятий).

            Для сохранения нового состояния (новой версии) текущего понятия в базе понятий пользователь должен выбрать сохранения текущего понятия в главном меню «Текущее понятие»/«Сохранить» или «Сохранить как». Если сохраняется новая версия понятия, то кроме сохранения самого понятия в базе понятий из словаря внешних шаблонов удаляются внешние шаблоны, введенные в прежней версии понятия, и сохраняются  внешние шаблоны, введенные в новой версии.

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