mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-25 06:18:05 +02:00
Prolog
This commit is contained in:
parent
683b8a645a
commit
82dd24d55b
10 changed files with 124 additions and 6 deletions
|
@ -294,6 +294,75 @@ Insbesondere ist also $f \ g$ ein Fixpunkt von $g$.
|
|||
$\qed$
|
||||
\end{beweis}
|
||||
|
||||
\section{Let-Polymorphismus}\xindex{let-Polymorphismus}\footnote{WS 2013 / 2014, Folie 205ff}%
|
||||
Das Programm $P = \text{let } f = \lambda x.\ 2 \text{ in } f\ (f\ \text{\texttt{true}})$
|
||||
ist eine polymorphe Hilfsfunktion, da sie beliebige Werte auf 2 Abbildet.
|
||||
Auch solche Ausdrücke sollen typisierbar sein.
|
||||
|
||||
Die Kodierung
|
||||
\[\text{let} x = t_1 \text{ in } t_2\]
|
||||
ist bedeutungsgleich mit
|
||||
\[(\lambda x.\ t_2) t_1\]
|
||||
|
||||
Für den Turing-Operator gilt
|
||||
Das Problem ist, dass
|
||||
\[P = \lambda f. \ f (f\ \text{\texttt{true}})\ (\lambda x.\ 2)\]
|
||||
so nicht typisierbar ist, da in
|
||||
\[\ABS \frac{f: \tau_f \vdash f\ (f\ \text{\texttt{true}}): \dots}{\vdash \lambda f.\ f\ (f\ \text{\texttt{true}}): \dots}\]
|
||||
müsste
|
||||
\[\tau_f = \text{bool} \rightarrow \text{int}\]
|
||||
und zugleich
|
||||
\[\tau_f = \text{int} \rightarrow \text{int}\]
|
||||
in den Typkontext eingetragen werden. Dies ist jedoch nicht möglich. Stattdessen
|
||||
wird
|
||||
\[\text{let} x = t_1 \text{ in } t_2\]
|
||||
als neues Konstrukt im $\lambda$-Kalkül erlaubt.
|
||||
|
||||
\begin{definition}[Typschema]\xindex{Typschema}%
|
||||
Ein Typ der Gestalt $\forall \alpha_1.\ \forall \alpha_2.\ \dots\ \forall \alpha_n. \tau$
|
||||
heißt \textbf{Typschema}. Es bindet freie Variablen $\alpha_1, \dots, \alpha_n$
|
||||
in $\tau$.
|
||||
\end{definition}
|
||||
|
||||
\begin{beispiel}[Typschema]
|
||||
Das Typschema $\forall \alpha.\ \alpha \rightarrow \alpha$ steht für unendlich
|
||||
viele Typen und insbesondere für folgende:
|
||||
\begin{bspenum}
|
||||
\item int $\rightarrow$ int, bool $\rightarrow$ bool, \dots
|
||||
\item (int $\rightarrow$ int) $\rightarrow$ (int $\rightarrow$ int), \dots
|
||||
\item \dots
|
||||
\end{bspenum}
|
||||
\end{beispiel}
|
||||
|
||||
\begin{definition}[Typschemainstanziierung]\xindex{Typschemainstanziierung}%
|
||||
Sei $\tau_2$ ein Nicht-Schema-Typ. Dann heißt der Typ
|
||||
\[\tau[\alpha \mapsto \tau_2]\]
|
||||
eine \textbf{Instanziierung} vom Typschema $\forall \alpha.\ \tau$
|
||||
und man schreibt:
|
||||
\[(\forall \alpha.\ \tau) \succeq \tau [\alpha \mapsto \tau_2]\]
|
||||
\end{definition}
|
||||
|
||||
\begin{beispiel}[Typschemainstanziierung]
|
||||
Folgendes sind Beispiele für Typschemainstanziierungen:
|
||||
\begin{bspenum}
|
||||
\item $\forall \alpha.\ \alpha \rightarrow \alpha \succeq \text{int} \rightarrow \text{int}$
|
||||
\item $\forall \alpha.\ \alpha \rightarrow \alpha \succeq (\text{int} \rightarrow \text{int}) \rightarrow (\text{int} \rightarrow \text{int})$
|
||||
\item $\text{int} \succeq \text{int}$
|
||||
\end{bspenum}
|
||||
|
||||
Folgendes sind keine Typschemainstanziierungen:
|
||||
\begin{bspenum}
|
||||
\item $\alpha \rightarrow \alpha \nsucceq \text{int} \rightarrow \text{int}$
|
||||
\item $\alpha \nsucceq \text{bool}$
|
||||
\item $\forall \alpha.\ \alpha \rightarrow \alpha \nsucceq \text{bool}$
|
||||
\end{bspenum}
|
||||
\end{beispiel}
|
||||
|
||||
Zu Typschemata gibt es angepasste Regeln:
|
||||
|
||||
\[\VAR \frac{\Gamma(x)= \tau' \;\;\; \tau' \succeq \tau}{\gamma \vdash x: \tau}\]
|
||||
|
||||
und
|
||||
|
||||
\[\ABS \frac{\Gamma, x: \tau_1 \vdash t: \tau_2 \;\;\; \tau_1 \text{ kein Typschema}}{\Gamma \vdash \lambda x. t: \tau_1 \rightarrow \tau_2}\]
|
||||
|
||||
\todo[inline]{Folie 208ff}
|
Binary file not shown.
|
@ -136,13 +136,20 @@ Programmiersprachen können anhand der Art ihrer Typisierung unterschieden werde
|
|||
\end{beispiel}
|
||||
|
||||
\begin{definition}[Polymorphie]\xindex{Polymorphie}%
|
||||
Ein Typ heißt \textbf{polymorph}, wenn er mindestens einen Parameter hat.
|
||||
\begin{defenum}
|
||||
\item Ein Typ heißt polymorph, wenn er mindestens einen Parameter hat.
|
||||
\item Eine Funktion heißt polymorph, wenn ihr Verhalten nicht von dem
|
||||
konkreten Typen der Parameter abhängt.
|
||||
\end{defenum}
|
||||
\end{definition}
|
||||
|
||||
\begin{beispiel}[Polymorphie]
|
||||
In Java sind beispielsweise Listen polymorph:
|
||||
In Java sind beispielsweise Listen polymorphe Typen:
|
||||
|
||||
\inputminted[numbersep=5pt, tabsize=4]{java}{scripts/java/list-example.java}
|
||||
|
||||
Entsprechend sind auf Listen polymorphe Operationen wie \texttt{add} und
|
||||
\texttt{remove} definiert.
|
||||
\end{beispiel}
|
||||
|
||||
\begin{definition}[Statische und dynamische Typisierung]\xindex{Typisierung!statische}\xindex{Typisierung!dynamische}%
|
||||
|
|
|
@ -16,6 +16,24 @@ Kompiliere ihn mit \texttt{gplc hello-world.pl}. Es wird eine
|
|||
ausführbare Datei erzeugt.
|
||||
|
||||
\section{Syntax}
|
||||
In Prolog gibt es Prädikate, die Werte haben. Prädikate werden immer klein geschrieben.
|
||||
So kann das Prädikat \texttt{farbe} mit den Werten \texttt{rot}, \texttt{gruen},
|
||||
\texttt{blau}, \texttt{gelb} - welche auch immer klein geschrieben werden - wie
|
||||
folgt definiert werden:
|
||||
|
||||
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/praedikat-farbe.pl}
|
||||
|
||||
\begin{itemize}
|
||||
\item Terme werden durch \texttt{,} mit einem logischem \textbf{und} verknüpft.
|
||||
\item Ungleichheit wird durch \texttt{\=} ausgedrückt.
|
||||
\end{itemize}
|
||||
|
||||
So ist folgendes Prädikat \texttt{nachbar(X, Y)} genau dann wahr, wenn $X$
|
||||
und $Y$ Farben sind und $X \neq Y$ gilt:
|
||||
|
||||
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/simple-term.pl}
|
||||
|
||||
|
||||
\section{Beispiele}
|
||||
\subsection{Humans}
|
||||
Erstelle folgende Datei:
|
||||
|
|
|
@ -46,5 +46,6 @@ $\psi \vdash \varphi$ & Syntaktische Herleitbarkeit\newline Die Formel $\
|
|||
|
||||
\begin{xtabular}{@{} p{\mylengtha} P{\mylengthb} @{}}
|
||||
$\bot$ & Bottom\\
|
||||
$\Parr$ & TODO?
|
||||
$\Parr$ & TODO?\\
|
||||
$\succeq$& Typschemainstanziierung\\
|
||||
\end{xtabular}
|
BIN
documents/Programmierparadigmen/scripts/prolog/dl-faerbbarkeit
Executable file
BIN
documents/Programmierparadigmen/scripts/prolog/dl-faerbbarkeit
Executable file
Binary file not shown.
|
@ -0,0 +1,18 @@
|
|||
farbe(blau).
|
||||
farbe(gelb).
|
||||
farbe(gruen).
|
||||
nachbar(X, Y) :- farbe(X), farbe(Y), X \= Y.
|
||||
deutschland(SH,MV,HH,HB,NI,ST,BE,BB,SN,NW,HE,TH,RP,SL,BW,BY) :-
|
||||
nachbar(SH, NI), nachbar(SH, HH), nachbar(SH, MV),
|
||||
nachbar(HH, NI),
|
||||
nachbar(MV, NI), nachbar(MV, BB),
|
||||
nachbar(NI, HB), nachbar(NI, BB), nachbar(NI, ST), nachbar(NI, TH),
|
||||
nachbar(NI, HE), nachbar(NI, NW),
|
||||
nachbar(ST, BB), nachbar(ST, SN), nachbar(ST, TH),
|
||||
nachbar(BB, BE), nachbar(BB, SN),
|
||||
nachbar(NW, HE), nachbar(NW, RP),
|
||||
nachbar(SN, TH), nachbar(SN, BY),
|
||||
nachbar(RP, SL), nachbar(RP, HE), nachbar(RP, BW),
|
||||
nachbar(HE, BW), nachbar(HE, TH), nachbar(HE, BY),
|
||||
nachbar(TH, BY),
|
||||
nachbar(BW, BY).
|
|
@ -0,0 +1,4 @@
|
|||
farbe(blau).
|
||||
farbe(gelb).
|
||||
farbe(gruen).
|
||||
farbe(rot).
|
|
@ -0,0 +1 @@
|
|||
nachbar(X, Y) :- farbe(X), farbe(Y), X \= Y.
|
Loading…
Add table
Add a link
Reference in a new issue