Подчинение

 

Пусть P, Q – процессы, такие, что aQ. В комбинации (P || Q) каждое действие Р может произойти, только если это позволяет Q, тогда как Q может независимо осуществлять действия из ( - aQ) без разрешения и даже без ведома партнера Р. Таким образом, Р служит по отношению к Q подчиненным процессом, тогда как Q выступает как главный процесс. Это записывается так: Р // Q. Отсюда: a(Р // Q) = ( - aQ).

Обычно бывает удобно давать подчиненному процессу имя, скажем m, которое используется главным процессом для всех взаимодействий с подчиненным. Каждое взаимодействие по каналу с обозначается тройкой m.c.v, где am.c(m: P) = aс(Р), а v aс(Р).

В конструкции (m: P // Q) процесс Q взаимодействует с P по каналам с составными именами вида m.c, тогда как P для этих же взаимодействий использует соответствующий простой канал с. Так как все эти взаимодействия скрыты от обстановки, имя m недоступно снаружи; следовательно, оно служит локальным именем подчиненного процесса.

Подчинение может быть вложенным, например (n: (m: P//Q)//R). Процесс R не имеет возможности ни непосредственно взаимодействовать сP, ни знать о существовании P и его имени m.

Пример 3.23. удв: УДВ // Q.

Подчиненный процесс ведет себя как обыкновенная подпрограмма, вызываемая внутри главного процесса Q. Внутри Q значение 2 е может быть получено поочередным выводом аргумента е по левому каналу процесса удв и вводом результата по правому каналу:

удв.лев ! е → (удв.прав ? х → …).

Пример 3.22. ст: СТЕК // Q.

Внутри главного процесса Q ст.лев!vиспользуется для проталкивания в верхушку стека, а ст.прав?x выталкивает верхнее значение. Использование конструкции выбора позволяет рассматривать ситуацию, когда стек пуст:

(ст.прав ? xQ1(х) | ст.пуст Q2).

Если стек не пуст, то выбирается первая альтернатива; если пуст, то выбор второй альтернативы позволяет избежать тупика.

Оператор подчинения может использоваться для рекурсивного определения подпрограмм. Каждый уровень рекурсии (кроме последнего) задает новую локальную подпрограмму, работающую с рекурсивным вызовом (вызовами).

Пример 3.24.

ФАКТ = µХ.лев?n → (if n = 0 then(прав!1 → X)

else (f: X // (f.лев!(n – 1) → f.прав?yправ!(n y) → X)).

Подпрограмма ФАКТ использует каналы лев и прав для обмена результатами и параметрами с вызывающим ее процессом, а каналы f.лев иf.прав – для взаимодействия со своим подчиненным процессом f.

 








Дата добавления: 2015-07-18; просмотров: 655;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.