Commit d8731e7e authored by Niklas Rieken's avatar Niklas Rieken
Browse files

added equivalence theorem PDA~CFG

parent a3300a7c
No preview for this file type
......@@ -64,6 +64,7 @@
\newcommand{\qedb}{\hfill$\blacksquare$}
\newcommand{\shuffle}{\mathrel{\shifttext{5pt}{$\equiv$}\shifttext{-5pt}{$=$}}}
%\newcommand{\reaches}[1]{\overset{#1}{\rightarrow}}
\newcommand{\leftd}{\rightharpoonup_{\mathcal{G}}}
\newcommand{\reaches}{\xrightarrow}
\newcommand{\reachess}[2]{\underset{#2}{\xrightarrow{#1}}}
\DeclareMathOperator{\id}{id}
......@@ -3167,7 +3168,7 @@ Wir haben beim Pumping-Lemma für reguläre Sprachen gezeigt, dass wenn ein Wort
Wir sind nun interessiert an einem Rechenmodell, welches uns Ableitungen bzw. Ableitungsbäume liefert und uns somit auch einen Mechanismus liefert zu entscheiden, ob ein gegebenes Wort zu einer kontextfreien Sprach gehört. Für reguläre Sprachen hatten wir dazu endliche Automaten betrachtet. Diese erkennen genau die regulären Sprachen. Da jedoch die Klasse der kontextfreien Sprachen mächtiger ist als die der regulären (d.h. FA-erkennbaren) Sprachen, benötigen wir auch ein stärkeres Automatenmodell. Dazu verwenden wir einen zusätzlichen unendlichen Speicher. Wir erlauben jedoch nur Zugriff auf ein Element aus dem Speicher gleichzeitig und zwar auf genau das welches zuletzt eingefügt wurde (LIFO: \emph{last-in first-out}, \emph{Stack}, \emph{Pushdown Stack}, \emph{Keller}, oder \emph{Stapel}). Warum dies funktioniert ist zunächst nicht klar, wir nehmen hier nur vorweg, dass mithilfe dest Stacks eine \emph{Linksableitung} (eine Ableitung bei der in jedem Schritt das am weitesten links stehende Nichtterminal ersetzt wird) simuliert wird. Der Inhalt des Stacks entspricht dabei dann stets dem noch zu bearbeitenden Teil der aktuellen Satzform in der Ableitung (d.h. ohne Präfixe, welche nur aus Terminalen bestehen).
\begin{example}\label{exp:pda_intro}
Betrachte wieder die Sprache $L = \{a^n b^n : n \in \mathbb{N}\}$. Die Idee ist, hier den Stack nur als Zähler zu verwenden, d.h. für jedes $a$ welches gelesen wird, wird ein Zählsymbol $Z$ auf den Stack gelegt und für jedes $b$ welches gelesen wird, wird ein Zählsymbol vom Stack genommen. Der Stack codiert somit die Anzahl der bisher gelesenen $a$s minus der bisher gelesenen $b$s unär. Um auch die Struktur des Wortes zu achten (nach dem ersten $b$ kein $a$ mehr; $L \subseteq \llbracket a^\ast b^\ast \rrbracket$) können wir Zustände verwenden. Das Wort wird dann akzeptiert, wenn die Struktur in Ordnung ist (wir befinden uns in einem akzeptierenden zustand) und der Stack leer ist (gleich viele $a$s und $b$s).
Betrachte wieder die Sprache $L = \{a^n b^n : n \in \mathbb{N}\}$. Die Idee ist, hier den Stack nur als Zähler zu verwenden, d.h. für jedes $a$ welches gelesen wird, wird ein Zählsymbol $Z$ auf den Stack gelegt und für jedes $b$ welches gelesen wird, wird ein Zählsymbol vom Stack genommen. Der Stack codiert somit die Anzahl der bisher gelesenen $a$s minus der bisher gelesenen $b$s unär. Um auch die Struktur des Wortes zu achten (nach dem ersten $b$ kein $a$ mehr; $L \subseteq \llbracket a^\ast b^\ast \rrbracket$) können wir Zustände verwenden. Das Wort wird dann akzeptiert, wenn die Struktur in Ordnung ist (wir befinden uns in einem akzeptierenden Zustand) und der Stack leer ist (gleich viele $a$s und $b$s).
\end{example}
\begin{definition}
......@@ -3189,6 +3190,83 @@ Wir können PDAs auch graphisch angeben. Der PDA, der in Beispiel~\ref{exp:pda_i
\label{fig:pda_intro}
\end{figure}
\begin{definition}
Sei $\mathcal{A} = (Q, \Sigma, \Gamma, \Delta, q_0, \bot, F)$ ein PDA. Wir nennen ein Wort aus $Q\Gamma^\ast$ \emph{Konfiguration}. Dabei ist für ein $q\gamma \in Q\Gamma^\ast$ $q$ der aktuelle Zustand und $u$ der aktuelle Stackinhalt von $\mathcal{A}$, wobei das oberste Symbol des Stacks ganz links in $\gamma$ steht.
\end{definition}
Wir bezeichnen Konfigurationen mit $\kappa, \lambda$ und Varianten.
\begin{remark*}
Bei einer Transition $(p, \sigma, A, \gamma, q)$ wechseln wir von einer Konfiguration $pAv$ zu $q\gamma v$. Es wird also stets ein Präfix der Konfiguration verändert. Deshalb nennt man PDAs auch \emph{Prefix Rewriting Systems}.
\end{remark*}
Wir haben schon informell das Konzept eines Laufs auf einem PDA oben eingeführt. Wir präzisieren dies in der nächsten Definition.
\begin{definition}
Sei $\mathcal{A} = (Q, \Sigma, \Gamma, \Delta, q_0, \bot, F)$ ein PDA. Die \emph{Übergangsrelation} $\to_{\mathcal{A}}$ von $\mathcal{A}$ ist eine zweistellige Relation auf den Kofigurationen. Sie ist definiert wie folgt: $pA\gamma \to_{\mathcal{A}} q\gamma'$ genau dann, wenn eine Transition $(p, \sigma, A, \delta, q) \in \Delta$ existiert mit $\delta \in \Gamma^\ast, sodass \gamma' = \delta\gamma$.
Seien $\kappa, \lambda$ Konfigurationen von $\mathcal{A}$. Ein \emph{Lauf von $\kappa$ nach $\lambda$} ist eine Folge
$$
\varrho = (\kappa_0 = \kappa, \kappa_1, \ldots, \kappa_n = \lambda)
$$
von Konfigurationen, sodass $\kappa_i \to_{\mathcal{A}} \kappa{i+1}$ für alle $i \in [n]$.
\end{definition}
\begin{definition}
Sei $\mathcal{A} = (Q, \Sigma, \Gamma, \Delta, q_0, \bot, F)$ ein PDA. Ein \emph{Lauf von $\mathcal{A}$ auf $w \in \Sigma^\ast$}. ist ein Lauf von $q_0\bot$ nach $q\gamma$, sodass jedes Symbol aus $w$ gelesen wurde. Der Lauf ist \emph{akzeptierend}, wenn $q \in F$.
Wir sagen $\mathcal{A}$ \emph{akzeptiert} $w \in \Sigma^\ast$, wenn es einen akzeptierenden Lauf von $\mathcal{A}$ auf $w$ gibt. Die von $\mathcal{A}$ \emph{erkannte Sprache} ist
$$
L(\mathcal{A}) \coloneqq \{w \in \Sigma^\ast \mid \mathcal{A} \text{ akzeptiert } w\}.
$$
Eine Sprache $L$ heißt \emph{PDA-erkennbar}, falls es einen PDA $\mathcal{A}$ gibt mit $L = L(\mathcal{A})$.
\end{definition}
Wir schreiben außerdem $\kappa \to_{\mathcal{A}}^\ast \lambda$, wenn es einen Lauf von $\mathcal{A}$ von $\kappa$ nach $\lambda$ gibt. Die Länge eines Laufs $\varrho = (\kappa_0, \ldots, \kappa_n)$ ist $n$ und wir schreiben $\kappa \to_{\mathcal{A}}^n \lambda$, wenn es einen Lauf der Länge $n$ von $\kappa$ nach $\lambda$ gibt und $\to_{\mathcal{A}}^{[n+1]}$ für Lufe der Länge höchstens $n$. Falls $\mathcal{A}$ aus dem Kontext klar ist, lassen wir den Index in $\to_{\mathcal{A}}$, $\to_{\mathcal{A}}^\ast$ usw. weg.
Von einer Konfiguration $q = q \varepsilon$ kann keine Transition mehr genommen werden. D.h. eine solche Konfiguration kann nur als letzte Konfiguration in einem lauf auftreten. Wir können statt über akzeptierende Zustände, das Akzeptanzverhalten von PDAs auch über den Stack steuern.
\begin{definition}
Ein \emph{PDA, der mit leerem Keller akzeptiert} ist ein Sextupel
$$
\mathcal{A} = (Q, \Sigma, \Gamma, \Delta, q_0, \bot)
$$
mit endlicher, nicht-leerer Zustandsmenge $Q$, endlichem, nicht-leerem Eingabealphabet $\Sigma$, endlichem, nicht-leerem Kelleralphabet $\Gamma$, Transitionsrelation $\Delta \subseteq Q \times (\Sigma \cup \{\varepsilon\}) \times \Gamma \times \Gamma^\ast \times Q$, Startzustand $q_0 \in Q$, und Kellerbodensymbol $\bot \in \Gamma$.
\end{definition}
Für einen PDA, der mit leerem Keller akzeptiert sind Konfigurationen und Läufe analog wie bei PDAs definiert, allerdings heißt ein Lauf $\varrho = (\kappa_0, \ldots, \kappa_n)$ \emph{akzeptierend}, falls $\kappa_n = q$ für ein beliebiges $q \in Q$.
\begin{theorem}\label{thm:pdaemptystack}
Eine Sprache ist genau dann PDA-erkennbar, wenn sie erkennbar ist durch einen PDA, der mit leerem Keller akzeptiert.
\begin{proof}
Das ist eine Übung.
\end{proof}
\end{theorem}
Wir wollen nun die lange angekündigte Äquivalenz zwischen Kellerautomaten und kontextfreie Grammatiken beweisen. Dafür benötigen wir noch den Begriff der Linksableitung.
\begin{definition}
Eine \emph{Linksableitung} zu einer kontextfreien Grammatik $\mathcal{G}$ ist eine Ableitung bei der im jeden Ableitungsschritt ($\to_{\mathcal{G}}$) das am weitesten links stehende Nichtterminal ersetzt wird.
\end{definition}
Um eine Linksableitung zu notieren verwenden wir nun das Symbol $\leftd$ bzw. Varianten wie $\leftd^\ast$, $\leftd^n$, usw.
\begin{remark*}
Beachte, dass in jeder kontextfreien Grammatik gilt,
$$
\alpha \leftd^\ast \beta \text{ genau dann, wenn } \alpha \to_{\mathcal{G}}^\ast \beta.
$$
\end{remark*}
\begin{theorem}
Eine Sprache ist genau dann PDA-erkennbar, wenn sie kontextfrei ist.
\end{theorem}
Wie beim Äquivalenzsatz von Kleene (Satz~\ref{thm:kleene_equivalence}) teilen wir den Beweis in zwei Lemmata auf.
\begin{lemma}\label{lem:cfg2pda}
Sei $\mathcal{G} = (N, \Sigma, P, S)$ eine kontextfreie Grammatik. Dann existiert ein PDA $\mathcal{A}$ mit $L(\mathcal{G}) = L(\mathcal{A})$.
\begin{proof}
Sei $\mathcal{G} = (N, \Sigma, P, S)$ eine kontextfreie Grammatik in Chomsky-Normalform. Wir konstruieren $\mathcal{A}_{\mathcal{G}}$ als ein PDA, der mit leerem Keller akzeptiert. Nach Satz~\ref{thm:pdaemptystack} folgt dann die Aussage. Sei $\mathcal{A}_{\mathcal{G}} = (\{q_0\}, \Sigma, N, \Delta, q_0, S)$ mit
$$
\Delta = \{(q_0, \varepsilon, A, BC, q_0) \mid A \to BC \in P\} \cup \{(q_0, a, A, \varepsilon, q_0) \mid A \to a \in P\}.
$$
Wir zeigen die Korrektheit der Konstruktion per vollständiger Induktion über die Länge der Ableitung bzw. des Laufs. D.h. wir zeigen, dass für jedes $u \in \Sigma^\ast$, $S \leftd^n u\beta$ genau dann wenn $q_0S \to_{\mathcal{A}_{\mathcal{G}}}^n q_0\beta$ nach Lesen von $u$.\\
\end{proof}
\end{lemma}
\begin{remark*}
Wenn $\mathcal{G}$ im Beweis von Lemma~\ref{lem:cfg2pda} nicht in Chomsky-Normalform ist, dann können wir sie nach Satz~\ref{thm:chomsky} in Chomsky-Normalform bringen. Allerdings kann man auch eine alternative Konstruktion sich überlegen, die auch auf Grammatiken funktioniert, die nicht in Chomsky-Normalform sind. Der Nachteil dieser Konstruktion ist, dass sie ein größeres Kelleralphabet benötigt und die Ableitungsschritte nicht mehr ganz so synchron laufen zu den Übergängen im Kellerautomaten.
\end{remark*}
\subsection{Deterministische Kellerautomaten}\label{sec:contextfree_dpda}
......@@ -3198,7 +3276,7 @@ Wir können PDAs auch graphisch angeben. Der PDA, der in Beispiel~\ref{exp:pda_i
\subsection{*Anwendung: Parsing}\label{sec:contextfree_parsing}
%TODO Queue-Systeme / Turingmaschinen?
%\newpage
%\section{Allgemeine Grammatiken}\label{sec:grammars}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment