Journal influence
Bookmark
Next issue
Abstract:
Аннотация:
Authors: V.O. Georgiev (VOGeorgiev@kpfu.ru) - Academy of Sciences of the Russian Federation, Kazan (Volga region) Federal University (Expert of the PAS, Senior Lecturer), Moscow, Kazan, Russia, Ph.D, () - | |
Page views: 8046 |
Print version |
Современный этап развития программного обеспечения вычислительных машин характеризуется широким распространением диалоговых систем (ДС), обеспечивающих возможности эффективного решения трудноформализуемых задач и средства оперативного взаимодействия пользователя с системой. Большое многообразие классов решаемых задач и быстрое развитие-возможностей вычислительных средств стимулируют процессы появления все новых и новых ДС. Последнее обусловливает необходимость применения адекватных технологических средств и методов, позволяющих повысить качество и сократить сроки разработки создаваемых ДС. Интересным с этой точки зрения представляется трансформационный подход, получивший достаточно широкое распространение в технологии разработки программных систем [3]. Суть этого подхода сводится к возможности автоматизированного преобразования программ (или соответствующих спецификаций) по заданной системе правил с целью эффективного создания новых программ или их оптимизации. Представляемые средства и концепции апробированы в процессе разработки ряда коммерческих и экспериментальных ДС в области САПР, обработки больших информационных материалов на основе СУБД FOXBASE, автоматизации обучения с применением средств визуального моделирования [1, 2J. Упомянутые системы функционируют в операционной среде MS DOS на персональных компьютерах, совместимых с IBM PC. Имеются варианты реализации для больших ЭВМ на основе операционной системы ОС СВМ. КОНЦЕПТУАЛЬНЫЕ ОСНОВЫ ПРОГРАММНЫХ ТРАНСФОРМАЦИЙ Основываясь на общепринятой терминологии, под трансформационным подходом к технологии разработки программных систем будем иметь в виду создание инструментария для автоматического преобразования программ (программных спецификаций) посредством специальной системы соотношений. Целью таких преобразований является эффективное создание программ на основе уже созданных или автоматическое извлечение программ (синтез) из соответствующих спецификаций. В частности, трансформационные преобразования используются для оптимизации программ путем удаления лишних конструкций, оптимизации циклов и т.п. Концептуальные основы этого подхода представлены в [3]. Основу трансформационных преобразований составляет система соотношений. Базовые соотношения такой системы изложены в [3]. Это соотношения, определяющие такие правила преобразования программ, как конкретизация, упрощение, разъединение, устранение ненужного, вытекающего из формализма рекурсивных программ. Реализация трансформационного подхода в виде соответствующего инструментария требует формализации основных (базовых) конструкций, используемых при программировании. Одним из подходящих для этой цели является формализм Хоора [5]. Суть этого подхода сводится к следующему. Через х, у, ... обозначим состояние переменных до выполнения некоторой программной конструкции Р, а через х', у', ... — состояние переменных после выполнения (под состоянием переменных здесь имеется в виду таблица значений переменных). Тогда для спецификации такой конструкции можно использовать предикат *Р р(х, у, ..., х', у', ...), показывающий, как изменились значения переменных х, у, ... после выполнения конструкции Р. В дальнейшем ограничимся рассмотрением только двух переменных х, у (все последующие рассуждения легко переносятся на случай любого числа переменных). Тождественный оператор IDENT = df(x = х') & (у = у'). Передача сообщений через каналы реализуется двумя командами: с!т - вывод сообщения т в канал с; d?x - прием сообщения из канала d в переменную х. Причем взаимодействие носит синхронный характер. То есть, выполнение команды вывода сообщения в канал в одном процессе должно сопровождаться одновременным приемом этого сообщения из того же самого канала в другом процессе. Каждому каналу с ставится в соответствие специальная переменная с, принимающая значение "true", если соответствующий процесс готов к взаимодействию через канал с, и значение "False" — в противном. Под состоянием канала с по отношению к рассматриваемому процессу будем иметь в виду последовательность сообщений <ml, m2, ..., mk>, переданных через этот канал, начиная с момента начала функционирования данного процесса до некоторого фиксированного момента времени его работы. Последнее будем обозначать: с = <ml, m2, ..., mk>. Если с = < >, то это будет означать, что через канал с не передано ни одного сообщения. Отсюда при спецификации конструкций, предусматривающих выполнение команд взаимодействия, наряду с обычными переменными будем рассматривать канальные переменные. По аналогии с приведенными выше определениями, для простоты изложения ограничимся рассмотрением двух канальных переменных end. Пустой процесс Е =■ df(c = <>) & (d = <>) Содержательно конструкция Е определяет начальное состояние взаимодействующего процесса, предусматривающего использование каналов с и d. В определенном смысле конструкция Е аналогична тождественному оператору. Вывод (вывод сообщения е в канал с) с!е; Р = df(->De) V (Е & с) V (с> <е>) & (с: = tail(c); P), где De - область определения выражения е, tail(c) - последовательность, получающаяся из с удалением первого элемента. Ввод (ввод сообщения аз канала d в переменную х). d?x; Р = df Е & d V (х: = head(d); d; = tail(d); P), где head(d) - первый (головной) элемент последовательности d, a tail(d) — результат удаления головного элемента из последовательности d. Альтернативная композиция Пусть Р и Q спецификации конструкций, начинающиеся с команд ввода или вывода. Тогда: (PDQ) = df(E & Р & Q) V n(E)&(PVQ) Содержательно результат операции PoQ описывает процесс, в начальный момент функционирования которого процессы со спецификациями Р и Q готовы к взаимодействию через соответствующие каналы. Однако после выполнения одной команды ввода/вывода выполняется процесс, следующий за командой (Р или Q). ОСНОВНЫЕ ПРИНЦИПЫ ПОСТРОЕНИЯ ДС СЦЕНАРНОГО ТИПА Существующие в настоящее время ДС можно подразделить на следующие два типа: 1) Специализированные ДС - системы с встроенным диалогом, с ориентацией на решение задач из определенной узкоспециализированной проблемной области; 2) Унифицированные {в той или иной степени) ДС, настраиваемые на различные классы задач на основе соответствующих описаний предметной области, или, так называемых специфика ций сценарного типа. В отличие от ДС с жестким диалогом, ограниченных, как правило, определенной предметной областью, ДС второго типа представляют пользователю более широкие возможности, поскольку изменение предметной области диалога не требует полной перегенерации (перетрансляции) системы. Модификация системы обеспечивается путем ввода нового сценария, определяющего схему диалогового взаимодействия (структуру и содержание диалога), состояние диалога и соответствующие, запускаемые в диалоге процедуры (функции). Дадим формализованное определение сценария диалогового взаимодействия и ДС сценарного типа. Сценарий диалога представим в аиде списка S = (si, s2, ..., sn), где si (i = l,n) - элементы сценария. Структуру элемента сценария определим, исходя из следующего. Функционирование большинства ДС сводится к следующим основным действиям: вывод сообщений (вопросов) системы; ввод сообщений пользователя; запуск модулей (функций), выбираемых в соответствии с сообщениями пользователя и ус ловиями выбора; выбор последующих путей продолжения (или завершения) диалога, определяемый сообще нием пользователя и задаваемым условием (схемой) выбора. Отсюда состояние ДС для каждого шага диалогового взаимодействия определяется значением переменной, которой присваивается сообщение пользователя (пусть это будет переменной х) и списком s = (М, Р, N, T, R, S'), где М - описание сообщения ДС, выдаваемого на определенном шаге диалога. Описание сообщения ■ может иметь достаточно сложную структуру, содержащую такие элементы, как формат сообщения, непосредственно саму информацию для вывода и т.п. (форма описания М здесь не уточняется, поскольку для разных ДС она может определяться по-разному); Р = (pi, р2, ..., pll) — альтернативный список процедур (функций) pi (i = 1, 11), из которых в зависимости от сообщения пользователя выбирается одна для выполнения; N = (nl, п2, ..., nm) - список целых положительных чисел ni (i = 1, m), определяющий нумерацию последующих шагов диалога, выбираемых в зависимости от сообщения пользователя х (выбор пути, соответствующего ni = 0, будет означать завершение диалога, все остальные ni>0, i = 1, m); Т = (Nt, В) - задает схему (алгоритм) выбора номеров последующих шагов диалога, где NT -номер соответствующей схемы, а В - логические условия, ее определяющие. Схемами (определение схем будет дано в дальнейшем) интерпретации сценария являются: Nt = 0. Финальная конструкция "STOP (завершение диалога). Nt = 1. Схема выбора "к -»■ к+1" ("следующий"). Nt = 2. Последовательная интерпретация элементов. Nt = 3. Схемы типов: "if- then - else". Nt = 4. "case", предусматривающая выбор альтернативных шагов диалога, в зависимости от списка условий В. Nt = 5. "while - do". Nt = 6. "repeat - until". Nt = 7. "CALL". R — область определения ввода, определяющая диапазон возможных вариантов ответа пользователя; компонента S' определяет вызов вложенного сценария. Использование компоненты S' в определении элемента сценария требует конкретного пояснения. Диалоговые сценарии могут быть одноуровневыми или вложенными. Элементы сценария одноуровневого типа полностью определяются списком s = (М, Р, N, T, R). Вложенные сценарии строятся с помощью вызова подсценариев, для этого в соответствующем элементе (макроэлементе) задается ссылка на подсценарий (S'). При обработке макроэлемента выполняется вызов интерпретатора сценариев, на вход которого подается сценарий S'. В этом случае прерывается интерпретация текущего сценария, обеспечивается сохранение состояния текущего диалога и продолжение диалога по новому сценарию S'. После завершения всего цикла диалога по сценарию S' восстанавливается ранее прерванный диалог. ДС сценарного типа представляется в виде пары DS = (il, S), где П - набор программных модулей (программная часть), a S - сценарий диалога, являющийся входным параметром для программной части П. Функционирование диалоговой системы в этом случае сводится к интерпретации задаваемого сценария. Дадим описание алгоритмов функционирования ДС сценарного типа. Пусть s = (М, Р, N, Т, R, S') - список составляющих элемент сценария. Определим функции : element (L, k) = df if к = 1 then head (L) else element (tail(L), k-1), где L - некоторый список, message (S, k) = df element(element(S, k), 1) proc (S, k) = df elementalement(S, k), 2) numb (S, k) = df element(element(S, k), 3) type (S, k) = df element(element(S, k), 4) typent (S, k) = df head (type(S, k)) typeb (S, k) = df head (tail(type(S, k))) range (S, k) = df element(element(S, k), 5) macro (S, k) = df element(element(S, k), 6), то есть каждая из функций "message", "proc", "numb", "type", "range", "macro" конкретизирует M, P, N, T, R и S' на соответствующем шаге диалога (mesage(S, k) = M, proc(S, k) = P, numb(S, k) = N, type(S, k) = T, range(S, k) = R, macro(S, k) — S'), причем функция "macro" задействована только на этапе вызова вложенного сценария. Введем вспомогательные конструкции, используемые в последующем при определении функции "internext". seq(F, S, N, x) — df F(S, head(N), x); seq(F, S, tail(N), x), где F - некоторая функция, применяемая к одному из элементов сценария. whileseq(F, S, N, b, x) = df while b do seq(F, S, N, x) • В описании конструкций "element" и "inter" предполагается, что элемент с номером к всюду определен. repeatseq(F, S, N, b, x) = df repeat seq(F, S, N, x) until b, где конструкция "repeat" определяется как repeat Q until b = df Q; while -■ b jto Q cond(F, S, N, B, x) = df if В * nil then if head(B) then F(S, head(N), x) else cond(F, S, tail(N), tail(B), x) else SKIP Тогда алгоритм функционирования ДС сценарного типа можно представить функцией inter(S, к, х) (здесь S - сценарий диалога, к - фиксированный номер элемента сценария, определяющего стартовый шаг ДС, х - переменная, используемая для приема сообщений пользователя). Тогда": inter(S, k, х) = df if k*0 then (c.'message (S, к); inter1(S, к, х)) interlfS, k, x) = df d?(x, range(S, k)); inter2(S, k, x)) inter2(S, k, x) = df run(proc(S, k), x); internext(S, k, x)) Здесь: message(S, k) - функция выделения текста сообщения ДС (М), определяемого k-м элементом сценария S; c!message(S, к) описывает вывод сообщения ДС; d?{x, range(S, к)) описывает прием сообщения пользователя в переменную х в соответствии с диапазоном возможных вариантов ответа, определяемым к-м элементом сценария S (более строго функция определяется как ?(х, R) = df->RV?x); mn(proc(S, k), x) - описывает процесс запуска функции р из Р, определяемого k-м элементом сценария. Конструкция "run" и функция "message" здесь не уточняются, поскольку для разных ДС они могут определяться по-разному. Функция internext(S, k, х) определяет последующий путь продолжения диалога, определяемый сообщением пользователя И задаваемой схемой выбора. В соответствии с введенными схемами выбора (случай 0-7) конструкция internext(S, k, х) определяется следующим образом: 0) Случай typent(S, к) = 0 (конструкция "STOP"). Конструкция "internext" в этом случае определяет завершение диалога: internext(S, k, x) = SKIP 1) Случай typent(S, к) = 1 (Схема выбора "следующий"). В этом случае последующие шаги диалога определяются как: inter(S, k + 1, x); inter(S, k + 2, x); ..., где N = nil, В = nil. Отсюда: internext(S, k, x) = df inter(S, k + 1, x) 2) Случай typent(S, k) = 2 (последовательная схема выполнения). В этом случае последующие шаги диалога определяются как: inter(S, nl, x); inter(S, n2, x); ...; inter(S, nm, х), где N = (nl, п2, ..., nm), список условий В в данном случае не используется. Отсюда: internext(S, k, х) = df seqfinter, S, numb(S, к), х) 3) Случай typent(S.k) = 3 (условная схема выбора). В этом случае последующие шаги диалога определяются как: if b then inter(S, nl, x) else inter(S, n2, x), где N = (nl, n2), В = b - одно условие. Отсюда: internext(S, k, x) = df if typeb(S, k) then inter(S, head(numb(S, k)), x) else inter(S, head(tail(numb(S, k)), x) 4) Случай typent(S, k) = 4 (схема выбора типа "case"). В этом случае последующие шаги диалога определяются как do case case bl »■ inter(S, nl, x) case b2 • interfS, n2, x) case bm * inter(S, nm, x) end case где N = (nl, n2, ..., nm), В = (bl, b2, .... bn). Отсюда: internext(S, k, x) = df condfinter, S, numbfS, k), typeb(S, k), x) 5) Случай typent(S, k) = 5 (схема выбора типа "while-do"). В этом случае последующие шаги циалога определяются как: while b dfi (inter(S, nl, x); inter(S, n2, x); ...; inter(S, nm, x)) где N = (nl, n2, ..., nm), В = b - одно условие. Отсюда: internext{S, k, x) = df whileseq(inter, S, numb(S, k), typeb(S, k), x) 6) Случай typent(S.k) = 6 (схема выбора типа "repeat-until"). В этом случае последующие шаги диалога определяются как: repeat (inter(S, nl, x); inter(S, n2, x); ...; inter(S, nm, x)) until b где N = (nl, n2, .... nm), В = b - одно условие. Отсюда: internext(S, к, х) = df repeatseqfinter, S, numb(S, k), typeb(S, к), х) 7) Случай typent(S, к) = 7 (схема типа "CALL"). В этом случае последующие шаги диалога определяются как: inter(S, k, x); inter(S\ I, x); inter(S, к+1, х); ...; Отсюда: internext(S, к, х) = inter (mac го (S, к), 1, х); inter(S, к+1, х) При диалоговом решении задач часто возникают ситуации, связанные с выполнением действий, не предусмотренных соответствующими сценариями диалога. Последнее типично для большинства задач с трудноформализуемыми алгоритмами их решения, когда невозможно заранее полностью определить сценарий диалога. Такие ситуации требуют использования специальных средств управления диалоговым процессом. Здесь предлагаются к рассмотрению следующие функции: stop - для завершения ДС на любом шаге ее функционирования; back - для восстановления состояния, соответствующего предыдущему шагу выполнения ДС; функции-переключатели off и on для прямого и обратного переключения ДС с одного сценария на другой. Рассмотрим алгоритмы функционирования ДС с учетом перечисленных выше функций. Функция "STOP" inters(S, k, x) = df if k^O then(c! (mess age (S, k) + "stop"); intersl(S, k, x)) intersl(S, k, x) = df (d?(x, range(S, k); inters2(S, k, x)) (stop?any; SKIP) inters2(S, k, x) = df run (proc(S, k), x); internexts(S, k, x) В отличие от конструкции "inter" здесь к сообщению системы на каждом шаге диалога добавляется имя функции "stop", выполнение которой завершает функционирование системы. Для вызова функции используется канал stop, причем в конструкции stop?any не играет роли, какое значение получит переменная "any". Важным является сам факт выполнения команды "stop?any", реализующей функцию "stop". Выполнение этой команды возможно лишь в том случае, если предикат stop принимает истинное значение. При определении конструкции internexts для функции "STOP" необходимо заменить вхождение слова "inter" на "inters" в функции "internext". Функция "BACK" interb(S, k, x) = df if k^O then(c!(message(S, k) + "back"); interbl(S, k, x); interb(S, k, x)) interbl(S, k, x) = df (d?(x, range(S, k)); interb2(S, k, x))n (back?any; SKIP) interb2(S, k, x) =" df run (proc(S, k), x); internextb(S, k, x) Аналогична "STOP", но, в отличие от нее, выполнение функции "back" восстанавливает состояние предыдущего шага диалога. При определении конструкции internextb для функции "BACK" необходимо заменить вхождение слова "inter" на "interb" в функции "internext" Функция "OFF" interoff(Sl, kl, S2, k2, x) = df if k^O then (c!(message(Sl, kl) + "off"); mteroffl(Sl, kl,S2, k2, x)) interoffl(Sl, kl, S2, k2, x) = df (d?(x, range(Sl, kl)); interoff2(Sl, kl, S2, k2, x))C3(off?any; interon(S2, k2, SI, kl, x)) interoff2(Sl, kl, S2, k2, x) = df run (proc(Sl, kl), x); internextoff(Sl, kl, S2, k2, x) Аналогична предыдущим функциям, но, в отличие от них, функция off обеспечивает переключение диалогового процесса со сценария S1 на S2. Конструкция internextoff определяется иэ internext заменой вхождения слова "inter" на "interoff", заменой S и к на SI, kl и добавлением дву> новых аргументов S2 и к2. Функция "ON" Определение функции "ON" получается путем замены в приведенном выше описании все* вхождений слова "off" на слово "on" (interon). В отличие от функции "off, функция "on" обес-печивает обратное переключение на ранее прерванный диалог. ПРИМЕНЕНИЕ ТРАНСФОРМАЦИОННОГО ПОДХОДА В ТЕХНОЛОГИИ ПРОИЗВОДСТВА ДС Основным-преимуществом ДС сценарного типа по сравнению с жестко запрограммированным диалогом является возможность эффективной настройки на различные классы задач i определенной области без специального изменения программной части. Настройка системы осу ществляется изменением сценария диалога. Однако далеко не во всех случаях при модификации диалоговых процессов удается избежать необходимости соответствующего изменения программной части. Например, модификация диалоговой системы за счет включения схем выбора последующих шагов диалога и функций управления диалогом приводит к необходимости ее доопределения. Известно, что изменения программ системы требуют значительных усилий. В связи с этим возникает проблема эффективной модификации программной части ДС. Одним из способов решения этой проблемы является создание трансформационных средств, позволяющих осуществлять автоматизированное преобразование соответствующих программ по задаваемой системе трансформационных правил. Причем формирование такой системы трансформационных правил целесообразно осуществлять на уровне спецификаций, полагая, что преобразование одних спецификаций в другие вызовет адекватное изменение соответствующих программ. Например, для получения конструкции inters достаточно применить к соответствующим определениям конструкции inter следующие подстановки: clmessage(S, k)=s- c!(message(S, k) + "stop") (в определении конструкции inter) interl(S, k, x) =*■ interl(S, k, x)n<stop?any; SKIP) (в определении конструкции interl), а затем полученный результат переименовать, применив функцию переименования, например: Rename(inter => inters, interl => intersl, inter2=> inters2). Другим важным использованием трансформационного подхода является оптимизация программ. Применительно к диалоговым системам, с помощью трансформационного подхода можно получать из диалоговой системы сценарного типа DS = (£1, S) (S - сценарий диалога, £1 - программная часть) систему с жестко встроенным сценарием DS' = Q& (взятие проекции по сценарию S). Последнее целесообразно, если требуется многократное использование одного и того же сценария в диалоге, поскольку в этом случае достигается большая эффективность функционирования системы. В качестве одного из главных приложений трансформационного подхода будем рассматривать преобразование сценарного диалога (fi, S) в диалог с жесткой формой Us, где fis представляет собой пакет диалоговых программ, получающихся в результате взятия проекции пакета программ сценарного диалога il по заданному сценарию S. Метод взятия проекции по фиксированному сценарию S при неизменном начальном значении номера элемента сценария к сводится к следующему. Пусть заданы сценарий S и начальный номер элемента сценария к, с которого начинает функционировать процесс диалогового взаимодействия. Пусть функция f отображает объекты S, k, x в целое неотрицательное число, определяющее номер последующего элемента сценария в диалоге. Введем следующие обозначения: f°(S, к, х) = к f'CS, к, х) = f(S, к, х) f*(S, к, х) = f(S, f'CS, к, х), х) f"+'(S,k,x) = f(S, f"(S, к, х), х) Во избежание громоздких выкладок переопределим конструкцию inter(S, k, х) в виде: inter(S, к, х) = df F(S, к, х, inter(S, f(S, к, х),'х)), где функция F содержательно определяется идентично конструкции "inter". В результате проведения смешанных вычислений (псевдоинтерпретации) по отношению к определению конструкции inter с применением правил трансформации можно получить соотношения следующего вида: inter(S, k, х) - F(S, к, х, inter(S, f^S, к, х), х)) inter(S, ^(S, к, х), х) = F(S, f^S, к, х), х, inter(S, f^S, к, х), х)) inter(S, f-'(S, к, х), х) - F(S, f'(S, к, х), х, interfS, f(S, к, х), х)) inter(S, f'CS, к, х), х) = SKIP, где inter(S, f(S, к, х), х) определяет финальное состояние процесса диалога, а число п определяет номер соответствующего шага диалога (элемента сценария). Далее, & результате последовательного применения подстановки "снизу-вверх" получается соотношение вида: inter(S, к, х) = F(S, к, х, F{S, f'CS, к, х), х, F(S, f*(S, к, х), х, , F(S, f\S, к, х), х, SKIP)) ...), правая часть которого и определяет, по существу, проекцию конструкции "inter" по сценарию S и фиксированному начальному номеру элемента сценария. Продемонстрируем использование аппарата программных проекций для модели ДС сценарного типа.' Рассмотрим ее проекцию на конкретный сценарий S = (si, s2, s3, s4). Элементы сценария определены следующим образом (вложенность сценариев рассматривать не будем): si = (ml, pi, nl, tl, rl), где nl - nil, tl = (1, nil) s2 = (m2, P2, n2, t2, г2), где n2 = (4, 3), t2 - (3, Ь2) s3 = (m3, рЗ, пЗ, t3, гЗ), где пЗ = nil, t3 = (1, nil) s4 = {m4, p4, n4, t4, r4), где n4 = nil, t4 = (0, nil) В качестве трансформационных будем использовать следующие правила: конкретизация (подстановка числа в обе части определения функции); упрощение (замена терма его значением и устранение альтернативы у условного терма с известным условием); разъединение (замена обращения к функции ее правой частью); устранение ненужного (неиспользуемого) определения функции. Обозначим правую часть модели через T(S, k, х) 1) inter(S, к, х) = T(S, к, х) конкретизация 1) при к= 1 дает mter(S, I, x) = T(S, I, x), что означает: inter(S, 1, х) = c!message(S, 1); interfS, I, x) interl(S, 1, х) = d?(x, range(S, 1)); inter2(S, 1, x) inter2(S, 1, x) = run(proc(S, 1), x); internext(S, 1, x) typent(S, 1) = 1 internext(S, 1, x) = interfS, 2, x) message (S, 1) = ml range (S, 1) = rl proc (S, 1) = pi Применяя к полученным соотношениям правила упрощения, разъединения и устранения ненужного, имеем: 2) inter(S, 1, х) = clml; d?(x, rl); run(pl, x); inter(S, 2, х) конкретизация 1) при к = 2 дает inter(S, 2, х) = T(S, 2, х), что означает: inter(S, 2, х) = c!message(S, 2); inter(S, 2, х) interl(S, 2, х) = d?(x, range(S, 2)); inter2(S, 2, x) inter2(S, 2, x) = run(proc(S, 2), x); internext(S, 2, x) typent(S, 2) = 3 typeb(S, 2) = Ъ2 numb(S, 2) = (4, 3) internext(S, 2, x) = if typeb(S, 2) then inter(S, head(numb(S, 2)), x) else inter(S, head(tail(numb(S, 2))), x) message (S, 2) = m2 range (S, 2) = r2 proc (S, 2) = p2 Применяя к полученным соотношениям правила упрощения, разъединения и устранения ненужного, имеем: 3) inter(S, 2, х) = c!m2; d?(x, г2); гал(р2, х); if Ь2 then interfS, 4, х) else inter(S, 3, х) конкретизация 1) при к — 3 дает inter(S, 3, х) = T(S, 3, х), что означает: inter(S, 3, х) = c!message(S, 3); interl(S, 3, х) interl(S, 3, х) = d?(x, range(S, 3)); inter2(S, 3, x) inter2(S, 3, x) = run(proc(S, 3), x); internext(S, 3, x) typent(S, 3) = 1 internext(S, 3, x) = inter(S, 4, x) message (S, 3) = m3 range (S, 3) = r3 proc (S, 3) = p3 Применяя к полученным соотношениям правила упрощения, разъединения н устранения ненужного, имеем: 4) inter(S, 3, х) = c!m3; d?(x, r3); пт(рЗ, x); inter(S, 4, х) |
Permanent link: http://swsys.ru/index.php?id=1454&lang=en&page=article |
Print version |
The article was published in issue no. № 3, 1992 |
Back to the list of articles