# Pi-Kalkül

Der Pi-Kalkül (π-Kalkül) ist ein Prozesskalkül, der von Robin Milner, Joachim Parrow und David Walker in den 1990er Jahren als Nachfolger des Calculus of Communicating Systems (CCS) entwickelt wurde. Mit dem Pi-Kalkül können nebenläufige Systeme, die sich während der Laufzeit ändern, beschrieben werden. Trotz seiner einfachen Syntax ist er sehr expressiv. Es lassen sich funktionale Programmierungen darin ausdrücken. Erweiterungen wie der spi-Kalkül und „applied π“ wurden erfolgreich zur Brechung von Verschlüsselungsprotokollen eingesetzt.
Ein Anwendungszweck dieser Art von Verfahren ist die Simulation von Nebenläufigkeiten wie zum Beispiel Threads oder Prozessen auf Mehrkernprozessoren, weil bei der Programmierung von Software, welche diese Funktionalität nutzt, komplexe Randbedingungen ins Spiel kommen, die mittels einer solchen Simulation leichter in den Griff zu bekommen sind. Weitere Anwendungszwecke haben sich in der Molekularbiologie und zur Geschäftsprozessmodellierung ergeben.

## Konstrukte

Die Prozessalgebra des Pi-Kalküls ist stark mit Namen verknüpft. Durch die doppelte Rolle von Namen als Kommunikationskanal und Variable ist eine einfache Anwendung sichergestellt.
| Konstrukt | Syntax | Beschreibung |
| Nebenläufigkeit | $P\mid Q$ | $P$ und $Q$ können gleichzeitig ausgeführt werden. |
| Eingabepräfix | $c\left(x\right).P$ | Der Prozess $P$ wartet auf Input $x$, der über den Kommunikationskanal $c$ gesendet wird. Der Name $x$ ist gebunden. |
| Ausgabepräfix | ${\overline {c}}\langle y\rangle .P$ | Der Name $y$ wird über den Kanal $c$ gesendet, bevor der Prozess $P$ beginnt. |
| Silent Prefix | $\tau .P$ |
| Replikation | $!\,P$ | Der Prozess $P$ kann eine Kopie von $P$ erstellen. |
| Neuer Name | $\left(\nu x\right)P$ | $P$ kann eine neue Konstante $x$ innerhalb von $P$ erstellen. Dies ist ein neuer Kommunikationskanal. |
| Null-Prozess | 0 | Der Prozess ist vollständig abgearbeitet und angehalten. |
Diese minimale Definition des Pi-Kalküls verhindert einerseits Programme im üblichen Sinn. Anderseits ist es einfach, die fehlenden Kontrollstrukturen und Verzweigungen zu ergänzen.

## Formale Definition

Seien X eine Menge von Namen und x und y Elemente dieser Menge! Die folgende Formale Grammatik in Backus-Naur-Form beschreibt die Formale Sprache des Pi-Kalküls:
    ${\begin{aligned}P,Q::=\,&x(y).P\,\,\,\\|\,\,\,&{\overline {x}}\langle y\rangle .P\,\,\,\\|\,\,\,&P|Q\,\,\,\\|\,\,\,&(\nu x)P\,\,\,\\|\,\,\,&!P\,\,\,\\|\,\,\,&0\end{aligned}}$
In Worte übersetzt heißt das:
* Empfange auf dem Kanal $x$, binde das Resultat an $y$ und starte $P$
* sende den Wert von $y$ über den Kanal $x$ und starte $P$
* starte $P$ und $Q$ gleichzeitig
* erzeuge einen neuen Kanal $x$ und starte $P$
* erzeuge eine Kopie von $P$
* beende den Prozess.

## Beispiel

Ein Beispiel zeigt drei nebenläufige Prozesse, wobei der Name $x$ nur den ersten beiden Komponenten bekannt ist.
    ${\begin{aligned}(\nu x)&\;(\;{\overline {x}}\langle z\rangle .\;0\\&\;|\;x(y).\;{\overline {y}}\langle x\rangle .\;x(y).\;0\;)\\&\;|\;z(v).\;{\overline {v}}\langle v\rangle .0\end{aligned}}$
Die ersten zwei Komponenten können über den Kanal $x$ kommunizieren, der Name $y$ wird an $z$ gebunden.