Sein $\mathcal{G}=(N, \Sigma, P, S)$ eine kontextfreie Grammatik und $n \in\mathbb{N}$. Seien $\alpha_1, \alpha_2, \beta\in(N \cup\Sigma)^\ast$ mit $\alpha_1\alpha_2\to^n \beta$. Dann gibt es eine Zerlegung $\beta=\beta_1\beta_2$, sodass
$$
\alpha_1\to^{[n+1]}\beta_1\text{ und }\alpha_2\to^{[n+1]}\beta_2.
...
...
@@ -2886,10 +2886,14 @@ Wir geben eine formale Definition für einen Ableitungsbaum.
\end{itemize}
\end{definition}
Intuitiv bezeichnet $ui$ das \emph{$i$-te Kind} des Knoten $u$, analog ist $u$ der \emph{Elternknoten} für jedes $ui$. Wir sagen $\varepsilon$ ist die \emph{Wurzel} des Baumes. Knoten $u \in V$ zu denen kein $u1$ mehr existiert in $V$ heißen \emph{Blätter}, alle anderen Knoten sind \emph{innere Knoten}.
Ein \emph{Ast} (der Länge $k$) in $T$ ist eine Knotenfolge $(v_0, v_1, \ldots, v_k)$ mit $v_0=\varepsilon$, $v_{i+1}$ für $i \in[k]$ jeweils Nachfolger von $v_i$ und $v_k$ ist Blatt. Die \emph{Höhe} eines Baumes ist gegeben durch, die Länge eines längsten Astes. Dies kann ausgegdrückt werden durch die Länge eines längsten Knotennamens.
$$
h(T)\coloneqq\max\{|v| \mid v \in V\}.
$$
\begin{definition}
Ein \emph{Baumbereich} in einem Baum ist eine Menge $D \subseteq V$, die abgeschlossen ist unter Präfixbildung und jeweils für $ui \in D$ auch alle $uj$ mit $1\leq j \leq i$ enthält. Ein Baum heißt \emph{höchstens $k$-verzweigt}, falls $V \subseteq\{1, \ldots, k\}^\ast$.
\end{definition}
Ein Ableitungsbaum zu einer kontextfreien Grammatik $\mathcal{G}=(N, \Sigma, P, S)$ ist dann ein Baum $T =(V, E, \lambda)$, bei dem sich die Beschriftungsfunktion $\lambda$ mit den Produktionen in $P$ verträgt, d.h. für jeden Knoten $u$ mit $\lambda(u)= A$ und Kanten $(u, u1), \ldots, (u, uk)\in E$ existiert eine Regel $A \to\lambda(u1)\ldots\lambda(uk)\in P$. Für einen Ableitungsbaum $T$ mit Blättern $b_0, \ldots, b_{n-1}$ (in richtiger Reihenfolge) bezeichnet $\beta(T)=\lambda(b_0)\ldots\lambda(b_{n-1})$ die \emph{Baumbeschriftung} von $T$.
Ein \emph{Ableitungsbaum} (engl.: \emph{parse tree}) zu einer kontextfreien Grammatik $\mathcal{G}=(N, \Sigma, P, S)$ ist dann ein Baum $T =(V, E, \lambda)$, bei dem sich die Beschriftungsfunktion $\lambda$ mit den Produktionen in $P$ verträgt, d.h. für jeden Knoten $u$ mit $\lambda(u)= A$ und Kanten $(u, u1), \ldots, (u, uk)\in E$ existiert eine Regel $A \to\lambda(u1)\ldots\lambda(uk)\in P$. Für einen Ableitungsbaum $T$ mit Blättern $b_0, \ldots, b_{n-1}$ (in richtiger Reihenfolge) bezeichnet $\beta(T)=\lambda(b_0)\ldots\lambda(b_{n-1})$ die \emph{Baumbeschriftung} von $T$.
Wir geben Ableitungsbäume gewöhnlich nur graphisch an. Dabei verwenden wir keine Pfeile an den Kanten; die Orientierung ist implizit \emph{von oben nach unten} gegeben. Außerdem wird in der graphischen Darstellung auf die Namen der Knoten verzichtet und nur ihre Beschriftung angegeben. Die Reihenfolge ist ebenfalls implizit von \emph{links nach rechts} gegeben. In Abbildung~\ref{fig:explicitderivativetree} wird dies noch einmal verdeutlicht.
\begin{figure}
...
...
@@ -2899,6 +2903,98 @@ Wir geben Ableitungsbäume gewöhnlich nur graphisch an. Dabei verwenden wir kei
\label{fig:explicitderivativetree}
\end{figure}
\begin{definition}
Seien $T_1=(V_1, E_1, \lambda_1), T_2=(V_2, E_2, \lambda_2)$ Bäume und $u \in V_1$ Blatt. Wir können $T_2$ an $u$\emph{anhängen} (geschrieben: $T_1\curlywedge^u T_2$) durch $T = T_1\curlywedge^u T_2=(V, E, \lambda)$ mit $V = V_1\cup u \cdot V_2$, $E = E_1\cup u \cdot E_2$ und
$$
\lambda(v)=\begin{cases}
\lambda_1(v), & v \in V_1\\
\lambda_2(w), & v \notin V_1, v = uw,
\end{cases}
$$
wobei zu einer Kante $e =(v, w)$, $u \cdot e =(uv, uw)$ und entsprechend $u \cdot E =\{u \cdot e : e \in E\}$.
\end{definition}
Das Anhängen eines Baumes ist skizziert in Abbildung~\ref{fig:jointree}. Für mehrfaches Anhängen an Blätter $u_1, \ldots, u_k \in V_1$ schreiben wir $T_1\curlywedge^{u_1} T_2\curlywedge^{u_2}\ldots\curlywedge^{u_k} T_k$ mit impliziter Linksklammerung.
\begin{figure}
\centering
\input{figs/jointree}
\caption{Der Baum $T_2$ wird an das Blatt $u$ aus $T_1$ angehängt.}
\label{fig:jointree}
\end{figure}
\begin{theorem}
Sei $\mathcal{G}=(N, \Sigma, P, S)$ eine kontextfreie Grammatik. Dann gilt für alle $A \in N$ und $\alpha\in(N \cup\Sigma)^\ast$, dass $A \to^\ast\alpha$ genau dann wenn ein Ableitungsbaum $T =(V, E, \lambda)$ zu $\mathcal{G}$ existiert mit $\lambda(\varepsilon)= A$ und $\beta(T)=\alpha$.
\begin{proof}
''wenn dann``: Induktion über die Länge der Ableitung $n$ von $\alpha$ aus $A$ in $\mathcal{G}$.\\
Induktionsverankerung: $n =0$. Wenn $A \to^0=\alpha$, dann ist $\alpha= A$ und dann ist $(\{\varepsilon\}, \emptyset, \varepsilon\mapsto A)$ ein Ableitungsbaum für $\alpha$ aus $A$.\\
Induktionsschritt: Sei
$$
\alpha_0= A \to\alpha_1\to\ldots\to\alpha_{n+1}=\alpha
$$
eine Ableitung von $\alpha$ aus $A$. Wir zerlegen zunächst $\alpha_1$ in Terminalwörter und Nichtterminale:
$$
\alpha_1= u_0 B_1 u_1 B_2\ldots u_{k-1} B_k u_k,
$$
für ein $k > 0$, $u_0, \ldots, u_k \in\Sigma^\ast$ und $B_1, \ldots, B_k \in N$. Wir verwenden nun das Zerlegungslemma~\ref{lem:decomposition}. Demnach lässt sich nun auch $\alpha$ zerlegen als
sodass $B_i \to^{[n+1]}\beta_i$ für alle $i \in\{1, \ldots, k\}$. Nach Induktionshypothese gibt es für jedes $i \in\{1, \ldots, k\}$ einen Ableitungsbaum $T_i$ für $\beta_i$ aus $B_i$. Sei $u_i = a_{i0}\ldots a_{i\ell_i-1}$ für $i \in\{1, \ldots, k\}$. Sei $T' =(V', E', \lambda')$ mit
$$
V' =\left\lbrace\varepsilon, 1, \ldots, k +\sum_{i=1}^k \ell_i \right\rbrace,
$$
$$
E' =\left\lbrace(\varepsilon, i)\mid i \in V' \setminus\{\varepsilon\}\right\rbrace,
$$
und $\lambda'(\varepsilon)= A$, und Blattbeschriftung $\beta(T')= u_0 B_1 u_1\ldots u_{k-1} B_k u_k$. Durch Anhängen der Bäume $T_i$ für $i \in\{1, \ldots, k\}$, d.h. $T' \curlywedge^{\ell_1+1} T_1\curlywedge^{\ell_2+2}\ldots\curlywedge^{\ell_k+k} T_k$ erhalten wir den Ableitungsbaum für $A \to^{[n+2]}\alpha$ (s. Abbildung~\ref{fig:existence_derivativetree}).\\
''nur wenn``: Induktion über Höhe des Ableitungsbaums $T$.\\
Induktionsverankerung: $h(T)=0$. Dann ist $T =(\{\varepsilon\}, \emptyset, \varepsilon\mapsto A)$ der Ableitungsbaum und es gilt $A \to^0\alpha= A$. Insbesondere gilt $\beta(T)= A$.\\
Induktionsschritt: Sei $T =(V, E, \lambda)$ ein Ableitungsbaum mit Höhe $h \coloneqq h(T)$. Wir betrachten die Unterbäume $T_1, \ldots, T_k$ an den Nachfolgern von $\varepsilon$, d.h. die Bäume mit Wurzeln $1, \ldots, k$ (Beachte, dass $T$ ensteht durch Anhängen von $T_1, \ldots, T_k$ an $1, \ldots, k$). Es gilt $\beta(T)=\beta(T_1)\cdot\beta(T_k)$. Wir wissen außerdem, dass $A \to\lambda(1)\ldots\lambda(k)\in P$, welche uns den ersten Ableitungsschritt liefert. Nach Induktionshypothese gilt für alle $i \in\{1, \ldots, k\}$, dass eine Ableitung $\lambda(i)\to^\ast\beta(T_i)$ existiert. Verwenden wir nun, das Kombinationslemma~\ref{lem:combination}, erhalten wir
\[%qedhere
A \to\lambda(1)\ldots\lambda(k)=\lambda_1(\varepsilon)\ldots\lambda_k(\varepsilon)\to^\ast\beta(T_1)\ldots\beta(T_k)=\beta(T).\qedhere
\]
\end{proof}
\end{theorem}
\begin{figure}
\centering
\input{figs/existence_derivativetree}
\caption{Aleitungsbaum für $A \to^{[n+2]}\alpha$. Die Bäume für $B_i \to^{[n+1]}\beta_i$ existieren nach Induktionshypothese.}
\label{fig:existence_derivativetree}
\end{figure}
\begin{corollary}
Sei $\mathcal{G}=(N, \Sigma, P, S)$ eine kontextfreie Grammatik und $w \in\Sigma^\ast$. Es gilt $w \in L(\mathcal{G})$ genau dann wenn es einen Ableitungsbaum $T =(V, E, \lambda)$ gibt mit $\lambda(\varepsilon)= S$ und $\beta(T)= w$.
\end{corollary}
Als nächstes zeigen wir, wie Bäume, insbesondere Ableitungsbäume, wieder als ''lineare`` Objekte (d.h. Wörter) aufgefasst werden können. Dies passiert zum Beispiel in \texttt{HTML}/\texttt{XML}-Dokumenten, welche stets eine als Text codierte Baumstruktur haben. Ähnliches passiert beim Compilieren von Programm-Quelltexten beim Überprüfen der Syntax.
\begin{definition}
Sei $\mathcal{G}=(N, \Sigma, P, S)$ eine kontextfreie Grammatik und $T =(V, E, \lambda)$ ein Ableitungsbaum für $\mathcal{G}$.
Wir definieren die \emph{Baumcodierung}$\tau(T)$ von $T$ rekursiv über die Höhe $h(T)$ des Baumes. Wir verwenden das Alphabet $\Sigma\cup\{\langle_A, \rangle_A : A \in N\}$.\\
Rekursionsanfang: $h(T)=0$.
$$
\tau(T)=\begin{cases}
a, &\lambda(\varepsilon)= a \in\Sigma\\
\langle_A \rangle_A, &\lambda(\varepsilon)= A \in N.
\end{cases}
$$
Rekursionsschritt: $h(T) > 0$. Die Wurzel ist ein Nichtterminal $A \in N$ und hat Nachfolgerbäume $1, \ldots, k$ und zugehörige Unterbäume $T_1, \ldots, T_k$.
Beachte, dass $\tau(T)$ wohldefiniert ist, denn für alle $T_i$, $i \in\{1, \ldots, k\}$ gilt $h(T_i) < h(T)$.
\begin{example}
Betrachte erneut den Ableitungsbaum in Abbildung~\ref{fig:explicitderivativetree}. Wir erhalten die Baumcodierung:
$$
\langle_S \langle_A \langle_A a \rangle_A \langle_A a \rangle_A \rangle_A \langle_B \langle_B b \rangle_B \langle_B \langle_B b \rangle_B \langle_B b \rangle_B \rangle_B \langle_A a \rangle_A \rangle_B a \rangle_S.
$$
\end{example}
\begin{lemma}
Sei $\mathcal{G}=(N, \Sigma, P, S)$ eine kontextfreie Grammatik. Die Sprache $\texttt{code}(\mathcal{G})=\{\tau(T) : T \textup{ ist ein Ableitungsbaum von }\mathcal{G}\}$ ist kontextfrei.