# Temporale Logik der Aktionen

Die Temporale Logik der Aktionen (TLA, englisch temporal logic of actions) wurde von Leslie Lamport entwickelt. Sie baut zum einen auf der Temporalen Logik (engl. temporal logic) und zum anderen auf der Logik der Aktionen (engl. logic of actions) auf, ist folglich im Ansatz eine Verknüpfung einer Erweiterung der Aussagenlogik durch die Temporale Logik mit der Sprache Logik der Aktionen, in der sich Prädikate, Zustandsfunktionen und Aktionen beschreiben lassen. Es handelt sich um eine Variante der von Amir Pnueli eingeführten temporalen Logik für Programme.
Die Temporale Logik der Aktionen wird in der Informatik zur Spezifikation, Argumentation und Verifikation von Systemen (z. B. Programmen) verwendet. Eine Spezifikation in TLA ist eine logische Formel, die jedes mögliche und korrekte Verhalten eines Systems beschreibt. Anhand dieser logischen Formel können Systeme auf unerwünschte und gewünschte Eigenschaften geprüft werden.

## Logik der Aktionen

Die Logik der Aktionen in der theoretischen Informatik beschäftigt sich mit der Korrektheit von Ausführungen von Computerprogrammen und ermöglicht die Untersuchung der Korrektheit von Programmen.

### Notationsgrundlagen

* Sei $F$ ein syntaktisches Objekt, dann ist $[[F]]$ seine semantische Bedeutung.
* ${\hat {=}}$ ist eine andere Schreibweise für $:=$ und bedeutet „gleich per definitionem“.
* $s[[v]]/v$ bedeutet, dass $v$ durch $s[[v]]$ ersetzt wird.

### Variablen, Werte und Zustände

Die Logik der Aktionen verwendet die folgenden drei Klassen:
    ${\textbf {Var}}$ – die Klasse aller Variablennamen
    ${\textbf {Val}}$ – die Klasse aller möglichen Werte für die Variablen (z. B. 10, „string“, $\operatorname {True}$)
    ${\textbf {St}}$ – die Klasse aller möglichen Zustände
Ein Zustand ist eine Abbildung $s\colon {\textbf {Var}}\to {\textbf {Val}},x\mapsto s(x)$, das heißt, der Variablen $x$ wird der Zustand $s(x)$ zugewiesen. Die Zustände beschreiben die Semantik. Man verwendet $s[[x]]$ statt $s(x)$. Mit $[[x]]$ bezeichnet man somit die Abbildung $[[x]]\colon {\textbf {St}}\to {\textbf {Val}}$.
Somit ist die Schreibweise $s[[x]]$ in polnischer Notation und bedeutet Anwendung von $s$.

### Zustandsfunktion

Eine Zustandsfunktion (engl. state function) ist ein nicht-boolescher Ausdruck aus Variablen und Konstanten, zum Beispiel $f:=x^{2}+y+4$, dazu gehören auch Variablen $x$ (da eine Variable als die Identitätsabbildung $x\mapsto x$ interpretiert werden kann). Der Ausdruck $[[f]]$ ist dann die Abbildung $[[f]]\colon {\textbf {St}}\to {\textbf {Val}},s\mapsto s[[f]]$, das heißt, $[[f]]$ oder $[[x^{2}+y+4]]$ ist eine Abbildung, die dem Zustand $s$ den Wert $\left(s[[x]]\right)^{2}+s[[y]]+4$ zuordnet. Die Notation $s[[f]]$ bezeichnet den Wert, den $[[f]]$ dem Zustand $s$ zuordnet.
Die semantische Definition von $s[[f]]$ lautet
    $s[[f]]\ {\hat {=}}\ f(\forall v\colon s[[v]]/v)$.
Der Ausdruck $f(\forall v\colon s[[v]]/v)$ bedeutet somit den Wert von $f$, wenn man alle $v$ durch $s[[v]]$ ersetzt.
Zusammenfassend:
| Zustand | $s$ | ${\textbf {Var}}\to {\textbf {Val}},x\mapsto s(x)=:s[[x]]$ |
| Zustandsfunktion | $f$ | $x^{2}+y+4$ |
| Semantik | $[[f]]$ | ${\textbf {St}}\to {\textbf {Val}},s\mapsto s[[f]]=(s[[x]])^{2}+s[[y]]+4$ |

### Zustandsprädikat

Ein boolescher Ausdruck $P$ aus Variablen und Konstanten wird Zustandsprädikat (oder kurz Prädikat) genannt, ein Beispiel ist der Ausdruck $x=3+y$. Mit $[[P]]$ bezeichnet man die Abbildung $[[P]]\colon {\textbf {St}}\to \operatorname {Booleans}$ und $s[[P]]$ ordnet entweder $\operatorname {True}$ oder $\operatorname {False}$ dem Zustand $s$ zu. Wenn $s[[P]]=\operatorname {True}$ gilt, dann sagt man $s$ erfüllt das Prädikat $P$.

### Aktion und Schritte

Eine Aktion ${\mathcal {A}}$ ist ein boolescher Ausdruck, der die Beziehung zwischen einem alten Zustand $s$ und einem neuen Zustand $t$ beschreibt. Die Aktion besteht aus „alten Variablen“ und „neuen Variablen“, wobei letztere mit einem $'$ markiert sind. Zum Beispiel ist $x'+2=y$ eine Aktion, die sagt, dass $y$ im alten Zustand um $2$ größer ist als $x$ im neuen Zustand.
Der Ausdruck $[[{\mathcal {A}}]]$ beschreibt die Beziehung zwischen zwei Zuständen, das heißt einen binären Operator, der den beiden Zuständen $s,t$ einen booleschen Wert $s[[{\mathcal {A}}]]t$ zuweist, dabei wird per definitionem links der alte Zustand und rechts der neue Zustand geschrieben. Die semantische Bedeutung $s[[{\mathcal {A}}]]t$ von ${\mathcal {A}}$ erhält man, indem man $v$ durch $s[[v]]$ und $v'$ durch $t[[v]]$ ersetzt. Ist $s[[{\mathcal {A}}]]t=\operatorname {True}$, dann nennt man $s,t$ einen ${\mathcal {A}}$-Schritt (engl. ${\mathcal {A}}$-step).
Der Ausdruck $s[[y=x'+1]]t$ bedeutet somit das Gleiche wie der boolesche Ausdruck $s[[y]]=t[[x]]+1$.
Die semantische Definition von $s[[{\mathcal {A}}]]t$ lautet
    $s[[{\mathcal {A}}]]t\ {\hat {=}}\ {\mathcal {A}}(\forall v\colon s[[v]]/v,\ t[[v]]/v')$.
Variablen die unterschiedliche Werte in verschiedenen Zuständen besitzen können, werden flexible Variablen (engl. flexible variables) genannt. Variablen die konstant bleiben (aber auch unbekannt sein könne) werden rigide Variablen (engl. rigid variables) genannt. Beispielsweise sei $x$ eine flexible Variable, dann besitzt die Aktion
    $\exists m\in \mathbb {N} \colon mx'=n+x$
zwei rigide Variablen $m,n$, die nicht verändert werden.

#### Prädikat als Aktion

Ein Prädikat kann als Aktion ohne Variablen mit $'$ verstanden werden. Die Aktion $s[[P]]t$ ist gleich dem booleschen Ausdruck $s[[P]]$ für alle $s,t$. Für Zustandsfunktionen und Prädikate $F$ definiert man $F'$ als den Ausdruck, den man erhält, wenn man alle Variablen durch deren neue Variable ersetzt, das heißt also
    $F'\ {\hat {=}}\ F(\forall v\colon v'/v)$.
Des Weiteren ist $s[[P']]t$ der gleiche Ausdruck wie $t[[P]]$, für alle Zustände $s,t$.

### Beweisbarkeit und Gültigkeit

Eine Aktion ${\mathcal {A}}$ ist gültig (engl. valid), geschrieben $\vDash {\mathcal {A}}$ (siehe Tautologie), falls jeder Schritt ein ${\mathcal {A}}$-Schritt ist, das heißt also, $s[[{\mathcal {A}}]]t$ ist $\operatorname {True}$ für alle $s,t\in {\textbf {St}}$. Die semantische Definition lautet
    $\vDash {\mathcal {A}}\ {\hat {=}}\ \forall s,t\in {\textbf {St}}\colon \ s[[{\mathcal {A}}]]t$
und für ein Prädikat $P$
    $\vDash P\ {\hat {=}}\ \forall s\in {\textbf {St}}\colon \ s[[P]]$.
Ein Beispiel für eine gültige Aussage ist
    $(x'+y\in \mathbb {N} )\implies (x'+y\geq -x'+-y)$.
Beweisbare Formeln $F$ werden wie in der mathematischen Logik mit $\vdash F$ notiert (siehe Ableitung).

### Enabled-Prädikate

Sei ${\mathcal {A}}$ eine Aktion, dann ist $Enabled\ {\mathcal {A}}$ ein Prädikat, das genau dann für einen Zustand wahr ist, falls es in dem Zustand möglich ist, einen ${\mathcal {A}}$-Schritt auszuführen. Die semantische Definition lautet
    $s[[Enabled\ {\mathcal {A}}]]\ {\hat {=}}\ \exists t\in {\textbf {St}}\colon s[[{\mathcal {A}}]]t$
für jeden Zustand $s$.

## Temporale Logik

Die temporale Logik ist ein System von Regeln und Symbolen, durch die man zeitliche Abläufe erfassen kann. Die Semantik der temporalen Logic baut auf „Verhalten“ (engl. behaviors) auf, wobei damit eine unendliche Folge von Zuständen gemeint ist.

### Temporale Formeln

Temporale Formeln bestehen aus elementaren Formeln sowie booleschen Operatoren und dem unären Operator $\square$, der „immer“ (engl. always) oder „global“ (engl. global) bedeutet. Mit $\sigma [[F]]$ wird der boolesche Ausdruck bezeichnet, den das $F$ dem Verhalten $\sigma$ zuweist. Mit $\langle s_{0},s_{1},\dots \rangle$ wird das Verhalten bezeichnet, das im Zustand $s_{0}$ beginnt. Man sagt $\sigma$ erfüllt $F$ genau dann, wenn $\sigma [[F]]=\operatorname {True}$.
Da alle booleschen Ausdrücke durch $\wedge$ und $\lnot$ beschrieben werden können, genügt es, die Ausdrücke $[[\lnot F]],[[F\wedge G]]$ und $[[\square F]]$ zu definieren. Die semantischen Definitionen sind somit
    $\sigma [[F\land G]]\ {\hat {=}}\ \sigma [[F]]\land \sigma [[G]]$
    $\sigma [[\lnot F]]\ {\hat {=}}\ \lnot \sigma [[F]]$
    $\langle s_{0},s_{1},\dots \rangle [[\square F]]\ {\hat {=}}\ \forall n\in \mathbb {N} :\langle s_{n},s_{n+1},s_{n+2},\dots \rangle [[F]],$
wobei der erste Ausdruck bedeutet, dass ein Verhalten $F\land G$ erfüllt, falls es beide Formeln $F$ und $G$ erfüllt. Der zweite Ausdruck bedeutet, dass das Verhalten $\lnot F$ erfüllt, wenn es $F$ nicht erfüllt. Die linke Seite des dritten Ausdruckes $\langle s_{0},s_{1},\dots \rangle [[\square F]]$ bedeutet, dass die Formel $F$ ab Zustand $s_{0}$ gültig ist. Das heißt, die letzte Definition sagt, dass $F$ immer gültig ist (da es per Induktionsschritt definiert ist).

#### Schlussendlich-Operator

Die Formel $\lnot \square \lnot F$ bedeutet, dass $F$ nicht immer falsch ist und wird mit $\Diamond F$ abgekürzt und schlussendlich (engl. eventually) genannt:
    $\Diamond F\ {\hat {=}}\ \lnot \square \lnot F$
Die Formel $\Diamond \square F$ bedeutet, dass $F$ schlussendlich immer wahr ist.

### Gültigkeit

Eine temporale Formel $F$ ist gültig, falls jedes Verhalten die Formel erfüllt:
    $\vDash F\ {\hat {=}}\ \forall \sigma \in {\textbf {St}}^{\infty }\colon \sigma [[F]]$

## Temporale Logik der Aktionen

Die temporale Logik der Aktionen erhält man, wenn temporale Formeln Aktionen sein können. Die Formeln der TLA bestehen somit aus den logischen Operatoren sowie dem temporalen Operator $\square$.

### Ein einfaches Beispiel

Gegeben sei ein Algorithmus, der im Zustand $x=0$ und $z=0$ beginnt und dann nichtdeterministisch entweder $x$ inkrementiert und $z$ dekrementiert, oder umgekehrt. Als TLA würde das so aussehen:
    $Init_{\phi }\ {\hat {=}}\ (x=0)\wedge (z=0)$
    ${\mathcal {A_{1}}}\ {\hat {=}}\ (x'=x+1)\wedge (z'=z-1)$
    ${\mathcal {A_{2}}}\ {\hat {=}}\ (x'=x-1)\wedge (z'=z+1)$
    ${\mathcal {A}}\ {\hat {=}}\ {\mathcal {A_{1}}}\vee {\mathcal {A_{2}}}$
    $\phi \ {\hat {=}}\ Init_{\phi }\wedge \square {\mathcal {A}}$
Dabei bezeichnet $\phi$ eine Formel, $Init_{\phi }$ den Initialzustand und ${\mathcal {A}}$ eine Aktion.

### Stotternde Schritte

Als stotternde Schritte (engl. stuttering steps) werden Schritte bezeichnet, die das Programm pausieren. In dem Beispiel oben würde das bedeuten, dass $x$ und $z$ nicht verändert werden. Ein solcher Schritt lässt sich zum Beispiel so implementieren:
    $Init_{\phi }\ {\hat {=}}\ (x=0)\wedge (z=0)$
    ${\mathcal {A_{1}}}\ {\hat {=}}\ (x'=x+1)\wedge (z'=z-1)$
    ${\mathcal {A_{2}}}\ {\hat {=}}\ (x'=x-1)\wedge (z'=z+1)$
    ${\mathcal {S_{1}}}\ {\hat {=}}\ (x'=x)\wedge (z'=z)$
    ${\mathcal {A}}\ {\hat {=}}\ {\mathcal {A_{1}}}\vee {\mathcal {A_{2}}}$
    $\phi \ {\hat {=}}\ Init_{\phi }\wedge \square ({\mathcal {A}}\vee {\mathcal {S_{1}}})$
Um stotternde Schritte einfach zu beschreiben, führt man weitere Notationen ein. Mit der Notation $\langle x',z'\rangle =\langle x,z\rangle$ wird $(x'=x)\wedge (z'=z)$ bezeichnet und statt $\langle x',z'\rangle$ zu schreiben, notiert man einfach $\langle x,z\rangle '$. Für eine Zustandsfunktion $f$ und eine Aktion ${\mathcal {A}}$ definieren wir:
    $[{\mathcal {A}}]_{f}\ {\hat {=}}\ {\mathcal {A}}\vee (f'=f)$
Dann bedeutet $[{\mathcal {M}}]_{\langle x,z\rangle }$ somit:
    $[{\mathcal {M}}]_{\langle x,z\rangle }={\mathcal {M}}\vee (\langle x,z\rangle '=\langle x,z\rangle )={\mathcal {M}}\vee ((x'=x)\wedge (z'=z))={\mathcal {M}}\vee {\mathcal {S_{1}}}$
Somit lassen sich die beiden Zeilen
    ${\mathcal {S_{1}}}\ {\hat {=}}\ (x'=x)\wedge (z'=z)$
    $\phi \ {\hat {=}}\ Init_{\phi }\wedge \square ({\mathcal {A}}\vee {\mathcal {S_{1}}})$
vereinfachen zu
    $\phi \ {\hat {=}}\ Init_{\phi }\wedge \square [{\mathcal {A}}]_{\langle x,z\rangle }$.

### Syntax und Semantik

Für die TLA gelten die Symbole der booleschen Algebra sowie alle oben definierten Ausdrücke und zusätzlich
    ${[{\mathcal {A}}]}_{f}$${\hat {=}}$${\mathcal {A}}\lor (f'=f)$ ${\langle {\mathcal {A}}\rangle }_{f}$${\hat {=}}$${\mathcal {A}}\land (f'\neq f),$
wobei ${\mathcal {A}}$ eine Aktion ist, $f$ eine Zustandsfunktion ist und durch Anwendung logischer Gesetze $({\mathcal {A}}\wedge (f'\neq f))=\lnot (\lnot {\mathcal {A}}\vee (f'=f))$ gilt.
Für die Formel-Syntax gilt:
    $\langle Formel\rangle$ ${\hat {=}}$ $\langle Formel\rangle \land \langle Formel\rangle$ $\vert$ $\langle Formel\rangle \lor \langle Formel\rangle$ $\vert$ $\neg \langle Formel\rangle$ $\vert$ $\Box \langle Formel\rangle$ $\vert$ $\Diamond \langle Formel\rangle$ $\vert$ $\langle Pr{\ddot {a}}dikat\rangle$ $\vert$ $\Box {\lbrack Aktion\rbrack }_{\langle f\rangle }$ $\vert$ $\Box {\langle Aktion\rangle }_{\langle f\rangle }$
Das Symbol $|$ ist als Trennungszeichen zu verstehen.

### Verhaltenseigenschaften

Eine Sicherheitseigenschaft (engl. safety property) garantiert, dass unerwünschte Zustände nicht passieren. Zum Beispiel ist der durch $Init_{\phi }$ spezifizierte Start eine Sicherheitseigenschaft.
Eine Lebendigkeitseigenschaft (engl. liveness property) garantiert, dass erwünschte Zustände erreicht werden, was mit dem $\Diamond \square {\mathcal {A}}$ formuliert werden kann. Möchte man eine Fairness und dass zwei Eigenschaften unendlich Mal wiederholt werden, so verwendet man stattdessen $\Diamond \square {\mathcal {A}}_{1}\wedge \Diamond \square {\mathcal {A}}_{2}$. Somit würde man im obigen Beispiel Folgendes erhalten:
    $\phi \ {\hat {=}}\ Init_{\phi }\wedge \square [{\mathcal {A}}]_{\langle x,z\rangle }\wedge \Diamond \square {\mathcal {A}}_{1}\wedge \Diamond \square {\mathcal {A}}_{2}$

#### Schwache und starke Fairness

In einem nebenläufigen System unterscheidet man zwischen schwacher und starker Fairness.
Schwache Fairness $\operatorname {WF}$ (engl. weak fairness, justice) bedeutet, dass eine Aktion unendlich oft ausgeführt werden muss, wenn ihre Ausführung ab einem bestimmten Zeitpunkt immer möglich ist.
Starke Fairness $\operatorname {SF}$ (engl. strong fairness, compassion) bedeutet, dass eine Aktion ausgeführt werden muss, wenn ihre Ausführung so oft möglich ist.
Ist ein Verhalten stark fair bezüglich einer Aktion, so ist es auch schwach fair für diese Aktion.