# Satz von Immerman und Szelepcsényi

Der Satz von Immerman und Szelepcsényi ist ein Satz aus der Komplexitätstheorie und besagt, dass die nichtdeterministischen Platzkomplexitätsklassen unter Komplementbildung abgeschlossen sind. Insbesondere ist daher die Klasse NL (nichtdeterministisch logarithmischer Platz) unter Komplementbildung abgeschlossen.
Lange nahm man wie für die nichtdeterministischen Zeitkomplexitätsklassen an, dass NL nicht unter dem Komplement abgeschlossen sei, bis 1988 Immerman und Szelepcsényi unabhängig voneinander den Beweis erbrachten. Dafür wurde beiden gemeinsam der Gödel-Preis (1995) verliehen.

## Formale Definition

Sei $s:\mathbb {N} \rightarrow \mathbb {N}$ eine monotone Funktion mit $s(n)\in \Omega (\log(n))$. Dann gilt:
    ${\textsf {NSPACE}}(s(n))={\textsf {co-NSPACE}}(s(n))$
Insbesondere gilt dann ${\textsf {NL}}={\textsf {co-NL}}$. Es gilt aber auch, dass aus ${\textsf {NL}}={\textsf {co-NL}}$ mit der Paddingtechnik das Theorem für alle $s(n)\in \Omega (\log(n))$ folgt.

## Beweis

Der Beweis verwendet die Beweistechnik des (nichtdeterministischen) induktiven Zählens.

### Vorbemerkungen

Sei $L:=L(G)$ eine Sprache über der Typ-1-Grammatik $G:=(N,\Sigma ,\delta ,S)$ mit den üblichen Symbolen für Nichtterminale $N$, Terminale $\Sigma$, Produktionsregeln $\delta$ und dem Startsymbol $S$. Dann ist für ein Wort $w\in \Sigma ^{\ast }$ der Graph $Graph_{|w|}:=((\Sigma \cup N)^{\leq |w|},\alpha \Rightarrow _{G}\beta )$ derjenige Graph, der alle Satzformen mit einer Länge höchstens der Länge von $w$ enthält, wobei der Graph genau dann eine Kante zwischen zwei Satzformen hat, wenn es eine Produktion in $G$ gibt. Insbesondere enthält der Graph sowohl $S$ als auch $w$ selbst und es gilt, dass $w\in L$ genau dann, wenn es einen Pfad von $S$ nach $w$ in diesem Graphen gibt.
Wenn es nun möglich ist, eine nichtdeterministische, linear beschränkte Turingmaschine zu konstruieren, die genau dann akzeptiert, wenn es keinen Pfad von $S$ nach $w$ gibt, ist der Beweis erbracht.

### Nicht-Erreichbarkeit

Zunächst sei angenommen, dass die Anzahl $N$ der erreichbaren Knoten von $S$ bekannt ist (wir verschieben die Berechnung von $N$ auf später). Dann löst folgender Algorithmus die Nicht-Erreichbarkeit.
Gegeben Graph $G=(V,E)$, Startknoten $s$, Zielknoten $t$ und Anzahl erreichbarer Knoten $N$.
* Initialisiere Zähler $c:=0$
* Für jeden Knoten $v\in V$:
** Rate nichtdeterministisch, ob $v$ von $s$ erreichbar ist und falls die Antwort positiv ist:
*** Rate nichtdeterministisch einen Pfad von $s$ nach $v$ der Länge höchstens $|V|$ und
*** falls der Pfad falsch war oder nicht zu $v$ führt, breche mit nein ab,
*** falls $v=t$, breche mit nein ab (denn der Knoten ist offenbar erreichbar),
*** ansonsten erhöhe den Zähler $c$ um eins.
* Falls $c<N$, breche mit nein ab, ansonsten gebe ja aus.
Weder $N$ noch $c$ können größer als $|V|$ sein und verbrauchen demnach (binär kodiert) nicht mehr als $\log(|V|)$ Speicherplatz. Der Algorithmus stellt sicher, dass alle $N$ Knoten, die von $s$ erreichbar sind, aufgezählt werden und akzeptiert nur dann, wenn $t$ keiner dieser Knoten war.

### Induktives Zählen

Es bleibt jetzt nur noch die bislang unbekannte Anzahl $N$ der erreichbaren Knoten zu ermitteln. Die Idee ist, die Anzahl $N_{i}$ der Knoten zu berechnen, die in höchstens $i$ Schritten erreichbar sind. Man lässt $i$ dann induktiv hochzählen und verwendet, dass $N=N_{|V|}$ gilt. Der Algorithmus funktioniert wie folgt:
* Initialisiere $N_{0}:=1$ (der Startknoten benötigt keinen Schritt um erreicht zu werden)
* Für jede Anzahl an Schritten $i=1,\dots ,|V|$:
** Initialisiere $N_{i}:=0$.
** $\star$ Für jeden Knoten $v\in V$:
*** Initialisiere einen Zähler $c:=0$
*** Für jeden Knoten $u\in V$:
**** Rate nichtdeterministisch, ob $u$ von $s$ in weniger als $i$ Schritten erreichbar ist.
**** Falls ja, rate einen Pfad von $s$ mit einer Länge kleiner $i$ und breche ab, falls der Pfad nicht in $u$ endet.
**** Falls so ein Pfad gefunden wurde, erhöhe den Zähler $c$ um eins und ...
**** ... wenn $u$ gleich $v$ ist oder es eine Kante von $u$ nach $v$ gibt, erhöhe $N_{i}$ ebenfalls um eins und setze die Iteration von $v$ fort (markiert mit $\star$).
*** Falls $c<N_{i-1}$, breche die Berechnung ab
* Gebe $N_{|V|}$ zurück.
Da sich der Algorithmus lediglich drei Zähler ($c,N_{i},N_{i-1}$) gleichzeitig merken muss, lässt er sich mit logarithmischem Speicherplatz realisieren. Ein formaler Beweis der Korrektheit wird dem interessierten Leser überlassen. Als Beweisidee dient folgender Hinweis: $N_{i}$ wird genau dann nicht inkrementiert, wenn alle Knoten mit einer Distanz kleiner als $i$ ausprobiert wurden und kein weiterer direkt (d. h. in höchstens einem Schritt) erreichbarer Knoten gefunden werde konnte.

### Der Beweis

Nun müssen lediglich beide Algorithmen kombiniert werden.
* Berechne $N$ für $G:=Graph_{|w|}$ und $s:=S$ durch induktives Zählen.
* Benutze Nicht-Erreichbarkeit für $G:=Graph_{|w|},s:=S$ und $t:=w$ mit zuvor berechnetem $N$.
Eine solche Turingmaschine akzeptiert genau dann, wenn es keinen Pfad von $S$ nach $w$ gibt und da beide Teilalgorithmen nur logarithmischen Speicherplatz benötigen, ist der Beweis komplett.