Satz coPATH is in NL
Einfache Sprache
Def. Satz coPATH is in NL
$\overline{\mathrm{PATH}}\in\mathbf{coNL}$
Beweisidee: Nehme zunächst an wir wissen die Anzahl der Knoten $c$ die von $s$ aus erreichbar sind. Später wird erklärt wie man $c$ berechnet.
Gegeben $G$, $s$, $t$ und $c$ (wobei $m=|V|$) funktioniert die TM $\mathcal M$ mit nichtdeterministische logarithmische Platzkomplexität wie folgt: $\mathcal M$ iteriert über alle Knoten von $G$ und rät nichtdeterministisch ob er von $s$ aus erreichbar ist. Falls für den Knoten $u$ geraten wird, dass er erreichbar ist, versucht $\mathcal M$ diese Vermutung dadurch zu bestätigen, dass es den Pfad von $s$ zu dem Knoten nichtdeterministisch errät. Für jeden erreichbaren Knoten wird dann jeweils ein Zähler inkrementiert. Wenn am Ende der Zähler gleich $c$ ist, wissen wir das wir alle erreichbaren Knoten gesichtet haben und keiner davon $t$ ist. Somit ist $t$ nicht erreichbar von $s$.
Grob sieht die Maschine so aus:
- Berechne $c$
- Wähle nichtdeterministisch genau die $c$ Knoten (ohne $t$) die von $s$ erreichbar sind.
- Überprüfe das jeder Knoten $u$ von $s$ erreichbar ist, indem man nichtdeterministisch den Pfad der Länge $\leq m$ von $s$ nach $u$ findet. Falls der Pfad nicht bei $u$ endet oder in $t$ endet reject
- Sonst akzeptiere
Wie berechnet man $c$? Dazu folgt eine NL Algorithmus, bei dem mind. eine mögliche Berechnung den korrekten Wert für $c$ hat und alle anderen Berechnungen verwerfen:
Für alle $i\in\mathbb N$ mit $i\leq m$ sei $A_i$ die Menge der Knoten die höchstens $i$ von $s$ entfernt sind. Also ist $A_0=\{s\}$, $A_i\subseteq A_{i+1}$ und $A_m$ beinhaltet alle Knoten die von $s$ erreichbar sind. Sei $c_i := |A_i|$. Wir wollen $c_m = c$. Dazu geben wir eine Prozedur an wie $c_{i+1}$ aus $c_i$ berechnet werden kann:
TODO der algorithmus macht noch keinen Sinn. besonders wie c berechnet wird.
Beweis:
Algorithmus
1def find_path_nondet(G,s,e,l):
2 ''' Nondeterministically follow a path in G of length at most l from s and reject if it doesn’t end at e.
3 '''
4 (V, E) = G
5 a = s
6 for x in range(0,l):
7 TODO
8
9def coPath(G, s, t):
10 (V, E) = G
11 cc = 0
12 cn = 1
13 for i in range(0,m-1):
14 cc = cn
15 cn = 1
16 for v in V:
17 if v == s:
18 continue
19 d = 0
20 for u in V:
21 #Nondeterministically skip or perform
22 if (Nondeterministic descision):
23 if find_path_nondet(G, s, v, i):
24 d += 1
25 if (u,v) in E:
26 cn += 1
27 break
28 else:
29 return reject
30 if d != cc:
31 return reject
32 d = 0
33 for u in V:
34 #Nondeterministically skip or perform
35 if (Nondeterministic descision):
36 if find_path_nondet(G, s, u, len(V)):
37 d += 1
38 else:
39 return reject
40 if d == cn:
41 return accept
42 else:
43 return reject
Der Algorithmus braucht nur Speicherplatz für $m = |V|$, u, v, cc, cn, d, i und ein Zeiger auf den Graph. Also hat er nichtdeterministische logarithmische Platzkomplexität.