2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-25 06:18:05 +02:00
This commit is contained in:
Martin Thoma 2014-03-20 19:20:30 +01:00
parent 683b8a645a
commit 82dd24d55b
10 changed files with 124 additions and 6 deletions

View file

@ -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}

View file

@ -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}%

View file

@ -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:

View file

@ -45,6 +45,7 @@ $\psi \vdash \varphi$ & Syntaktische Herleitbarkeit\newline Die Formel $\
\setlength\mylengthb{\dimexpr\columnwidth-\mylengtha-2\tabcolsep\relax}
\begin{xtabular}{@{} p{\mylengtha} P{\mylengthb} @{}}
$\bot$ & Bottom\\
$\Parr$ & TODO?
$\bot$ & Bottom\\
$\Parr$ & TODO?\\
$\succeq$& Typschemainstanziierung\\
\end{xtabular}

View file

@ -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).

View file

@ -0,0 +1,4 @@
farbe(blau).
farbe(gelb).
farbe(gruen).
farbe(rot).

View file

@ -0,0 +1 @@
nachbar(X, Y) :- farbe(X), farbe(Y), X \= Y.