Подчинение
Пусть P, Q – процессы, такие, что aР aQ. В комбинации (P || Q) каждое действие Р может произойти, только если это позволяет Q, тогда как Q может независимо осуществлять действия из (aР - aQ) без разрешения и даже без ведома партнера Р. Таким образом, Р служит по отношению к Q подчиненным процессом, тогда как Q выступает как главный процесс. Это записывается так: Р // Q. Отсюда: a(Р // Q) = (aР - 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 выталкивает верхнее значение. Использование конструкции выбора позволяет рассматривать ситуацию, когда стек пуст:
(ст.прав ? x → Q1(х) | ст.пуст → 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; просмотров: 660;