Визуальное программирование

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

Новая реализация Акторного Пролога поддерживает визуальное программирование в нотации SADT (Structured Analysis and Design Technique), известной также как IDEF0. Для создания исходных SADT диаграмм можно использовать любые диаграммеры, поддерживающие формат IDL (такие как BPwin (TM) PLATINUM technology, Inc. или Design/IDEF (TM) Meta Software Corporation). Интерпретатор транслирует SADT диаграммы в текст на Акторном Прологе. Кроме того, на основе исходных диаграмм автоматически создаётся графический интерфейс пользователя в стиле SADT. Это средство языка позволяет практически "на лету" создавать визуальные оболочки экспертных систем, интеллектуальных агентов и других приложений.

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

Рассмотрим пример _Direct1.A в каталоге SADT.

Пример 1. Передача прямых сообщений между блоками SADT диаграммы.

Начнём с рассмотрения диаграмм. Следуя правилам SADT, мы включили в нашу модель две диаграммы. Первая из них - так называемая "обобщающая" диаграмма. Вторая - диаграмма "верхнего уровня". Обе диаграммы хранятся в текстовом файле _Direct1.IDL, который интерпретатор автоматически загрузит вместе с исходным файлом _Direct1.A и файлом определения диалоговых окон _Direct1.DLG.



Рис. 1.1. Обобщающая диаграмма SADT.

Вторая диаграмма рассматриваемой SADT модели:



Рис. 1.2. SADT диаграмма верхнего уровня.

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

-------------------------------------------
-- An example of Actor Prolog program.   --
-- (c) 2002, Alexei A. Morozov, IRE RAS. --
-- Transmitting of direct messages       --
-- between blocks of SADT model.         --
-------------------------------------------
class 'Sender' specializing 'Dialog':
--
entry_o1;
value_o1;
--
identifier      = "Control";
--
text;
--
[
goal:-!.
--
action("send"):-
        entry_o1 ? user_message(text).
]
-------------------------------------------
class 'Receiver':
--
entry_i1;
value_i1;
--
con;
--
[
goal:-!.
--
show(_):-!,
        con ? show.
--
Message:-
        con ? show,
        con ? writeln(
                "I have received "
                "a message:"),
        con ? set_color('Blue'),
        con ? writeln(Message),
        con ? set_color('Black').
]
-------------------------------------------

Прежде всего, обратите внимание, что в программе нет определения целевого утверждения, а также каких-либо определений процессов. Всё это будет создано в результате трансляции описания SADT диаграммы _Direct1.IDL. В тексте программы определены только два класса 'Sender' и 'Receiver', которые будут автоматически использованы в определениях процессов и связаны необходимыми "коммуникациями" для передачи сообщений. Обратите внимание, что имена классов должны соответствуют именам блоков SADT модели.

Устройство классов 'Sender' и 'Receiver' будет подробно рассмотрено ниже. А сейчас мы просто запустим программу и посмотрим, как она работает.



Рис. 1.3. Визуальный интерфейс в стиле SADT.

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



Рис. 1.4. Просмотр SADT диаграмм.

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



Рис. 1.5. Просмотр комментариев SADT диаграммы.

Нажмите левой кнопкой мыши на блок "Sender". Процесс Sender откроет диалоговое окно, в котором можно задать текст сообщения для блока "Receiver". Введите текст сообщения и нажмите кнопку "Send message". Переданное сообщение появится в текстовом окне процесса Receiver.



Рис. 1.6. Передача прямых сообщений между блоками.

Вернёмся к рассмотрению текста программы. Класс 'Receiver' печатает в текстовом окне con прямые сообщения, приходящие извне.

Message:-
        con ? show,
        con ? writeln(
                "I have received "
                "a message:"),
        con ? set_color('Blue'),
        con ? writeln(Message),
        con ? set_color('Black').

Обратите внимание, что значение слота con в классе 'Receiver' не указано. В ходе трансляции SADT модели значение этого слота (некоторое текстовое окно, расположенное вблизи блока "Receiver" диаграммы верхнего уровня) будет автоматически задано в соответствующем конструкторе экземпляра класса 'Receiver'. Предикат show класса 'Receiver' показывает это текстовое окно на экране.

show(_):-!,
        con ? show.

При нажатии левой кнопкой мыши на блок визуального интерфейса программы, соответствующий процесс получает сообщение show(Имя_блока). Следовательно, при нажатии на блок "Receiver" визуального интерфейса, процесс Receiver получит сообщение show и откроет окно con.

Класс 'Sender' является потомком предопределённого класса 'Dialog', реализующего управление диалоговыми окнами. При нажатии на блок "Sender" визуального интерфейса, процесс Sender получит сообщение show, которое откроет диалоговое окно в соответствии с определением, заданным в файле _Direct1.DLG:

grid(80,25)
--
window_font("Arial",14)
diagram_font("Arial",17)
dialog_font("Arial",14)
--
dialog "Control" (
     "Sender control panel",
     white,blue,default,
     centered,centered,default)
vbox(center)
     hbox
          "&Message "
          edittext(text,10,1,"Hello")
     end_of_hbox
     hbox(center)
          button("send","&Send message")
          button(close,"&Close dialog")
     end_of_hbox
end_of_vbox
end_of_dialog

При нажатии на кнопку "Send message" диалога, процесс получит сообщение action("send") и в ходе обработки этого сообщения отправит сообщение user_message(Text) через слот entry_o1.

action("send"):-
        entry_o1 ? user_message(text).

Слот entry_o1 содержит специальный мир, который пересылает все полученные им прямые сообщения вовне, в блоки диаграммы, присоединённые к выходу O1 блока "Sender". В ходе трансляции SADT модели, Акторный Пролог автоматически определяет вспомогательные миры для передачи сообщений между блоками и задаёт их в качестве аргументов соответствующих конструкторов процессов.

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

  1. I1-In - входы блока (стрелки слева).
  2. С1-Сn - управление блока (стрелки сверху).
  3. O1-On - выходы блока (стрелки справа).
  4. M1-Mn - реализация, механизмы и исполнители блока (стрелки снизу).

В соответствии с этим Акторный Пролог автоматически создаёт значения слотов entry_i1-entry_iN для всех входов, entry_с1-entry_сN для управления, entry_o1-entry_oN для выходов и entry_m1-entry_mN для механизмов каждого процесса, реализующего блок исходной диаграммы. Эти слоты программа может использовать для передачи прямых сообщений по связям SADT модели. Обратите внимание, что при пересылке прямых сообщений по связям SADT диаграммы в передаваемый предикат автоматически добавляется дополнительный аргумент - строка, обозначающая связь, через которую прямое сообщение пришло в блок. Например, в рассматриваемой программе в предикат user_message был добавлен дополнительный аргумент "i1".

Помимо слотов entry_*, Акторный Пролог по той же схеме создаёт слоты value_*. Эти слоты являются общими переменными процессов и предназначены для передачи потоковых сообщений между блоками SADT модели. Конкретно, для входов блока создаются слоты value_i1-value_iN, для управления value_с1-value_сN, для выходов value_o1-value_oN и для механизмов value_m1-value_mN. Эта разновидность слотов будет использована в следующем примере, иллюстрирующем передачу потоковых сообщений между процессами.

Пример 2. Передача потоковых сообщений между блоками SADT диаграммы.

Рассмотрим пример _Flow.A в каталоге SADT. Диаграмма верхнего уровня этого примера содержит два блока, связанные дугой типа "выход-управление".



Рис. 2.1. SADT диаграмма верхнего уровня.

Текст программы _Flow1.A включает определения двух классов - 'Sender' и 'Receiver'.

-------------------------------------------
-- An example of Actor Prolog program.   --
-- (c) 2002, Alexei A. Morozov, IRE RAS. --
-- Transmitting of flow messages between --
-- blocks of SADT model.                 --
-------------------------------------------
class 'Sender' specializing 'Dialog':
--
entry_o1;
value_o1;
--
identifier      = "Control";
--
[
goal:-!.
]
-------------------------------------------
class 'Receiver' specializing 'Alpha':
--
entry_c1;
value_c1;
--
con;
--
[
goal:-!,
        con ? clear,
        con ? show,
        con ? writeln(
                "I have received "
                "a value:"),
        con ? set_color('Blue'),
        con ? writeln(value_c1),
        con ? set_color('Black'),
        --
        check(value_c1).
--
check(#):-!.
check(Value):-!,
        even(Value).
--
show(_):-!,
        con ? show.
]
-------------------------------------------

Класс 'Sender' позволяет выбрать в диалоговом окне целое число от 1 до 5, а затем посылает его через слот value_o1 (определение соответствующего диалогового окна приведено ниже). Класс 'Receiver' получает это число через слот value_с1 и печатает в своём текстовом окне. После этого он проверяет, является ли полученное число чётным. Если значение value_o1 чётно, доказательство актора goal завершается успехом, и процесс Receiver переходит в состояние "доказанный".



Рис. 2.2. Обработка потокового сообщения закончилась успехом.

В противном случае доказательство актора goal завершается неудачей, и процесс Receiver переходит в состояние "неудачный".



Рис. 2.3. Обработка потокового сообщения закончилась неудачей.

Обратите внимание, что при переходе процесса Receiver в состояние "неудачный", цвет соответствующего блока на экране автоматически изменился. Акторный Пролог автоматически изменяет цвет блоков при изменении состояния соответствующих процессов. Какие именно цвета следует использовать для изображения состояний "доказанный" и "неудачный", можно указать в файле определений диалоговых окон. Для этого используются команды

success_color(MainColor,HatchColor) и
failure_color(MainColor,HatchColor),

где MainColor - цвет блоков, а HatchColor - цвет полосок (если задать его равным default, полосок не будет). Вот как определён цвет блоков в рассматриваемом примере (файл _Flow1.DLG):

grid(80,25)
--
window_font("Arial",14)
diagram_font("Arial",17)
dialog_font("Arial",14)
--
success_color(green,default)
failure_color(red,white)
--
dialog "Control" (
     "Sender control panel",
     white,blue,default,
     centered,centered,default)
vbox(center)
     vbox(left)
          radiobuttons(value_o1)
               radiobutton("Output value = 1")
               radiobutton("Output value = 2")
               radiobutton("Output value = 3")
               radiobutton("Output value = 4")
               radiobutton("Output value = 5")
          end_of_radiobuttons
     end_of_vbox
     button(close,"&Close dialog")
end_of_vbox
end_of_dialog

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

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

Рассмотрим пример _DF1.A в каталоге SADT. Эта программа объединяет в себе две предыдущие.

Диаграмма верхнего уровня содержит три блока. Блоки "Sender" и "Receiver" связаны дугой типа "выход-вход", блоки "Control" и "Receiver" - дугой типа "выход-управление".



Рис. 3.1. SADT диаграмма с тремя блоками.

Запустите программу и посмотрите, как она работает при различных параметрах в диалоговых окнах процессов. Обратите внимание, что при переходе процесса Receiver в состояние "неудачный", обработка информационных прямых сообщений этим процессом приостанавливается.



Рис. 3.2. Взаимодействие блоков SADT диаграммы.

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

Оглавление