ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Journal influence

Higher Attestation Commission (VAK) - К1 quartile
Russian Science Citation Index (RSCI)

Bookmark

Next issue

2
Publication date:
16 June 2024

The article was published in issue no. № 3, 1996
Abstract:
Аннотация:
Authors: Oparin G.A. (oparin@icc.ru) - Institute of System Dynamics and Control Theory SB of the Russian Academy of Sciences, Irkutsk, Russia, () -
Ключевое слово:
Page views: 8758
Print version

Font size:       Font:

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

Типичным представителем программных систем с такой организацией процесса решения задач являются вычислительные пакеты программ с функциональным наполнением в виде библиотек автономно компилируемых подпрограмм, написанных на базовых языках программирования Алгол, ФОРТРАН, Паскаль, C/C++, ассемблера и других. Конструирование схемы (плана) решения задач (СРЗ) в терминах имен структур данных и имен (п/п), а также дальнейшая реализация этой схемы средствами базового языка программирования - вот та рутинная деятельность, которая многократно выполняется пользователями библиотеки (п/п), отвлекает их внимание от решения проблемных задач и обоснованно требует автоматизации.

Эффективным средством углубленной автоматизации этой рутинной деятельности является технология на основе методов баз знаний и доказательного программирования [2]. В этом контексте специфика обозначенной проблемы проявляется в необходимости представления, накопления, отладки, согласованного обновления и использования больших объемов разнотипного знания, имеющего сложную структуру, в которой различаются слои так называемых алгоритмических, схемных и продукционных знаний. Каждый слой оперирует своим набором понятий. Иерархия слоев устроена так, что понятия продукционного слоя раскрываются через (имеют ссылки на) понятия схемного слоя, которые, в свою очередь, раскрываются через понятия алгоритмического слоя.

Алгоритмические знания играют фундаментальную роль в этой пирамиде знаний. Схемные и продукционные знания являются в определенном смысле вспомогательными и поддерживают комфортность общения исследователя с компьютером. Такого сорта базы знаний будем называть пакетами знаний, а сами знания - пакетными. Термин пакет знаний является производным от терминов пакет программ и база знаний и впервые употреблен в [5]. Специфика пакетов знаний по сравнению с традиционными базами знаний типа экспертных систем (в том числе и гибридных) проявляется еще и в том, что ответ на запрос к пакету знаний связан с процессом трудоемкого вычисления (не поиска) информации с предварительным синтезом плана вычислений в терминах понятий схемного и продукционного уровней, автоматической сборкой по этому плану расчетных программ из примитивов алгоритмического уровня.

Для накопления и использования знаний пакетного типа разработана серия инструментально-технологических комплексов (НТК), объединенных общим названием САТУРН и ориентированных на разные типы ЭВМ, операционных систем и базовых языков программирования. Ранние версии ИТК САТУРН были созданы для ЭВМ БЭСМ-6 с ОС ДИСПАК и базовыми языками программирования Алгол-ГДР и ФОРТРАН [б]. Позднее появился вариант НТК САТУРН для ЕС ЭВМ с ОС СВМ/ПДО (VM/CMS) и базовыми языками программирования ПЛ/1 и ФОРТРАН [3]. Для персональных ЭВМ ИТК САТУРН существует для ОС MS DOS и базовых языков программирования С/С++, ФОРТРАН и ассемблера [7]. В настоящей статье описывается версия языка SATL для представления и использования пакетных знаний в ИТК САТУРН, когда в качестве главного базового языка программирования используется объектно-ориентированный язык С++ [8].

ОСНОВНЫЕ ВОЗМОЖНОСТИ ЯЗЫКА SATL

Язык SATL предназначен для описания алгоритмических, схемных и продукционных знаний, а также для описания постановок задач (запросов) к пакету знаний. Рассмотрим подробнее каждый из перечисленных типов описаний.

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

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

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

Каждое правило реализует определенный метод развития наших знаний о сложноструктурированных иерархических ПО. В частности правило агрегирования определяет иерархию по составу и реализует процесс введения новых объектов как лаконичных обозначений совокупности ранее определенных объектов. Правилом обобщения устанавливаются связи, имеющие вид X:L®(X1, ..., Хk), где X - вновь определяемый объект - обобщение ранее определенных объектов X1, ..., Хk. С другой стороны, объекты Хi можно считать специализированными версиями объекта X. Операция L вырабатывает целочисленные значения в диапазоне от 1 до k, и в зависимости от значения L объект X замещается одним из объектов X1,..., Хk. Другие правила не требуют специального комментария.

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

Слоем продукционных знаний устанавливаются связи, имеющие вид P:L ®F. Связи такого сорта называются продукциями (Р - имя продукции) и интерпретируются следующим образом: логическая операция L описывает условие, необходимое для выполнения операции F. Вместо описания операций L и F естественно используются ссылки на соответствующие объекты схемы ПО.

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

Сконцентрированные в процессоре знания позволяют полностью отказаться от программирования на базовом языке, автоматически создавать расчетные программы для решения задач, постановки которых имеют вид:

ВЫЧИСЛИТЬ ИЗ <Х> ИСПОЛНИВ ,

где X, Y - соответственно множества входных и выходных параметров задачи, F- последовательность операций для получения Y из X.

Здесь элементы из Y, X, F принадлежат множеству базисных объектов ПО. Такая постановка задачи (ПЗ) называется полной. Полная ПЗ представляет схему решения задачи (СРЗ), согласно которой осуществляется собственно решение задачи.

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

ВЫЧИСЛИТЬ ИЗ <х> ИСПОЛНИВ ПРИ УСЛОВИИ

Символ ? означает неопределенность в помеченном этим символом элементе ПЗ или полное его отсутствие. Здесь в качестве Y,X,F допускается уже использование любых объектов ПО (а не только базисных). Q - ограничения видимости объектов процессора, позволяющие, например, выделить требуемое решение задачи в случае неединственности разрешающей схемы.

Такая ПЗ называется сокращенной. В зависимости от расположения неопределенностей в ПЗ различают процедурные (ИСПОЛНИТЬ ), непроцедурные (ВЫЧИСЛИТЬ ИЗ <Х?>) и комбинированные ПЗ (присутствуют все элементы ПЗ).

Процесс последовательного приближения сокращенной ПЗ к полной ПЗ называется планированием схемы решения задачи. Планирование осуществляется на основе представленных в процессоре схемных и продукционных знаний. Планирование выполняется на математической модели процессора [4], под которой понимается множество специальным образом организованных частичных функций (представляющих математические модели операций), реализующих отображение B(Z)-> B(Z), где Z - множество параметров процессора, B(Z) - булеан Z.

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

Статическое планирование осуществляется по многоступенчатой иерархической схеме в полном соответствии с определенной в описании схемы ПО иерархией составных объектов.

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

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

ОПИСАНИЕ ЯЗЫКА SATL

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

1)    Разрешено использование русских букв в идентификаторах.

2)    Введены несколько новых ключевых слов, которые нельзя использовать в качестве идентификаторов.

3)    Введен ряд новых языковых конструкций для определения специальных объектов и операторов, отличающихся по своей природе от существующих в С++.

4)    В тех местах, где в программе на языке С++ могут находиться определения объектов и операторов С++, там же могут находиться и определения специальных объектов и операторов языка SATL соответственно.

Использование языковых средств С++ для спецификации алгоритмических знаний

Существующие в языке С++ средства для спецификации функций (заголовки/прототипы функций) обладают набором возможностей для представления алгоритмических знаний на некотором минимальном уровне. Действительно, с помощью заголовков/прототипов функций можно определить:

-  имя п/п;

-  наличие и тип возвращаемого значения;

-  зависящий от языка способ вызова п/п (с помощью введенных в различные реализации С++ ключевых слов pascal/fortran, extern "С");

-  списки параметров с указанием типов параметров и возможностью их изменения (с помощью ключевого слова const).

Заголовки/прототипы функций можно использовать в качестве альтернативы (в начальном приближении) существующим в SATL средствам для представления алгоритмических знаний.

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

В качестве средства для спецификации параметра ПО используется специальная языковая конструкция для его определения:

PARAMETER

[CONST] TYPE() [=] [DISINTEGRATE],

где - набор стандартных атрибутов, задаваемых в следующей форме:

[KEY(] NAME() [)] [LASTMOD()] [ICON()]

где - уникальный ключ параметра ПО (от 1 до 8 символов), используемый для обращения к параметру ПО; - содержательное имя параметра (несколько слов, разделенных пробелами, всего не более 80 символов). Если атрибут не задан, то уникальный ключ формируется неявно по первым буквам содержательного имени параметра ПО;

- комментарий в виде текста, заключенного в " " или выражение С++ со значением типа char[ ]. Комментарий используется при необходимости получения детальной информации о семантике параметра;

- дата и время последней корректировки параметра (выражение С++ со значением типа TIMESTAMP, зависящем от реализации). Используется для временной привязки при работе с несколькими вариантами описания ПО.

Набор          стандартных          атрибутов

используется не только при описании параметра ПО, но и при описании других конструкций языка SATL;

<Т> - тип параметра. Язык SATL традиционно поддерживает ряд встроенных в него типов параметров: I2, I4, R4, R8, L1, L2, L4, которые соответствуют следующим типам языка C/C++: short int, long int, float, double, char, short int, long int (в языке ФОРТРАН это соответственно типы: INTEGER*2, INTEGER*4, REAL*4, REAL*8, LOGICAL*1, LOGICAL*2, LOGICAL*4). Традиционно поддерживаются и массивы перечисленных типов:

I2A, I4A, R4A, R8A, L1A, L2A, L4A, где <Х> - уточнитель в виде: [][F], где - число измерений (от 1 до 3), присутствие ключевого символа F указывает на способ размещения элементов массива в памяти, принятый в языке ФОРТРАН (то есть по столбцам). В вычислительных задачах, которые решались с помощью ранних версий НТК САТУРН, такого набора типов параметров вполне хватало, однако с тех пор потребности в новых, более мощных и гибких выразительных средствах для спецификации типов параметров значительно возросли, особенно с появлением объектно-ориентированных языков, таких как С++. Для наиболее полного удовлетворения возросших потребностей язык SATL допускает прямое использование (практически в полном объеме) средств спецификации типов языка С++. Таким образом, в качестве <Т> можно использовать спецификации массивов, структур, смесей, классов, записанных по правилам С++. При этом с помощью нового ключевого слова TYPE решается проблема: что должно стоять там, где согласно синтаксису С++ будет находиться идентификатор специфицируемого типа. Подобным образом ключевое слово VAR необходимо использовать там, где согласно языку С++ должен находиться идентификатор специфицируемой переменной. Ключевые слова TYPE или VAR можно опускать, если с них начинается или ими кончается спецификация типа параметра ПО.

Тип ранее определенного параметра ПО может быть использован в спецификации типа с помощью конструкции: TYPE(), где <Р1> - ключ ранее определенного параметра (или операции).

В качестве идентификаторов переменных, соответствующих ранее определенным параметрам (или операциям), может использоваться конструкция: VAR(), где <Р2> - ключ ранее определенного параметра (или операции). Конструкции TYPE() или VAR (<Р2>) могут использоваться не только при спецификации типа параметра, но и в любом другом месте программы, где С++ допускает нахождение идентификатора типа или переменной соответственно.

По правилам языка С++ в процессе спецификации типа могут появляться описания других, вложенных типов. Данное обстоятельство в SATL используется дня определения других, вложенных параметров ПО следующим образом: на месте нахождения вложенного типа следует применять конструкцию определения параметра (то есть PARAMETER ...). То же самое касается и вложенных функций, на месте которых можно применять конструкцию для определения операции.

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

Чтобы отменить действие ключевого слова DISINTEGRATE нужно на соответствующем уровне вложенности употребить ключевое слово INTEGRATE.

Для реализации правила обобщения, описанного ранее, при определении обобщающего параметра ПО в качестве <Т> может быть использована конструкция вида:

SELECT () { <Р1>, [<Р2>,...[<Рк>]]},

где - ключ ранее определенного параметра ПО целого типа, значения которого изменяются от 1 до k, <Р1>, <Р2>,...<Рп> - ключи ранее определенных параметров ПО, являющиеся специализированными версиями определяемого обобщающего параметра с ключом . Обобщающий параметр замещается при обращении к нему одним из параметров <Р1>, <Р2>,...<Рn>в зависимости от текущего значения параметра .

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

В некоторых специальных случаях в качестве <Т> может быть указан ключ ранее определенной операции. Такие параметры относятся к динамическим;

- начальное значение параметра (константа или константное выражение, записанное по правилам С++). Начальные значения обычно присваивают параметрам-константам (в определении которых присутствует ключевое слово CONST).

В качестве средства для спецификации операции ПО используется следующая языковая конструкция:

OPERATION

[PARMLIST() [DISINTEGRATE]]

CALL() [RETURN(

)] [LOGICAL ()],

где - список фактических параметров операции, задаваемый в виде:

<Е1>[,<Е2>[,...<Еn>]]],

где в свою очередь задается следующим образом:

[DISINTEGRATE][IN] [OUT] [*] [             ] [EXTRAORDINARY]

[INTEGRATE ]

или в виде:

[DISINTEGRATE]

INOUT [                               ]

[INTEGRATE ],

где - ключ ранее определенного параметра, участвующего в операции в качестве входного (если употреблено ключевое слово IN) и/или выходного (если употреблено ключевое слово OUT), передаваемого не через стандартный механизм передачи параметров С++ (если употреблено ключевое слово EXTRAORDINA-RY), передаваемого с помощью указателя (если употреблен ключевой символ *). Когда употреблено ключевое слово OUT и отсутствует ключевой символ *, то передача по указателю будет выбрана системой неявно, если тип параметра - не массив и если соответствующий формальный параметр не определен как ссылка;

, - ключи ранее определенных параметров одинаковых типов. В данном случае используется специальный механизм передачи параметров, когда одному и тому же формальному параметру соответствуют два фактических: и <Рк>. При этом значение только передается, а возвращаемое значение заносится в <Рк>. Вместо и <Рк> может быть указано слово FORMAL (смысл этого будет раскрыт ниже). Ключевое слово DISINTEGRAТЕ действует на параметры типа структуры или класса, заставляя его разложиться на элементы самого низкого уровня и в таком виде неявно подменить исходный параметр в списке фактических параметров. Ключевое слово DISINTEGRATE может быть указано для всего списка фактических параметров определяемой операции. В этом случае ключевое слово INTEGRAТЕ позволит защитить отдельные параметры от действия DISINTEGRATE;

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

Для реализации правила обобщения, описанного ранее, при определении обобщающей операции ПО в качестве может быть использована конструкция вида:

SELECT () { , [,...[]] },

где - ключ ранее определенного параметра ПО целого типа, значения которого изменяются от 1 до k, , ,...<Оk>- ключи ранее определенных операций ПО, являю- щихся специализированными версиями определяемой обобщающей операции. Обобщающая операция замещается при обращении к ней одной из операций , ,...<Оk> в зависимости от текущего значения параметра . При определении обобщающей операций ПО не требуется задавать другие атрибуты, кроме CALL, так как они выбираются автоматически из атрибутов текущей специализированной версии;

<Р> - ключ параметра, которому в результате выполнения определяемой операции будет присвоено возвращаемое значение. Вместо <Р> может быть указано ключевое слово FORMAL (смысл этого будет раскрыт ниже).

- номер выходного параметра из списка фактических параметров, который будет использоваться для записи значения вырабатываемого операцией логического результата (тип параметра должен приводиться к типу int). Номер 0 закреплен за параметром <Р> из атрибута RETURN. Параметры в списке фактических параметров нумеруются, начиная с единицы.

Операции можно вызывать на исполнение в любом месте программы, где только может находиться оператор С++. Вызов операции производится с помощью конструкции EXECUTE(), где - ключ вызываемой операции (или динамического параметра).

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

Знания об условиях применения операций ПО представляются в НТК САТУРН в виде продукций. Для определения продукций на языке SATL применяется следующая языковая конструкция:

PRODUCTION IF(<0)THEN(<0>),

где <С> - ключ логической операции (с определенным значением атрибута LOGICAL), проверяющей условия для применения операции с ключом (если после исполнения операции с ключом <С> ее логический результат не равен нулю, то имеются условия для применения операции с ключом ) или ключ логического параметра, ненулевое значение которого указывает на возможность применения операции с ключом .

Языковые средства для спецификации процессоров

Для определения процессора на языке SATL применяется следующая конструкция:

PROCESSOR

[PARNLIST( [, [,...[, <ЕРN>]]])] [DISINTEGRATE] OPERLIST( [,[,...[, <ЕОn>]]])][DISINTEGRATE] [PRODLISTX[,[,...[, ]]])][DISINTEGRATE],

где - элемент списка PARMLIST, задаваемый в форме:

[DISINTEGRATE ]

[                                ]

[INTEGRATE            ],

где <Рi> - ключ ранее определенного параметра, явным образом помещаемого в процессор;

- элемент списка OPERLIST, задаваемый в форме:

[DISINTEGRATE ]

[                                ]

[INTEGRATE             ],

где - ключ ранее определенной операции, явным образом помещаемой в процессор;

<ЕRi> - элемент списка PRODLIST, задаваемый в форме:

[DISINTEGRATE ]

[                                ]

[INTEGRATE             ],

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

Присутствие ключевого слова DISINTEGRATE в элементе списка , или означает неявное помещение в процессор:

•  всех параметров и операций, определенных как составные элементы структуры, смеси или класса параметра ;

•  всех параметров и операций, необходимых для решения задачи, ключ которой указан в атрибуте CALL операции , а также всех параметров и операций, определенных как составные элементы структуры, смеси или класс каждого из фактических параметров <Оi> (включая параметр из атрибута RETURN);

•  всех параметров и операций, определенных как составные элементы структуры, смеси или класс каждого из фактических параметров логической операции и операции, указанной в атрибуте THEN продукции Ri;

•  информация о структуре помещаемых таким образом в процессор параметров и операций.

Если ключевое слово DISINTEGRATE указано для всего списка, это означает, что действие ключевого слова DISINTEGRATE распространяется на все элементы списка, за исключением тех, которые помечены ключевым словом INTEGRATE.

Неявным способом в процессор помещаются все операции и параметры, участвующие в определении продукций, перечисленных в списке PRODLIST.

Каждая операция явно или неявно помещаемая в процессор, влечет за собой помещение в процессор всех параметров, участвующих в ее определении.

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

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

Языковые средства для спецификации постановок задач и их исполнения

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

TASK [PROCESSOR ()] [PARMLIST ()]

 [ACTION()] [RETURN([&]

)] [EXECUTE],

 

где - список параметров задачи, задаваемый в виде:

[<Е1> [,<Е2> [, ...[,<Еn>]]]] [??],

где в свою очередь задается в следующем виде:

 [&]

[IN] [OUT] [ ] [EXTRAORDINARY]

 [ * ],

где - ключ ранее определенного параметра, участвующего в условии задачи в качестве явно задаваемого входного (если употреблено ключевое слово IN) и/или выходного (если употреблено ключевое слово OUT), передаваемого через стандартный механизм передачи параметров С++ (если употреблено ключевое слово EXTRAORDINARY), передаваемого с помощью указателя или ссылки (если употреблен ключевой символ * или & соответственно). Для выходного параметра задачи передача по ссылке будет выбрана системой неявно, если тип параметра - не массив и если не указан ключевой символ *.

Ключевые символы ?? означают наличие неопределенности в определении остальных параметров задачи. Эта неопределенность может быть снята системой в процессе планирования задачи.

Ранее было отмечено, что при определении операции, у которой в атрибуте CALL указан ключ постановки задачи, в списке фактических параметров операции (и в атрибуте RETURN) допускается употребление ключевого слова FORMAL. Это означает, что вместо него неявно подразумевается подстановка ключа соответствующего параметра задачи из списка параметров задачи. Допустима и обратная подстановка, когда в списке явно заданных параметров подстановки задачи (или в атрибуте RETURN) вместо ключа параметра указано ключевое слово ACTUAL. При этом недопустима ситуация, когда в одной и той же позиции в списке фактических параметров операции и в списке явно заданных параметров задачи одновременно указаны ключевые слова FORMAL и ACTUAL соответственно. Недопустимо рассогласование типов параметров в обоих списках. При различном числе параметров в списке фактических параметров операции и в списке параметров задачи более короткий список увеличивается до длины более длинного путем неявного добавления из последнего элементов из соответствующих позиций. Без вызова из соответствующей операции запрещается самостоятельное исполнение задач, при определении которых использовалось ключевое слово ACTUAL.

При отсутствии в постановке задачи явно заданного атрибута PARMLIST по умолчанию подразумевается, что имеет значение ?? - все параметры задачи не определены и должны быть определены системой в процессе планирования задачи;

- явно заданный план решения задачи в виде тела функции, оформленного по правилам языка С++ (начальная и заключительная фигурные скобки обязательны) с расширениями языка SATL. В теле функции могут использоваться как явно заданные в постановке задачи параметры, так и параметры, помещаемые в список параметров задачи неявно (в процессе планирования), так, как будто соответствующие переменные являются формальными параметрами функции. Остальные параметры процессора могут быть использованы в теле функции в качестве локальных переменных (для этих параметров, как и для параметров из списка параметров задачи, следует применять конструкцию VAR(...) или TYPE(...)t если они используются в качестве идентификаторов переменных или типов соответственно).

В теле функции везде, где по правилам языка С++ допустим оператор, допустимо и использование конструкции EXECUTE() или EXECUTE(), где - ключ операции (или динамического параметра), <Т> -ключ постановки задачи, которые будут исполнены, как только получат управление (конструкция TASK ... с атрибутом EXECUTE является эквивалентом конструкции EXECUTE (<Т>), перед которой располагается определение постановки задачи <Т> с помощью конструкции TASK KEY () ... без атрибута EXECUTE. Если операция или постановка задачи <Т> содержат в своих списках параметров параметры, не входящие в процессор , они могут быть использованы в теле функции в качестве локальных переменных (с использованием конструкций VAR(...) или TYPE (...)). Перед исполнением операции или задачи должны быть вычислены все имеющиеся у них входные параметры (система автоматически следит за этим). В теле функции должен быть представлен алгоритм решения задачи, в процессе исполнения которого вычисляются значения выходных параметров задачи на основе значений входных параметров задачи.

В теле функции везде, где по правилам языка С++ допустим оператор, допустимо и использование конструкции вида:

?? [THROUGH()] [AVOID ()),

где <Х> - список ключей параметров и/или операций, через которые в этом месте должен пройти путь решения задачи, - список ключей параметров и/или операций, которые в этом месте не должны использоваться для решения задачи. Использование данной конструкции означает, что в том месте, где она находится, существует неопределенность в плане решения задачи. Эта неопределенность может быть снята системой в процессе планирования.

При отсутствии в постановке задачи явно заданного атрибута ACTION по умолчанию подразумевается, что имеет значение ?? - план решения задачи не определен и должен быть определен системой в процессе планирования задачи;

<Р> - выходной параметр задачи, в который заносится значение, возвращаемое через оператор return в теле функции, указанной в атрибуте ACTION (допускается выход из тела функции без использования оператора return, но с вычислением значения параметра <Р> в процессе решения задачи). Параметр <Р> неявно входит в список параметров задачи в качестве выходного. Символ & указывает на то, что возвращаемое значение может использоваться как ссылка. По правилам языка С++ это означает, что, если оформить вызов задачи на исполнение в виде: VAR (EXECUTE (<Т>)) или в виде: VAR (TASK KEY() ... RETURN (&...) EXECUTE), то данное выражение можно использовать в качестве lvalue (то есть в левой части оператора присваивания).

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

Представление алгоритмических знании осуществляется путем спецификации программных модулей (функций или подпрограмм) с использованием следующей языковой конструкции:

MODULE [PARMLIST )]

[RETURN([&]

)] [ACTION()] [TASK)]

 

[STANDALONE] [LANG()]

[SOURCE()] [LOADMOD()] [MAKE()],

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

[,][,...[,]]],

где - в свою очередь задается в следующем виде:

[&]

[IN] [OUT] [ ] [EXTRAORDINARY], [*]

где - ключ ранее определенного параметра, участвующего в модуле в качестве входного (если употреблено ключевое слово IN) и/или выходного (если употреблено ключевое слово OUT), передаваемого не через стандартный механизм передачи параметров С++ (если употреблено ключевое слово EXTRAORDINARY), а с помощью указателя или ссылки (если употреблен ключевой символ * или & соответственно). Для выходного параметра модуля передача по ссылке будет выбрана системой неявно, если тип параметра - не массив и если не указан ключевой символ *.

Ранее было отмечено, что при определении операции, у которой в атрибуте CALL указан ключ модуля, в списке фактических параметров операции (и в атрибуте RETURN) допускается употребление ключевого слова FORMAL. Это означает, что вместо него неявно подразумевается подстановка ключа соответствующего параметра модуля из списка формальных параметров модуля. Допустима и обратная подстановка, когда в списке явно заданных параметров модуля (или в атрибуте RETURN) вместо ключа параметра указано ключевое слово ACTUAL. При этом недопустима ситуация, когда в одной и той же позиции в списке фактических параметров операции и в списке явно заданных параметров задачи одновременно указаны ключевые слова FORMAL и ACTUAL соответственно. Недопустимо рассогласование типов параметров в обоих списках. При различном числе параметров в списке параметров операции и в списке параметров модуля более короткий список увеличивается до длины более длинного списка путем неявного добавления элементов из соответствующих позиций более длинного списка. Без вызова из соответствующей операции запрещается самостоятельное исполнение модуля, при определении которого использовалось ключевое слово ACTUAL.

Если программный модуль автоматически генерируется по заданной в атрибуте TASK постановке задачи, то в списке формальных параметров модуля вместо ключей параметров допустимо указывать ключевое слово FORMAL. Это означает, что в качестве формального параметра модуля будет использоваться параметр, стоящий на соответствующем месте в списке параметров используемой для генерации постановки задачи. Недопустимо рассогласование типов параметров в обоих списках. При различном числе параметров в списке параметров задачи и в списке формальных параметров модуля более короткий список увеличивается до длины более длинного путем неявного добавления из последнего элементов из соответствующих позиций. Без заданного атрибута TASK запрещается использовать ключевое слово FORMAL;

- тело функции, оформленное по правилам языка С++ (начальная и заключительная фигурные скобки обязательны) с расширениями языка SATL. В теле функции могут использоваться формальные параметры модуля, для которых следует применять конструкцию VAR(...) или TYPE (...), если они используются в качестве идентификаторов переменных или типов соответственно. В теле функции везде, где по правилам языка С++ допустим оператор, допустимо и использование конструкции EXECUTE() или EXECUTE()t где - ключ операции (или динамического параметра); <Т> - ключ постановки задачи, которые будут исполнены, как только получат управление. Атрибут ACTION несовместим с атрибутами TASK STANDALONE, SOURCE, LOADMOD, MAKE]

- ключ постановки задачи, на основе которой автоматически генерируется программный модуль. Если указано ключевое слово STANDALONE, то программный модуль генерируется в виде автономной головной программы (исполняемой без системы САТУРН). В противном случае программный модуль представляет собой подпрограмму (процедуру или функцию), вызываемую из других программ;

<Р> - выходной параметр модуля, в который заносится значение, возвращаемое модулем. Параметр <Р> неявно входит в список параметров модуля в качестве выходного. Символ & указывает на то, что возвращаемое значение может использоваться как ссылка. По правилам языка С++ это означает, что вызов модуля можно использовать в качестве lvalue (в левой части оператора присваивания);

- язык (по которому определяются правила вызова модуля и передачи параметров), задаваемый ключевыми словами СРР, С, FORTRAN или PASCAL, что соответствует языкам С++, С, ФОРТРАН или Паскаль.

- путь для исходного модуля, задаваемый в виде текста, заключенного в " ", или константное выражение С++ со значением типа char [ ];

- путь для объектного модуля или библиотеки объектных модулей, задаваемый в виде текста, заключенного в " ", или константное выражение С++ со значением типа char[ ];

<МАКЕ> - путь для исполнительного файла типа МАKE с опциями запуска (зависящими от реализации) для получения загрузочного модуля из исходного. Путь задается в виде текста, заключенного в " ", или константного выражения С++ со значением типа char[ ].

Непосредственный вызов модуля на исполнение может осуществляться через конструкцию EXECUTE(), где <М> - ключ модуля. В этом случае в качестве фактических параметров модуля будут использованы те, которые указаны в атрибуте PARMLIST и RETURN. Без вызова из соответствующей операции запрещается самостоятельное исполнение модуля через конструкцию EXECUTE (<М>), если при определении модуля использовалось ключевое слово ACTUAL;

Есть и другая возможность вызывать на исполнение модуль - воспользоваться существующими в С++ методами для вызова функции, где в качестве имени функции можно применять конструкцию VAR().

В заключение отметим, что ИТК САТУРН имеет дружественный пользователю, интуитивно понятный диалоговый интерфейс на основе окон, меню, пиктограмм и прочего, для работы с которым нет особой необходимости в подробном изучении синтаксиса языка SATL, достаточно иметь общее представление об основных идеях, принципах и понятиях, заложенных в основу функционирования ИТК САТУРН. С этой точки зрения описанием языка SATL можно пользоваться как справочником по части функциональных возможностей диалогового режима работы ИТК САТУРН.

Непосредственное использование языка SATL возникает при работе с ИТК САТУРН в пакетном режиме (режиме командной строки), а также при выгрузке из ИТК САТУРН накопленных знаний в формате языка для обеспечения переносимости или для получения твердых копий.

В настоящей статье не представлена важная составляющая часть языка SATL, связанная с управлением проектными данными. Эта компонента языка в ИТК САТУРН поддерживается средствами СУБД PQBASE [1], и ее описание составляет предмет отдельной публикации.

Работа выполнена при финансовой поддержке Российского фонда фундаментальных исследований (95-07-19045).

Список литературы

1.    Богданова В.Г., Журавлев А.Е., Опарин Г.А., Феоктистов Д.Г. Высокопроизводительная xBASE-совместимая СУБД с оптимизирующим компилятором входного языка и открытой архитектурой // Программные продукты и системы. - 1994. - № 2. - С. 18-21.

2. Ершов А.П. Научные основы доказательного программирования: Научн. сообщ. // Вести. АН СССР. - 1984. -№10.-С. 9-19.

3. Журавлев А.Е,, Опарин ГА. Диалоговая инструментальная система для автоматизации производства и эксплуатации комплексов пакетов прикладных программ на ЕС ЭВМ // Комплексы программ математической физики и архитектура ЭВМ. - Красноярск: ВЦ СО АН СССР. - 1988. -С. 114-128.

4. Опарин ГА. К теории планирования вычислительного процесса в пакетах прикладных программ // Пакеты прикладных программ. Методы разработки. - Новосибирск: Наука, 1981.-С. 5-20.

5. Опарин Г. А. Разработка и применение инструментальных средств для автоматизации конструирования и поддержки функционирования пакетов прикладных программ в области исследования динамики сложных управляемых систем: Автореф. дис. ... канд. физ.-мат. наук. -Новосибирск: ВЦ СО АН СССР, 1988.

6. Опарин ГА. САТУРН - метасистема для построения пакетов прикладных программ // Разработка пакетов прикладных программ. - Новосибирск: Наука, 1982. - С. 130-160.

7. Опарин ГА., Феоктистов Д.Г., Журавлев А.Е. Инструментальные средства построения и эксплуатации гибридных экспертных систем вычислительного типа // Вычислительные технологии. - Новосибирск: ИВТ СО РАН, - Т.2. -№.6. -С. 13-26.

8. Stroustrup В. The C++ Programming Langauge. Second Edition, Addison-Wesley Publishing Company, 1991. - 669p.


Permanent link:
http://swsys.ru/index.php?page=article&id=1082&lang=&lang=en
Print version
The article was published in issue no. № 3, 1996

Perhaps, you might be interested in the following articles of similar topics: