mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-26 06:48:04 +02:00
First- und follow
This commit is contained in:
parent
1bcd6dbccc
commit
281f9ea351
5 changed files with 41 additions and 4 deletions
|
@ -228,7 +228,7 @@ Maschinencode oder Assembler zu erstellen. Dabei muss folgendes beachtet werden:
|
|||
$x \in \Sigma^*$ mit
|
||||
\[x = x_1 \dots x_m \text{ mit } x_i \in \Sigma \text{ wobei } i \in 1, \dots, m\]
|
||||
|
||||
Dann heißt $\tilde{x} \in (\Sigma \cup \Set{\#})^+$ ein $k$-\textbf{Präfix} von $x$,
|
||||
Dann heißt $\tilde{x} \in (\Sigma \cup \Set{\#})^+$ ein $k$-\textbf{Anfang} von $x$,
|
||||
wenn gilt:
|
||||
\[\tilde{x} =
|
||||
\begin{cases}
|
||||
|
@ -249,6 +249,7 @@ Maschinencode oder Assembler zu erstellen. Dabei muss folgendes beachtet werden:
|
|||
\end{align*}
|
||||
|
||||
Dann gilt:
|
||||
\begin{multicols}{2}
|
||||
\begin{bspenum}
|
||||
\item $a = 1 : aaaa$
|
||||
\item $a = 1 : a$
|
||||
|
@ -257,21 +258,38 @@ Maschinencode oder Assembler zu erstellen. Dabei muss folgendes beachtet werden:
|
|||
\item $aba = 3 : aba$
|
||||
\item $aba\# = 4 : aba$
|
||||
\end{bspenum}
|
||||
\end{multicols}
|
||||
\end{beispiel}
|
||||
|
||||
\begin{definition}[First- und Follow-Menge]\xindex{Firstkx@$\text{First}_k(x)$}\xindex{Followkx@$\text{Follow}_k(x)$}%
|
||||
Sei $G = (\Sigma, V, P, S)$ eine Grammatik und $x \in V$.
|
||||
Sei $G = (\Sigma, V, P, S)$ eine Grammatik und $x \in (V \cup \Sigma)$.
|
||||
|
||||
\begin{defenum}
|
||||
\item $\begin{aligned}[t]\First_k (x) := \{u \in (V \cup \Sigma)^+ | &\exists y \in \Sigma^*:\\
|
||||
\item $\begin{aligned}[t]\First_k (x) := \{u \in \Sigma^+ | \exists &y \in \Sigma^*:\\
|
||||
&x \Rightarrow^* y\\
|
||||
\land &u = k : y \}\end{aligned}$
|
||||
\item $\begin{aligned}[t]\Follow_k(x) := \{u \in (V \cup \Sigma)^+ | &\exists m, y \in (V \cup \Sigma)^* :\\
|
||||
\item $\First(x) := \First_1(x)$
|
||||
\item $\begin{aligned}[t]\Follow_k(x) := \{u \in \Sigma^+ | \exists &m, y \in (V \cup \Sigma)^* :\\
|
||||
&S \Rightarrow^* mxy\\
|
||||
\land &u \in \First_k(y)\}\end{aligned}$
|
||||
\item $\Follow(x) := \Follow_1(x)$
|
||||
\end{defenum}
|
||||
\end{definition}
|
||||
|
||||
Die $\First_k(x)$-Menge beinhaltet also alle Terminalfolgen, die entweder $k$
|
||||
Terminale lang sind oder kürzer sind und dafür mit \# enden und die zugleich
|
||||
der Anfang von Ableitungen von $x$ sind.
|
||||
|
||||
Die $\Follow_k(x)$-Menge hingegen hat alle Terminalfolgen der Länge $k$ oder kürzer
|
||||
und dafür mit \# am Ende, die aus einer Ableitung des Startsymbols $S \Rightarrow^* mxy$
|
||||
auf die Teilfolge $x$ folgen können.
|
||||
|
||||
Mit der $\Follow_k(x)$-Menge kann man also zu jedem Zeitpunkt sagen, was momentan
|
||||
folgen darf. Wenn der Parser etwas anderes liest, ist ein Fehler passiert.
|
||||
|
||||
Da jede Terminalfolge, die sich aus $S$ folgern lässt mit \# endet, gilt immer:
|
||||
\[\# \in \Follow_k(x)\]
|
||||
|
||||
\begin{beispiel}[First- und Follow-Mengen\footnotemark]
|
||||
Sei $G = (\Sigma, V, P, E)$ mit
|
||||
\begin{align*}
|
||||
|
|
Binary file not shown.
|
@ -24,6 +24,7 @@
|
|||
% no \else branch needed in this case
|
||||
\fi
|
||||
\usepackage{enumitem} % Better than \usepackage{enumerate}, because it allows to set references
|
||||
\usepackage{multicol} % Breaking a list into multiple columns
|
||||
\usepackage{tabto}
|
||||
\usepackage{braket} % needed for \Set
|
||||
\usepackage{csquotes} % \enquote{}
|
||||
|
|
|
@ -33,6 +33,19 @@ und $Y$ Farben sind und $X \neq Y$ gilt:
|
|||
|
||||
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/simple-term.pl}
|
||||
|
||||
\subsection{= und ==}\xindex{= (Prolog)}\xindex{== (Prolog)}
|
||||
In Prolog entspricht \texttt{=} dem Prädikat \texttt{=/2}. Das Prädikat \texttt{<a> = <b>} wird
|
||||
erfüllt, wenn die beiden Terme \texttt{<a>} und \texttt{<b>} unifiziert werden
|
||||
können.
|
||||
|
||||
Das Prädikat \texttt{<a> == <b>} ist im Gegensatz dazu jedoch nur erfüllt, wenn
|
||||
die beiden Terme bereits identisch sind.
|
||||
|
||||
\begin{beispiel}[= und ==]
|
||||
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/equal.pl}
|
||||
\end{beispiel}
|
||||
|
||||
Weitere Informationen: \url{http://stackoverflow.com/a/8220315/562769}
|
||||
|
||||
\subsection{Arithmetik}
|
||||
Die Auswertung artihmetischer Ausdrücke muss in Prolog explizit durch \texttt{is}
|
||||
|
|
5
documents/Programmierparadigmen/scripts/prolog/equal.pl
Normal file
5
documents/Programmierparadigmen/scripts/prolog/equal.pl
Normal file
|
@ -0,0 +1,5 @@
|
|||
?- X = Y.
|
||||
X = Y.
|
||||
|
||||
?- X == Y.
|
||||
false.
|
Loading…
Add table
Add a link
Reference in a new issue