2018-10-03 13:34:14 +02:00
\documentclass [11pt,a4paper] { scrartcl}
2018-10-04 23:55:01 +02:00
\usepackage [a4paper,left=3cm,right=3cm,top=2.5cm,bottom=2.5cm] { geometry}
2018-10-03 13:34:14 +02:00
\usepackage [ngerman] { babel}
\usepackage { amssymb}
\usepackage { amsthm}
\usepackage { mathrsfs}
\usepackage { scrextend}
\usepackage [utf8] { inputenc}
\usepackage { amsmath}
\usepackage { enumitem}
\usepackage { tikz-qtree}
\usepackage { mathtools}
\usepackage { latexsym}
2018-10-05 13:57:17 +02:00
\usepackage { bussproofs}
2018-10-03 13:34:14 +02:00
\usepackage { csquotes}
\usepackage { pdfpages}
\usepackage { pgfplots}
\usepackage { hyperref}
2018-10-03 16:16:26 +02:00
\usepackage { upgreek}
2018-10-03 13:34:14 +02:00
\usepackage { tikz}
\usetikzlibrary { positioning}
\usetikzlibrary { arrows.meta}
2018-10-03 14:22:06 +02:00
%Anmerkungen am Rand
2018-10-03 13:34:14 +02:00
\newcommand { \siehe } [1]{ \marginpar { \footnotesize \textit { #1} } }
2018-10-03 14:22:06 +02:00
\newcommand { \satz } [2]{ \marginpar { \footnotesize \textit { Satz~#1 (#2)} } }
\newcommand { \defin } [2]{ \marginpar { \footnotesize \textit { Def.~#1 (#2)} } }
\newcommand { \kor } [2]{ \marginpar { \footnotesize \textit { Kor.~#1 (#2)} } }
\newcommand { \lem } [2]{ \marginpar { \footnotesize \textit { Lem.~#1 (#2)} } }
2018-10-03 16:43:55 +02:00
\newcommand { \bem } [2]{ \marginpar { \footnotesize \textit { Bem.~#1 (#2)} } }
\newcommand { \alg } [2]{ \marginpar { \footnotesize \textit { Alg.~#1 (#2)} } }
2018-10-03 14:22:06 +02:00
%Abkürzungen für Symbole, Reduktionen, etc.
2018-10-03 13:34:14 +02:00
\newcommand { \app } { \ensuremath { \rightarrow _ a} }
\newcommand { \norm } { \ensuremath { \rightarrow _ n} }
2018-10-03 16:16:26 +02:00
\newcommand { \pteq } { \ensuremath { \overset { \cdot } { =} } }
2018-10-05 13:57:17 +02:00
\newcommand { \bred } { \ensuremath { \rightarrow _ \beta } }
\newcommand { \ered } { \ensuremath { \rightarrow _ \eta } }
2018-10-03 13:34:14 +02:00
\theoremstyle { definition}
\newtheorem { definition} { Definition} [section]
2018-10-05 14:49:41 +02:00
\title { Merkzettel für \enquote { Theorie~der~Programmierung} }
2018-10-03 13:34:14 +02:00
\author { Marco Ammon}
\date { \today }
\begin { document}
\maketitle
\section * { Termersetzungssysteme}
\subsection * { Terminierung}
2018-10-05 14:49:41 +02:00
\satz { 2.31} { 15}
Sei $ > $ Reduktionsordnung, und es gelte: $ \forall t,s.t \rightarrow _ 0 s \Rightarrow t>s $ . Dann ist $ \rightarrow $ stark normalisierend.
2018-10-03 13:34:14 +02:00
\subsubsection * { Polynomordnungen}
2018-10-05 14:49:41 +02:00
\kor { 2.44} { 18}
Wir definieren $ A \subseteq \mathbb { N } $ und für jede $ n $ -stellige Operation $ f $ ein Polynom $ p _ f ( x _ 1 , \ldots , x _ n ) $ . Wenn die linken Seiten der Umformungsregeln $ > _ A $ den rechten sind, ist das zugehörige TES stark normalisierend.
2018-10-03 13:34:14 +02:00
\subsection * { Konfluenz}
2018-10-05 14:49:41 +02:00
\subsubsection * { Critical Pairs}
\begin { itemize}
\item Definition kritisches Paar: \defin { 2.55} { 22} \\
Seien $ l _ 1 \rightarrow _ 0 r _ 1 $ und $ l _ 2 \rightarrow r _ 2 $ zwei Umformungsregeln des TES sowie $ FV ) ( l _ 1 ) \cap FV ( l _ 2 ) = \emptyset $ (ggf. nach Umbenennung). Sei $ l _ 1 = C ( t ) $ , wobei $ t $ nicht nur eine Variable ist, so dass $ t $ und $ l _ 2 $ unifizierbar sind. Sei $ \sigma = mgu ( t, l _ 2 ) $ . Dann heißt $ ( r _ 1 \sigma , C ( r _ 2 ) \sigma ) $ ein kritisches Paar.
\item Ein TES $ T $ ist genau dann lokal konfluent, wenn in $ T $ alle kritischen Paare zusammenführbar sind. \satz { 2.60} { 24}
\item Ein stark normalisierendes und lokal konfluentes TES ist konfluent. \satz { 2.51} { 21}
\end { itemize}
2018-10-03 13:34:14 +02:00
\section * { $ \lambda $ -Kalkül}
\subsection * { Ungetypt}
2018-10-05 13:57:17 +02:00
\begin { itemize}
\item $ \beta $ -Reduktion
\begin { equation*}
(\lambda x.t)s \bred t[s/x]
\end { equation*}
\item $ \eta $ -Reduktion
\begin { equation*}
\lambda x.yx \ered y
\end { equation*}
2018-10-08 17:54:50 +02:00
\item $ \alpha $ -Äquivalenz: $ t _ 1 = _ \alpha t _ 2 $ , wenn $ t _ 2 $ durch Umbenennung gebundener Variablen aus $ t _ 1 $ hervorgeht, formal: \defin { 3.6} { 31}
\begin { align*}
\underbrace { \lambda x.u} _ { t_ 1} =_ \alpha \underbrace { \lambda y.u[y/x]} _ { t_ 2} & & \text { wenn } y \notin FV(u)
\end { align*}
2018-10-05 13:57:17 +02:00
\end { itemize}
2018-10-03 13:34:14 +02:00
\subsubsection * { Auswertungsstrategien}
\begin { itemize}
2018-10-03 14:22:06 +02:00
\item applikativ (\textit { leftmost-innermost} ) \app \defin { 3.13} { 33}
2018-10-03 13:34:14 +02:00
\begin { itemize}
\item $ \lambda x.t \app \lambda x.t' $ , wenn $ t \app t' $
\item $ ts \app t's $ , wenn $ t \app t' $
\item $ ts \app ts' $ , wenn $ s \app s' $ und $ t $ normal ist
\item $ ( \lambda x.t ) s \app t \lbrack s / x \rbrack $ , wenn $ t $ und $ s $ normal sind
2018-10-03 14:22:06 +02:00
\item effizient
2018-10-03 13:34:14 +02:00
\end { itemize}
2018-10-03 14:22:06 +02:00
\item normal (\textit { leftmost-outermost} ) \norm \defin { 3.14} { 34}
2018-10-03 13:34:14 +02:00
\begin { itemize}
\item $ ( \lambda x.t ) s \norm t \lbrack s / x \rbrack $
\item $ \lambda x.t \norm \lambda x.t' $ , wenn $ t \norm t' $
\item $ ts \norm t's $ m wenn $ t \norm t' $ und $ t $ keine $ \lambda $ -Abstraktion ist
\item $ ts \norm ts' $ , wenn $ s \norm s' $ und $ t $ normal und keine $ \lambda $ -Abstraktion ist
2018-10-03 14:22:06 +02:00
\item terminiert immer, falls Normalform existiert (nach Standardisierungssatz) \satz { 3.17} { 35}
2018-10-03 13:34:14 +02:00
\end { itemize}
\end { itemize}
2018-10-03 16:16:26 +02:00
\subsection * { Einfach getypt $ ( \lambda \rightarrow ) $ }
\siehe { S. 39} \begin { itemize}
\item Church: Annotation der Variablen mit Typen, nur herleitbare Terme hinschreibbar
\item Curry: Alle Terme hinschreibbar, dann Aussondern der nicht typisierbaren
\item Typregeln: \siehe { S. 39}
2018-10-05 13:57:17 +02:00
\begin { prooftree}
\AxiomC { }
\LeftLabel { $ ( Ax ) $ }
\RightLabel { $ x: \alpha \in \Gamma $ }
\UnaryInfC { $ \Gamma \vdash x: \alpha $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma \vdash t: \alpha \rightarrow \beta $ }
\AxiomC { $ \Gamma \vdash s: \alpha $ }
\LeftLabel { $ ( \rightarrow _ e ) $ }
\BinaryInfC { $ \Gamma \vdash ts: \beta $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma , x: \alpha \vdash t: \beta $ }
\LeftLabel { $ ( \rightarrow _ i ) $ }
\UnaryInfC { $ \Gamma \vdash \lambda x.t: \alpha \rightarrow \beta $ }
\end { prooftree}
2018-10-03 16:43:55 +02:00
\item Typisierungsprobleme \siehe { S. 40}
\begin { itemize}
2018-10-03 16:16:26 +02:00
\item Typcheck: \enquote { Gilt $ \Gamma \vdash t: \alpha $ ?}
\item Typinferenz: \enquote { Was ist das beste $ \alpha $ / Existiert $ \alpha $ mit $ \Gamma \vdash t: \alpha $ ?}
\item Type inhabitation: \enquote { Existiert $ t $ mit $ \Gamma t: \alpha $ ?}
\end { itemize}
2018-10-05 13:57:17 +02:00
\item Inversionslemma \lem { 3.29} { 41}
\begin { enumerate}
\item $ \Gamma \vdash x: \alpha \Rightarrow x: \alpha \in \Gamma $
\item $ \Gamma \vdash ts: \beta \Rightarrow \exists \alpha $ mit $ \Gamma \vdash t: \alpha \rightarrow \beta $ und $ \Gamma \vdash s: \alpha $
\item $ \Gamma \vdash \lambda x.t: \gamma \Rightarrow \gamma = \alpha \rightarrow \beta $ mit $ \Gamma , x: \alpha \vdash t: \beta $
\end { enumerate}
2018-10-03 16:16:26 +02:00
\item Typinferenz \siehe { S. 41}
\begin { itemize}
\item Typsubstitution $ \sigma $ ist Lösung von $ \Gamma \vdash t: \alpha $ , wenn $ \Gamma \sigma \vdash t: \alpha \sigma $ herleitbar
\item Substitutionen: $ \sigma _ 1 $ allgemeiner als $ \sigma _ 2 \Leftrightarrow \exists \tau . \sigma _ 1 \tau = \sigma _ 2 $ \siehe { GLoIn, S. 38}
\item Prinzipaltyp von $ \Gamma , t $ ist $ \sigma ( a ) $ für allgemeinste Lösung $ \sigma $ von $ \Gamma \vdash t:a $ ($ a $ frisch)
2018-10-03 16:43:55 +02:00
\item Algorithmus W (Hindley/Milner) \alg { 3.31} { 42}
2018-10-03 16:16:26 +02:00
\begin { itemize}
\item Menge $ PT $ von Typgleichungen
\begin { align*}
2018-10-08 19:19:25 +02:00
PT(\Gamma ;x;\alpha ) & = \lbrace \alpha \pteq \beta ~\vert ~ x:\beta \in \Gamma \rbrace \\
2018-10-03 16:16:26 +02:00
PT(\Gamma ; \lambda x.t; \alpha ) & = PT((\Gamma ;x:a);t;b) \cup \lbrace a\rightarrow b \pteq \alpha \rbrace \ \text { mit $ a,b $ frisch} \\
PT(\Gamma ;ts;\alpha ) & = PT(\Gamma ; t; a\rightarrow \alpha ) \cup PT(\Gamma ;s;a)\ \text { mit $ a $ frisch}
\end { align*}
\item Typinferenz des Terms $ u $ mit leerem Kontext:
\begin { equation*}
\upvarepsilon \coloneqq PT(\emptyset ;u;a)
\end { equation*}
$ \Rightarrow $ Prinzipaltyp von $ u $ : $ \text { mgu } ( \upvarepsilon ) ( a ) $
\end { itemize}
\end { itemize}
2018-10-03 16:43:55 +02:00
\item Subjektreduktion: Wenn $ \Gamma \vdash t: \alpha $ und $ t \rightarrow _ \beta ^ * s $ , dann auch $ \Gamma \vdash s: \alpha $ , aber nicht umgekehrt! \satz { 3.38} { 45}
2018-10-03 16:16:26 +02:00
\end { itemize}
2018-10-04 18:12:22 +02:00
\section * { Induktive Datentypen}
2018-10-05 14:27:31 +02:00
\subsection * { Mengenkonstruktionen} \defin { 4.12} { 56} \lem { 4.13} { 57}
\begin { align*}
X_ 1 \times X_ 2 & = \left \lbrace \left (x_ 1, x_ 2\right )\vert x_ i \in X_ i\text { für } i=1,2\right \rbrace & & \text { (\enquote { struct} )} \\
X_ 1 + X_ 2 & = \left \lbrace (i,x) \vert i=1,2, x\in X_ i\right \rbrace & & \text { (\enquote { union} )} \\
1 & = \left \lbrace * \right \rbrace & & \text { \enquote { ()} in Haskell}
\end { align*}
2018-10-04 23:55:01 +02:00
2018-10-05 14:27:31 +02:00
Seien $ f _ i :X _ i \rightarrow Y _ i $ , $ g _ i: X _ i \rightarrow Z $ und $ h _ i : Z \rightarrow X _ i $ mit $ i \in \{ 1 , 2 \} $ .
\begin { align*}
f_ 1 \times f_ 2 & : X_ 1 \times X_ 2 \rightarrow Y_ 1 \times Y_ 2, & (f_ 1\times f_ 2) (x_ 1, x_ 2) & = (f_ 1(x_ 1), f_ 2(x_ 2))\\
f_ 1 + f_ 2 & : X_ 1 + X_ 2 \rightarrow Y_ 1 + Y_ 2, & (f_ 1+f_ 2)(i,x) & = (i, f_ i(x))\\
[g_ 1, g_ 2] & : X_ 1 + X_ 2 \rightarrow Z, & [g_ 1, g_ 2])(i,x) & = g_ i(x)\\
\langle h_ 1, h_ 2\rangle & : Z\rightarrow X_ 1\times X_ 2, & \langle h_ 1, h_ 2\rangle (z) & = (h_ 1(z), h_ 2(z))\\
in_ i & : X_ i \rightarrow X_ 1 + X_ 2, & in_ i(x) & = (i,x)\\
\pi _ i & : X_ 1\times X_ 2 \rightarrow X_ i, & \pi _ i(x_ 1,x_ 2) & = x_ i\\
1& : 1\rightarrow 1
\end { align*}
Es gilt
\begin { align*}
[g_ 1, g_ 2] \circ in_ i & = g_ i\\
f_ 1 + f_ 2 & = [in_ 1 \circ f_ 1, in_ 2 \circ f_ 2]\\
[r\circ in_ 1, r\circ in_ 2] & = r \text { für } r: X_ 1+X_ 2 \rightarrow Z\\
\pi _ i \circ \langle h_ 1, h_ 2\rangle & = h_ i\\
f_ 1 \times f_ 2 & = \langle f_ 1 \circ \pi _ 1, f_ 2\circ \pi _ 2\rangle \\
\langle \pi _ i \circ f, \pi _ 2\circ f\rangle & = f \text { für } f: Z\rightarrow X_ 1\times X_ 2
\end { align*}
2018-10-04 18:12:22 +02:00
\subsection * { Strukturelle Induktion}
\begin { itemize}
\item über einsortige Datentypen \siehe { S. 63}
\begin { itemize}
\item Induktionsanfang: \enquote { Anfangs} -Konstruktor (etwa $ Nil $ )
\item Induktionsschritt: alle anderen Konstruktoren (etwa $ cons $ )
\end { itemize}
\item über mehrsortige Datentypen \siehe { S. 64}
\begin { itemize}
\item Funktionen müssen immer auf allen Datentypen definiert werden
\end { itemize}
\end { itemize}
\subsection * { Kodatentypen}
2018-10-05 14:27:31 +02:00
\begin { itemize}
\item Definition über \enquote { Destruktoren} etwa $ hd $ und $ tl $
\end { itemize}
2018-10-04 18:12:22 +02:00
\subsection * { Koinduktion}
\begin { itemize}
\item Bisimulation $ R \subseteq A ^ \omega \times A ^ \omega $ , wenn für alle $ ( s,t ) \in R $ gilt: \defin { 4.39} { 74}
\begin { align*}
hd\ s & = hd\ t\\
(tl\ s)\ & R\ (tl\ t)
\end { align*}
\item Wenn $ R $ eine Bisimulation ist, gilt $ sRt \Rightarrow s = t $ \satz { 4.40} { 74}
\end { itemize}
\section * { System F}
2018-10-04 23:55:01 +02:00
\subsection * { Curry}
\begin { itemize}
\item Typen:\defin { 5.1} { 84}
\begin { align*}
\alpha , \beta \coloneqq a\ \vert \ \alpha \rightarrow \beta \ \vert \ \forall a.\alpha & & (a\in V)
\end { align*}
2018-10-05 13:57:17 +02:00
\item Typisierung: \defin { 5.1} { 84}
\begin { prooftree}
\AxiomC { }
\LeftLabel { $ ( Ax ) $ }
\RightLabel { $ ( x: \alpha \in \Gamma ) $ }
\UnaryInfC { $ \Gamma \vdash x: \alpha $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma \vdash t: \alpha \rightarrow \beta $ }
\AxiomC { $ \Gamma \vdash s: \alpha $ }
\LeftLabel { $ ( \rightarrow _ e ) $ }
\BinaryInfC { $ \Gamma \vdash ts: \beta $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma , x: \alpha \vdash t: \beta $ }
\LeftLabel { $ ( \rightarrow _ i ) $ }
\UnaryInfC { $ \Gamma \vdash \lambda x.t: \alpha \rightarrow \beta $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma \vdash s: \alpha $ }
\AxiomC { $ a \notin FV ( \Gamma ) $ }
\LeftLabel { $ ( \forall _ i ) $ }
\BinaryInfC { $ \Gamma \vdash s: \forall a. \alpha $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma \vdash s: \forall a. \alpha $ }
\LeftLabel { $ ( \forall _ e ) $ }
\UnaryInfC { $ \Gamma \vdash s: ( \alpha [ \beta / a ] ) $ }
\end { prooftree}
2018-10-04 23:55:01 +02:00
\end { itemize}
\subsection * { Church-Kodierung} \siehe { S. 84}
\begin { itemize}
\item Natürliche Zahlen
\begin { align*}
2018-10-05 13:57:17 +02:00
\mathbb { N} \ & \coloneqq \forall a.(a\rightarrow a) \rightarrow a \rightarrow a\\
zero\ & : \mathbb { N} \\
zero\ & = \lambda fx.x\\
suc\ & : \mathbb { N} \rightarrow \mathbb { N} \\
suc\ & = \lambda nfx.f(nfx)\\
fold\ & : \forall a.(a\rightarrow a) \rightarrow a \rightarrow \mathbb { N} \rightarrow a\\
fold\ & = \lambda fxn.nfx\\
add & : \mathbb { N} \rightarrow \mathbb { N} \rightarrow \mathbb { N} \\
add & = \lambda n.fold\ suc\ n
2018-10-04 23:55:01 +02:00
\end { align*}
\item Paare
\begin { align*}
2018-10-05 13:57:17 +02:00
(a\times b)\ & \coloneqq \forall r.(a\rightarrow b\rightarrow r)\rightarrow r\\
pair\ & : \forall ab.a\rightarrow b\rightarrow (a\times b)\\
pair\ & = \lambda xyf.fxy\\
fst\ & : \forall ab.(a\times b) \rightarrow a\\
fst\ & = \lambda p.p (\lambda xy.x)\\
snd\ & : \forall ab.(a\times b) \rightarrow b\\
snd\ & = \lambda p.p(\lambda xy.y)
2018-10-04 23:55:01 +02:00
\end { align*}
\item Summen
\begin { align*}
2018-10-05 13:57:17 +02:00
(a+b)\ & \coloneqq \forall r.(a\rightarrow r) \rightarrow (b \rightarrow r)\rightarrow r\\
inl\ & : \forall ab.a\rightarrow (a+b)\\
inl\ & = \lambda xfg.fx\\
inr\ & : \forall ab.b\rightarrow (a+b)\\
inr\ & = \lambda yfg.gy\\
case\ & : \forall abs.(a\rightarrow s)\rightarrow (b\rightarrow s) \rightarrow (a+b) \rightarrow s\\
case\ & = \lambda fgs.sfg
2018-10-04 23:55:01 +02:00
\end { align*}
\item Listen
\begin { align*}
2018-10-05 13:57:17 +02:00
List\ a\ & \coloneqq \forall r.r\rightarrow (a\rightarrow r\rightarrow r)\rightarrow r\\
Nil\ & : \forall a.Lista\ a\\
Nil\ & = \lambda uf.u\\
Cons\ & : \forall a.a\rightarrow List\ a\rightarrow List\ a\\
Cons\ & = \lambda xluf.fx(luf)\\
len\ & : \forall a.List\ a\rightarrow \mathbb { N} \\
len\ & = \lambda l.l\ zero\ (\lambda xr.suc\ r)
2018-10-04 23:55:01 +02:00
\end { align*}
\end { itemize}
2018-10-04 18:12:22 +02:00
\subsection * { ML-Polymorphie}
2018-10-04 23:55:01 +02:00
\begin { itemize}
\item Einschränkung von System F durch $ \forall $ nur auf oberster Ebene sowie Mehrfachinstanziierung polymorpher Funktionen nur in $ let $ -Konstrukt \siehe { S. 88}
\item Typen
\begin { equation*}
\alpha , \beta \coloneqq a\ \vert \ \alpha \rightarrow \beta
\end { equation*}
\item Typschemata
\begin { align*}
S \coloneqq \forall a_ 1, \ldots , a_ k.\alpha & & (k\geq 0)
\end { align*}
\item Terme
\begin { equation*}
t,s \coloneqq x\ \vert \ t\ s\ \vert \ \lambda x.t\ \vert \ let\ x = t\ in\ s
\end { equation*}
\item Kontexte
\begin { align*}
\Gamma & = ( x_ 1:S_ 1,\ldots , x_ n :S_ n )\\
Cl(\Gamma , \alpha ) & = \forall a_ 1,\ldots ,a_ k.\alpha & & \text { für $ FV ( \alpha ) \backslash FV ( \Gamma ) = \lbrace a _ 1 , \ldots ,a _ k \rbrace $ }
\end { align*}
2018-10-05 13:57:17 +02:00
\item Typisierungsregeln \siehe { S. 88}
\begin { prooftree}
\AxiomC { }
\LeftLabel { $ ( \forall _ e ) $ }
\RightLabel { $ ( x: \forall a _ 1 , \ldots , \forall a _ k . \alpha ) \in \Gamma $ }
\UnaryInfC { $ \Gamma \vdash x: \alpha [ \beta _ 1 / a _ 1 , \ldots , \beta _ k / a _ k ] $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma , x: \alpha \vdash t: \beta $ }
\LeftLabel { $ ( \rightarrow _ i ) $ }
\UnaryInfC { $ \Gamma \vdash \lambda x.t: \alpha \rightarrow \beta $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma \vdash t: \alpha \rightarrow \beta $ }
\AxiomC { $ \Gamma \vdash s: \alpha $ }
\LeftLabel { $ ( \rightarrow _ e ) $ }
\BinaryInfC { $ \Gamma \vdash ts: \beta $ }
\end { prooftree}
\begin { prooftree}
\AxiomC { $ \Gamma \vdash t: \alpha $ }
\AxiomC { $ \Gamma , x:Cl ( \Gamma , \alpha ) \vdash s: \beta $ }
\LeftLabel { (let)}
\BinaryInfC { $ \Gamma \vdash $ let $ x = t $ in $ s: \beta $ }
\end { prooftree}
\item Inversionslemma \siehe { S. 89}
\begin { enumerate}
\item Wenn $ \Gamma \vdash x: \alpha $ , dann existieren Typen $ \beta _ i $ und ein Typschema $ S = \forall a _ 1 \ldots \forall a _ k. \gamma $ , so dass $ ( x:S ) \in \Gamma $ und $ \alpha = \gamma [ \beta _ 1 / a _ 1 , \ldots , \beta _ k / a _ k ] $
\item Wenn $ \Gamma \vdash ( $ let $ x = s $ in $ t ) : \alpha $ , dann existiert ein Typ $ \beta $ nut $ \Gamma \vdash s: \beta $ und $ \Gamma , x:Cl ( \Gamma , \beta ) \vdash t: \alpha $
\end { enumerate}
2018-10-08 19:04:09 +02:00
\item erweiterter Algorithmus W mit Menge $ PT $ von Typgleichungen \siehe { S. 90}
2018-10-05 13:57:17 +02:00
\begin { align*}
2018-10-08 19:04:09 +02:00
PT(\Gamma ;x;\alpha ) & = \lbrace \alpha \pteq \gamma [a_ 1'/a_ 1,\ldots ,a_ k'/a_ k] \rbrace \text { mit } (x: \forall a_ 1,\ldots ,\forall a_ k .\gamma ) \in \Gamma \\
2018-10-05 13:57:17 +02:00
PT(\Gamma ; \lambda x.t; \alpha ) & = PT((\Gamma ;x:a);t;b) \cup \lbrace a\rightarrow b \pteq \alpha \rbrace \ \text { mit $ a,b $ frisch} \\
PT(\Gamma ;ts;\alpha ) & = PT(\Gamma ; t; a\rightarrow \alpha ) \cup PT(\Gamma ;s;a)\ \text { mit $ a $ frisch} \\
PT(\Gamma ;(\text { let } x=s\text { in } t);\alpha ) & = PT(\Gamma \sigma , x:Cl(\Gamma \sigma , \sigma (b));t;\alpha \sigma )
\end { align*}
wobei $ \sigma = mgu ( PT ( \Gamma ;s;b ) ) $ mit $ b $ frisch
2018-10-04 23:55:01 +02:00
\end { itemize}
2018-10-05 13:57:17 +02:00
\section * { Minimierung von deterministischen endlichen Automaten}
\begin { enumerate}
\item Entferne aus $ Q $ alle nicht erreichbaren Zustände
\item Initialisiere $ R $ auf $ \lbrace ( q _ 1 , q _ 2 ) \ \vert \ q _ 1 \in F \Leftrightarrow q _ 2 \in F \rbrace $
\item Suche ein Paar $ ( q _ 1 ,q _ 2 ) \in R $ und einen Buchstaben $ a \in \Sigma $ mit
\begin { equation*}
(\delta (a,q_ 1),\delta (a,q_ 2)) \notin R
\end { equation*}
Wenn kein solches Paar gefunden wird, gehe zu Schritt 4. Andernfalls entferne $ ( q _ 1 ,q _ 2 ) $ aus $ R $ und fahre bei 3. fort.
\item Identifiziere alle Zustandspaare in $ R $ .
\end { enumerate}
2018-10-03 16:16:26 +02:00
\section * { Unifikationsalgorithmus (Martelli/Montanari)}
\begin { align*}
& S \cup \lbrace x \pteq x\rbrace & & \rightarrow S & & \text { (delete)} \\
& S \cup \lbrace f(E_ 1, \ldots , E_ n) \pteq f(D_ 1, \ldots , D_ n)\rbrace & & \rightarrow S \cup \lbrace E_ 1 \pteq D_ 1, \ldots , E_ n \pteq D_ n\rbrace & & \text { (decomp)} \\
& S \cup \lbrace f(E_ 1, \ldots , E_ n) \pteq g(D_ 1, \ldots , D_ k)\rbrace & & \rightarrow \bot \text { (für $ f \not = g $ )} & & \text { (conflict)} \\
& S \cup \lbrace E \pteq x \rbrace & & \rightarrow S \cup \lbrace x \pteq E \rbrace \text { (für $ E $ keine Variable)} & & \text { (orient)} \\
& S \cup \lbrace x \pteq E \rbrace & & \rightarrow \begin { cases*}
\bot (\text { für } x \in FV(E), x\not = E) \\
S\lbrack E/x\rbrack \cup \lbrace x \pteq E\rbrace (\text { für } x\notin FV(E), x\in FV(S))
\end { cases*} & & \text { (occurs)/(elim)}
\end { align*}
2018-10-08 16:53:31 +02:00
\section * { Notation}
\begin { itemize}
\item Applikation ist links-assoziativ: $ ( ( x ( yz ) ) u ) v = x ( yz ) uv $
\item Abstraktion reicht so weit wie möglich: $ \lambda x. ( x ( \lambda y. ( yx ) ) ) = \lambda x.x ( \lambda y.yx ) $
\item Aufeinanderfolgende Abstraktionen werden zusammengefasst: $ \lambda x. \lambda y. \lambda z.yx = \lambda xyz.yz $
\end { itemize}
\section * { Definitionen aus der Übung}
\begin { align*}
flip\ & = \lambda f\ x\ y.f\ y\ x\\
const\ & = \lambda x\ y.x\\
twice\ & = \lambda f\ x.f\ (f\ x)
\end { align*}
\begin { align*}
true\ & = \lambda x\ y.x\\
false\ & = \lambda x\ y.y\\
if\_ then\_ else\ & = \lambda b\ x\ y.b\ x\ y
\end { align*}
\begin { align*}
pair\ a\ b\ & = \lambda select.select\ a\ b\\
fst\ p\ & = p\ (\lambda x\ y.x)\\
snd\ p\ & = p\ (\lambda x\ y.y)\\
swap\ p\ & = p\ (\lambda x\ y\ select.select\ y\ x)
\end { align*}
\begin { align*}
zero\ & = \lambda f\ a.a\\
succ\ n\ & = \lambda f\ a. f\ (n\ f\ a)\\
add\ n\ m\ & = \lambda f\ a. n\ f\ (m\ f\ a) = n\ succ\ m\\
mult\ n\ m\ & = \lambda f\ a.n\ (m\ f)\ a = n\ (add\ m)\ 0\\
isZero\ n & = n\ (\lambda x.false)\ true\\
odd\ n\ & if\ (n == 0)\ then\ true\ else\ (not\ (odd\ n-\lceil 1\rceil ))
\end { align*}
\begin { align*}
length\ Nil\ & = 0\\
length\ (Cons\ x\ xs)\ & = 1 + length(xs)
\end { align*}
\begin { align*}
snoc\ Nil\ x\ & = Cons\ x\ Nil\\
snoc\ (Cons\ x\ xs)\ y\ & = Cons\ x\ (snoc\ xs\ y)
\end { align*}
\begin { align*}
reverse\ Nil\ & = Nil\\
reverse\ (Cons\ x\ xs)\ & = snoc\ reverse(xs)\ x
\end { align*}
\begin { align*}
drop\ y\ Nil\ = Nil\\
drop\ y\ (Cons\ x\ xs) & = \begin { cases*}
drop\ y\ xs\ \text { , falls } y=x\\
Cons\ x\ (drop\ y\ xs)\ \text { , sonst}
\end { cases*}
\end { align*}
\begin { align*}
elem\ y\ Nil\ & = False\\
elem\ y\ (Cons\ x\ xs) & = \begin { cases*}
True\ \text { , falls x=y} \\
elem\ y\ xs\ \text { , sonst}
\end { cases*}
\end { align*}
\begin { align*}
minimum\ Nil\ & = 0\\
minimum\ (Cons\ x\ xs)\ & = \begin { cases*}
x\ \text { , falls $ minimum \ xs $ = 0} \\
min\ x\ (minimum\ xs)\ \text { , sonst}
\end { cases*}
\end { align*}
2018-10-08 17:48:48 +02:00
\begin { align*}
Nil \oplus ys & = ys\\
(Cons\ x\ xs) \oplus ys\ & = Cons\ x\ (xs \oplus ys)
\end { align*}
2018-10-03 13:34:14 +02:00
\end { document}