Перейти к содержанию

Пи-исчисление

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

[math]\displaystyle{ \pi }[/math]-исчисление в теоретической информатике  — исчисление процессов, изначально разработанное Робином Милнером, Иоахимом Пэрроу и Дэвидом Уокером как продолжение работы над исчислением общающихся систем. Целью [math]\displaystyle{ \pi }[/math]-исчисления является возможность описать параллельные вычисления, конфигурация которых может меняться на протяжении вычисления.

Неформальное определение

[math]\displaystyle{ \pi }[/math]-исчисление принадлежит к семейству исчислений процессов. Фактически [math]\displaystyle{ \pi }[/math]-исчисление как λ-исчисление настолько минимально, что не содержит примитивов, таких как числа, булевы выражения, структуры данных, переменные, функции или операторы управления потоком (например, if-then-else, while).

[math]\displaystyle{ \pi }[/math]-исчисление определяет динамически взаимодействующие друг с другом параллельные процессы. Каждый процесс может состоять из одного или нескольких действий, расположенных последовательно или параллельно, а также альтернативно или рекурсивно. Действием может быть отправка или получение данных по каналу. Сообщение от одного процесса другому включает имя канала, который может быть использован для ответа. Имя является переменной[1].

Можно также сказать, что [math]\displaystyle{ \pi }[/math]-исчисление — это открытая теория, которая зависит от некоторой теории имен. Например, с операционной точки зрения π-исчислении можно представить как процедуру, которая для данной теории имен даёт теорию процессов над этими именами[2].

Конструкции процесса

Центральным для [math]\displaystyle{ \pi }[/math]-исчисления является понятие имени. Простота исчисления заключается в двойной роли имён, которые выступают и как каналы связи и как переменные. В исчислении доступны следующие конструкции процесса (точные определения даны в следующих секциях):

  • конкуренция, обозначается [math]\displaystyle{ P \mid Q }[/math], где [math]\displaystyle{ P }[/math] и [math]\displaystyle{ Q }[/math] — два процесса или потока, выполняемых конкурентно.
  • связь, где
    • префикс ввода [math]\displaystyle{ c\left(x\right).P }[/math] — процесс, ожидающий сообщение, отправленное по каналу связи [math]\displaystyle{ c }[/math], перед тем как продолжаться как [math]\displaystyle{ P }[/math], привязывающий полученное имя к имени [math]\displaystyle{ x }[/math]. Как правило, это моделирует процесс ожидания связи из сети, или метку c, которую можно использовать с помощью операции goto c.
    • префикс вывода [math]\displaystyle{ \overline{c} \langle y \rangle.P }[/math] описывает, что имя [math]\displaystyle{ y }[/math] передаётся через канал [math]\displaystyle{ c }[/math], перед тем как продолжаться как [math]\displaystyle{ P }[/math]. Как правило, это моделирует отправку сообщения через сеть или операцию goto c.
  • репликация, обозначается [math]\displaystyle{ !\,P }[/math], которая может быть рассмотрена как процесс, который может всегда создавать новую копию [math]\displaystyle{ P }[/math]. Как правило, эти модели или сетевой сервис или метка c, ожидающая любое число goto c операций.
  • создание нового имени, обозначается [math]\displaystyle{ \left(\nu x\right)P }[/math], которое может быть рассмотрено как процесс, размещающий новую константу [math]\displaystyle{ x }[/math] внутри [math]\displaystyle{ P }[/math]. Константы [math]\displaystyle{ \pi }[/math]-исчисления определяются только через своё имя и всегда являются каналами связи.
  • ноль процесс, обозначается 0, процесс, выполнение которого завершено и остановлено.

Минимализм [math]\displaystyle{ \pi }[/math]-исчисления не позволяет писать программы в обычном смысле этого слова, но исчисление можно легко расширить. В частности, просто определить структуры управления (такие как рекурсия, циклы и последовательная композиция) и типы данных (такие как функции первого порядка, значения истинности, списки и целые числа). Кроме того, были предложены расширения [math]\displaystyle{ \pi }[/math]-исчисления для криптографии с публичным ключом. Прикладное π-исчисление, разработанное Абади и Фурне, даёт этим различным расширениям π-исчисления формальную основу с помощью произвольных типов данных.

Небольшой пример

Ниже приведён пример процесса из трёх параллельных компонент. Канал [math]\displaystyle{ x }[/math] известен только в двух первых компонентах.

[math]\displaystyle{ \begin{align} & \begin{align} (\nu x) \; & ( \; \overline{x} \langle z \rangle . \; 0 \\ & | \; x(y). \; \overline{y}\langle x \rangle . \; x(y). \; 0 \; ) \end{align} \\ | \; & z(v) . \; \overline{v}\langle v \rangle . 0 \end{align} }[/math]

Первые две компоненты способны связываться через канал [math]\displaystyle{ x }[/math], при этом [math]\displaystyle{ y }[/math] связывается с [math]\displaystyle{ z }[/math]. Следующий шаг процесса:

[math]\displaystyle{ \begin{align} & \begin{align} ( \nu x) \; ( \; & 0 \\ | \; & \overline{z} \langle x \rangle . \; x(y). \; 0 \; ) \end{align} \\ | \; & z(v). \; \overline{v}\langle v \rangle . \; 0 \end{align} }[/math]

В этом примере [math]\displaystyle{ y }[/math] не затрагивается, так как он определён во внутренней области видимости. Теперь вторая и третья параллельные компоненты могут связаться через канал [math]\displaystyle{ z }[/math], при этом [math]\displaystyle{ v }[/math] связывается с [math]\displaystyle{ x }[/math]. Следующий шаг процесса:

[math]\displaystyle{ \begin{align} (\nu x) ( \; & 0 \\ | \; & x(y). \; 0 \\ | \; & \overline{x}\langle x \rangle . \; 0 \; ) \end{align} }[/math]

Обратите внимание, что, поскольку локальное имя [math]\displaystyle{ x }[/math] было выведено, область действия [math]\displaystyle{ x }[/math] расширена, чтобы охватить также третью компоненту. Наконец, канал [math]\displaystyle{ x }[/math] можно использовать для отправки имени [math]\displaystyle{ x }[/math]. После чего все процессы останавливаются.

[math]\displaystyle{ \begin{align} (\nu x) ( \; & 0 \\ | \; & 0 \\ | \; & 0 ) \end{align} }[/math]

Формальное определение

Применение

[math]\displaystyle{ \pi }[/math]-исчисление — один из наиболее популярных формализмов в сообществе управления бизнес-процессами (BPM). Например, популярная литература утверждает (и подвергается критике[3][1]), что XLANG, WSCI, BPML, BPEL и WS-CDL основаны на этом исчислении. По крайней мере, свойства [math]\displaystyle{ \pi }[/math]-исчисления — порядок вычисления, связи на основе сообщений, мобильность (англ. mobility) — могут служить основой для языков BPM[1].

Другим неожиданным направлением использования [math]\displaystyle{ \pi }[/math]-исчисления является моделирование биомолекулярных систем[4].

Пример бизнес-процесса

Следующий пример может дать представление об описании бизнес-процесса при помощи пи-исчисления (перефразирован из [1]):

Клиент(заказ,клиент)=
заказ<клиент>.клиент(блюдо)
ОфициантПринимаетЗаказ(заказ,заказГотов,заказНеГотов,кухня)=
заказ(клиент).кухня<заказГотов,заказНеГотов>
.ОфициантПриноситЕду(заказГотов,заказНеГотов,клиент)
ОфициантПриноситЕду(заказГотов,заказНеГотов,клиент)=
заказГотов(блюдо).клиент<блюдо>
+ заказНеГотов(извинения).клиент<извинения>
Кухня(кухня,заказГотов,заказНеГотов)=
кухня(заказГотов,заказНеГотов).заказГотов<"борщ">
Ресторан=
(ν зкз,клнт,готов,неГотов,кух)
Клиент(зкз,клнт)
| ОфициантПринимаетЗаказ(зкз,готов,неГотов,кух)
| Кухня(кух,готов,неГотов)

Для данного примера исчисление было расширено оператором выбора (P + Q).

Примечания

  1. Перейти обратно: 1,0 1,1 1,2 1,3 Havey, 2005.
  2. Matthias Radestock, L.G. Meredith. A Reflective Higher-order Calculus // Electronic Notes in Theoretical Computer Science. — 2005. — № 141.
  3. W.M.P. van der Aalst. Pi calculus versus Petri nets: Let us eat “humblepie” rather than further inflate the “Pi hype”. Дата обращения: 2 апреля 2021. Архивировано 17 мая 2021 года.
  4. Regev A., Shapiro E. The π-calculus as an Abstraction for Biomolecular Systems // Modelling in Molecular Biology. Natural Computing Series / Ciobanu G., Rozenberg G.. — Berlin, Heidelberg : Springer, 2004.

Литература