Skip to content

Commit

Permalink
misc
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinThoma committed Mar 9, 2014
1 parent 2a58ef9 commit 25732f4
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 32 deletions.
49 changes: 31 additions & 18 deletions documents/Programmierparadigmen/Lambda.tex
Original file line number Diff line number Diff line change
Expand Up @@ -101,14 +101,16 @@ \section{Auswertungsstrategien}

Die Call-By-Name Auswertung wird in Funktionen verwendet.

Haskell verwendet die Call-By-Name Auswertungsreihenfolge zusammen mit \enquote{sharing}. Dies nennt man Lazy Evaluation.
\todo[inline]{Was ist sharing?}

\begin{definition}[Call-By-Value]\xindex{Call-By-Value}%
In der Call-By-Value Auswertung wird der linkeste Redex reduziert, der
nicht von einem $\lambda$ umgeben ist und dessen Argument ein Wert ist.
\end{definition}

Die Call-By-Value Auswertungsreihenfolge wird in C und Java verwendet.
Auch in Haskell werden arithmetische Ausdrücke in der Call-By-Name Auswertungsreihenfolge
reduziert.
Auch in Haskell werden arithmetische Ausdrücke in der Call-By-Name Auswertungsreihenfolge reduziert.

\section{Church-Zahlen}
Im $\lambda$-Kalkül lässt sich jeder mathematische Ausdruck darstellen, also
Expand All @@ -120,52 +122,63 @@ \section{Church-Zahlen}
das zu machen sind die sog. \textit{Church-Zahlen}.

Dabei ist die Idee, dass die Zahl angibt wie häufig eine Funktion $f$ auf eine
Variable $x$ angewendet wird. Also:
Variable $z$ angewendet wird. Also:
\begin{itemize}
\item $0 := \lambda f~x. x$
\item $1 := \lambda f~x. f x$
\item $2 := \lambda f~x. f (f x)$
\item $3 := \lambda f~x. f (f (f x))$
\item $0 := \lambda f~z. z$
\item $1 := \lambda f~z. f z$
\item $2 := \lambda f~z. f (f z)$
\item $3 := \lambda f~z. f (f (f z))$
\end{itemize}

Auch die gewohnten Operationen lassen sich so darstellen.

\begin{beispiel}[Nachfolger-Operation]
\begin{align*}
\succ :&= \lambda n f z. f (n f x)\\
&= \lambda n. (\lambda f (\lambda x f (n f x)))
\succ :&= \lambda n f z. f (n f z)\\
&= \lambda n. (\lambda f (\lambda z f (n f z)))
\end{align*}
Dabei ist $n$ die Zahl.

Will man diese Funktion anwenden, sieht das wie folgt aus:
\begin{align*}
\succ 1 &= (\lambda n f x. f(n f x)) 1\\
&= (\lambda n f x. f(n f x)) \underbrace{(\lambda f~x. f x)}_{n}\\
&= \lambda f x. f (\lambda f~x. f x) f x\\
&= \lambda f x. f (f x)\\
&= 2
\succ 1&= (\lambda n f z. f(n f z)) 1\\
&= (\lambda n f z. f(n f z)) \underbrace{(\lambda f~z. f z)}_{n}\\
&= \lambda f z. f (\lambda f~z. f z) f z\\
&= \lambda f z. f (f z)\\
&= 2
\end{align*}
\end{beispiel}

\begin{beispiel}[Addition]
\begin{align*}
\text{+} : &= \lambda m n f x. m f (n f x)
\text{plus} &:= \lambda m n f z. m f (n f z)
\end{align*}
Dabei ist $m$ der erste Summand und $n$ der zweite Summand.
\end{beispiel}

\begin{beispiel}[Multiplikation]
%\[\text{\cdot} := \lambda m n.m(n f) \]
\begin{align*}
\text{times} :&= \lambda m n f. m~s~(n~f~z)\\
&\overset{\eta}{=} \lambda m n f z. n (m s) z
\end{align*}
Dabei ist $m$ der erste Faktor und $n$ der zweite Faktor.
\end{beispiel}

\begin{beispiel}[Potenz]
%\[\text{\cdot} := \text{TODO}\]
\begin{align*}
\text{exp} :&= \lambda b e. eb\\
&\overset{\eta}{=} \lambda b e f z. e b f z
\end{align*}
Dabei ist $b$ die Basis und $e$ der Exponent.
\end{beispiel}

\section{Weiteres}
\section{Church-Booleans}
\begin{definition}[Church-Booleans]\xindex{Church-Booleans}%
\texttt{True} wird zu $c_{\text{true}} := \lambda t. \lambda f. t$.\\
\texttt{False} wird zu $c_{\text{false}} := \lambda t. \lambda f. f$.
\end{definition}

\section{Weiteres}
\begin{satz}[Satz von Curch-Rosser]
Wenn zwei unterschiedliche Terme $a$ und $b$ äquivalent sind, d.h. mit Reduktionsschritten beliebiger Richtung ineinander transformiert werden können, dann gibt es einen weiteren Term $c$, zu dem sowohl $a$ als auch $b$ reduziert werden können.
\end{satz}
Binary file modified documents/Programmierparadigmen/Programmierparadigmen.pdf
Binary file not shown.
2 changes: 1 addition & 1 deletion documents/Programmierparadigmen/Prolog.tex
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ \chapter{Prolog}
\section{Erste Schritte}
\subsection{Hello World}
Speichere folgenden Quelltext als \texttt{hello-world.pl}:
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.hs]{prolog}{scripts/prolog/hello-world.hs}
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.hs]{prolog}{scripts/prolog/hello-world.pl}

Kompiliere ihn mit \texttt{gplc hello-world.pl}. Es wird eine
ausführbare Datei erzeugt.
Expand Down
24 changes: 19 additions & 5 deletions documents/Programmierparadigmen/Symbolverzeichnis.tex
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,25 @@ \section*{Reguläre Ausdrücke}
$\epsilon\;\;\;$ Das leere Wort\\
$\alpha, \beta\;\;\;$ Reguläre Ausdrücke\\
$L(\alpha)\;\;\;$ Die durch $\alpha$ beschriebene Sprache\\
$L(\alpha | \beta) = L(\alpha) \cup L(\beta)$\\
$L(\alpha \cdot \beta) = L(\alpha) \cdot L(\beta)$\\
$\alpha^+ = L(\alpha)^+$ TODO: Was ist $L(\alpha)^+$\\
$\alpha^* = L(\alpha)^*$ TODO: Was ist $L(\alpha)^*$\\
$\begin{aligned}[t]
L(\alpha | \beta) &= L(\alpha) \cup L(\beta)\\
L(\alpha \cdot \beta)&= L(\alpha) \cdot L(\beta)
\end{aligned}$\\
$L^0 := \Set{\varepsilon}\;\;\;$ Die leere Sprache\\
$L^{n+1} := L^n \circ L \text{ für } n \in \mdn_0\;\;\;$ Potenz einer Sprache\\
$\begin{aligned}[t]
\alpha^+ &=& L(\alpha)^+ &=& \bigcup_{i \in \mdn} L(\alpha)^i\\
\alpha^* &=& L(\alpha)^* &=& \bigcup_{i \in \mdn_0} L(\alpha)^i
\end{aligned}$

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Reguläre Ausdrücke %
% Logik %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Logik}
$\mathcal{M} \models \varphi\;\;\;$ Im Modell $\mathcal{M}$ gilt das Prädikat $\varphi$.\\
$\psi \vdash \varphi\;\;\;$ Die Formel $\varphi$ kann aus der Menge der Formeln $\psi$ hergeleitet werden.\\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Weiteres %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Weiteres}
$\bot\;\;\;$ Bottom\\
4 changes: 0 additions & 4 deletions documents/Programmierparadigmen/Vorwort.tex
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ \section*{Anregungen, Verbesserungsvorschläge, Ergänzungen}
Pull-Request gemacht werden oder mir per Email an [email protected]
geschickt werden.

\section*{Was ist Programmierparadigmen?}

TODO

\section*{Erforderliche Vorkenntnisse}
Grundlegende Kenntnisse vom Programmieren, insbesondere mit Java,
wie sie am KIT in \enquote{Programmieren} vermittelt werden, werden
Expand Down
23 changes: 19 additions & 4 deletions documents/Programmierparadigmen/X10.tex
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
\chapter{X10}
\index{X10|(}
%!TEX root = Programmierparadigmen.tex
\chapter{X10}\index{X10|(}%
X10 ist eine objektorientierte Programmiersprache, die 2004 bei IBM entwickelt
wurde.

\section{Erste Schritte}
Als erstes sollte man x10 von \url{http://x10-lang.org/x10-development/building-x10-from-source.html?id=248} herunterladen.

Dann kann man die bin/x10c++ zum erstellen von ausführbaren Dateien nutzen.
Der Befehl \texttt{x10c++ hello-world.x10} erstellt eine ausführbare Datei namens
\texttt{a.out}.

\inputminted[numbersep=5pt, tabsize=4, frame=lines, label=hello-world.x10]{cpp}{scripts/x10/hello-world.x10}

\section{Syntax}
\section{Beispiele}

\index{X10|)}

\section{Weitere Informationen}
\begin{itemize}
\item \url{http://x10-lang.org/}
\end{itemize}
\index{X10|)}
15 changes: 15 additions & 0 deletions documents/Programmierparadigmen/scripts/x10/hello-whole-world.x10
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import x10.io.Console;

class HelloWholeWorld {
public static def main(args:Rail[String]):void {
if (args.size < 1) {
Console.OUT.println("Usage: HelloWholeWorld message");
return;
}

finish for (p in Place.places()) {
at (p) async Console.OUT.println(here+" says hello and "+args(0));
}
Console.OUT.println("Goodbye");
}
}
6 changes: 6 additions & 0 deletions documents/Programmierparadigmen/scripts/x10/hello-world.x10
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// file HelloWorld.x10
public class HelloWorld {
public static def main(args: Array[String](1)){
x10.io.Console.OUT.println("Hello, World");
}
}

0 comments on commit 25732f4

Please sign in to comment.