aboutsummaryrefslogtreecommitdiffhomepage
path: root/notes/theo2
diff options
context:
space:
mode:
Diffstat (limited to 'notes/theo2')
-rw-r--r--notes/theo2/header.tex73
-rw-r--r--notes/theo2/main.md477
-rw-r--r--notes/theo2/main.pdfbin0 -> 282520 bytes
-rw-r--r--notes/theo2/makefile23
-rw-r--r--notes/theo2/title.tex21
5 files changed, 594 insertions, 0 deletions
diff --git a/notes/theo2/header.tex b/notes/theo2/header.tex
new file mode 100644
index 0000000..959df6a
--- /dev/null
+++ b/notes/theo2/header.tex
@@ -0,0 +1,73 @@
+\usepackage{braket}
+\usepackage{polynom}
+\usepackage{amsthm}
+\usepackage{csquotes}
+\usepackage{svg}
+\usepackage{environ}
+\usepackage{mathtools}
+\usepackage{tikz,pgfplots}
+\usepackage{titleps}
+\usepackage{tcolorbox}
+\usepackage{enumitem}
+\usepackage{listings}
+\usepackage{soul}
+\usepackage{forest}
+\usepackage{datetime}
+
+\pgfplotsset{width=10cm,compat=1.15}
+\usepgfplotslibrary{external}
+\usetikzlibrary{arrows,automata,positioning}
+%\usetikzlibrary{calc,trees,positioning,arrows,arrows.meta,fit,shapes,chains,shapes.multipart}
+%\tikzexternalize
+\setcounter{MaxMatrixCols}{20}
+\graphicspath{{assets}}
+
+\newpagestyle{main}{\sethead{\toptitlemarks\thesection\quad\sectiontitle}{}{\thepage}\setheadrule{.4pt}}
+\pagestyle{main}
+
+\newtcolorbox{proof-box}{title=Beweis,colback=green!5!white,arc=0pt,outer arc=0pt,colframe=green!60!black}
+\newtcolorbox{bsp-box}{title=Beispiel,colback=orange!5!white,arc=0pt,outer arc=0pt,colframe=orange!60!black}
+\newtcolorbox{visu-box}{title=Visualisation,colback=cyan!5!white,arc=0pt,outer arc=0pt,colframe=cyan!60!black}
+\newtcolorbox{bem-box}{title=Bemerkung,colback=white,colbacktitle=white,coltitle=black,arc=0pt,outer arc=0pt,colframe=black}
+\newtcolorbox{defi-box}{title=Definition,colback=gray!5!white,arc=0pt,outer arc=0pt,colframe=gray!60!black}
+\newtcolorbox{satz-box}{title=Satz,colback=gray!5!white,arc=0pt,outer arc=0pt,colframe=gray!60!black}
+
+\newcommand\toprove{\textbf{Zu zeigen: }}
+
+\newcommand\defeq{\mathrel{\vcentcolon=}}
+\newcommand\defiff{\mathrel{\vcentcolon\Longleftrightarrow}}
+
+\newcommand\N{\mathbb{N}}
+\newcommand\R{\mathbb{R}}
+\newcommand\Z{\mathbb{Z}}
+\newcommand\Q{\mathbb{Q}}
+\newcommand\C{\mathbb{C}}
+\renewcommand\P{\mathbb{P}}
+\renewcommand\O{\mathcal{O}}
+\newcommand\pot{\mathcal{P}}
+\newcommand{\cupdot}{\mathbin{\mathaccent\cdot\cup}}
+\newcommand{\bigcupdot}{\dot{\bigcup}}
+
+\DeclareMathOperator{\ggT}{ggT}
+\DeclareMathOperator{\kgV}{kgV}
+
+\newlist{abc}{enumerate}{10}
+\setlist[abc]{label=(\alph*)}
+
+\newlist{num}{enumerate}{10}
+\setlist[num]{label=\arabic*.}
+
+\newlist{rom}{enumerate}{10}
+\setlist[rom]{label=(\roman*)}
+
+\makeatletter
+\renewenvironment{proof}[1][\proofname] {\par\pushQED{\qed}\normalfont\topsep6\p@\@plus6\p@\relax\trivlist\item[\hskip\labelsep\bfseries#1\@addpunct{.}]\ignorespaces}{\popQED\endtrivlist\@endpefalse}
+\makeatother
+\def\qedsymbol{\sc q.e.d.} % hmm?
+
+\lstset{
+ basicstyle=\ttfamily,
+ escapeinside={(*@}{@*)},
+ numbers=left,
+ mathescape
+}
diff --git a/notes/theo2/main.md b/notes/theo2/main.md
new file mode 100644
index 0000000..64e7e06
--- /dev/null
+++ b/notes/theo2/main.md
@@ -0,0 +1,477 @@
+---
+author: Marvin Borner
+date: "`\\today`{=tex}"
+lang: de-DE
+pandoc-latex-environment:
+ bem-box:
+ - bem
+ bsp-box:
+ - bsp
+ defi-box:
+ - defi
+ proof-box:
+ - proof
+ satz-box:
+ - satz
+ visu-box:
+ - visu
+toc-title: Inhalt
+---
+
+```{=tex}
+\newpage
+\renewcommand\O{\mathcal{O}} % IDK WHY
+```
+# Reguläre Sprachen und endliche Automaten
+
+## Motivation
+
+- Eingabe
+- Verarbeitung (Berechnungen, Zustände)
+- Ausgabe
+
+## Wörter und Sprachen
+
+::: defi
+Ein *Alphabet* $\Sigma$ sei eine nicht-leere, endliche Menge. Ein *Wort*
+$w$ ist entsprechend eine Folge von Elementen aus $\Sigma$.
+:::
+
+::: bsp
+- $\Sigma=\{a,...,z\}$, $w=\text{luxburg}$, $|w|=7$
+:::
+
+::: defi
+$\Sigma^n$ ist die Menge aller Wörter der Länge $n$. Die *Kleene'sche
+Hülle* ist $\Sigma^*\defeq\bigcup_{n=0}^\infty\Sigma^n$.
+$\Sigma^+\defeq\bigcup_{n=1}^\infty\Sigma^n$.
+
+*Sprache $L$ über $\Sigma$* ist eine Teilmenge von $\Sigma^*$.
+:::
+
+::: defi
+Eine *Konkatenation* ist eine Aneinanderhängung zweier Wörter $u$ und
+$w$. Eine Konkatenation zweier *Sprachen* $L_1,L_2$ ist
+$L_1\circ L_2\defeq\{uw\mid u\in L_1,\ w\in L_2\}$. Die Kleene'sche
+Hülle einer Sprache $L$ ist dann
+$L^*\defeq\{\underbrace{x_1...x_k}_{\mathclap{\text{Konkatenation von $k$ Wörtern}}}\mid x_i\in L,\ k\in\N_0\}$.
+
+Eine $k$-fache Aneinanderhängung von Wörtern ist
+$w_k=\underbrace{w...w}_\text{$k$-mal}$.
+:::
+
+::: bsp
+- $w=010$, $u=001$, $wu=\underbrace{010}_w \underbrace{001}_u$,
+ $uwu=\underbrace{001}_u \underbrace{010}_w \underbrace{001}_u$
+- $w^3=010\ 010\ 010$
+:::
+
+::: bem
+Die Konkatenation auf $\Sigma^*$ hat die Eigenschaften:
+
+- assoziativ: $a(bc)=(ab)c$
+- nicht kommutativ: $ab\ne ba$
+- neutrales Element $\varepsilon$: $\varepsilon a=a\varepsilon=a$
+- ein inverses Element
+:::
+
+::: defi
+Ein Wort $x$ heißt *Teilwort* eines Wortes $y$, falls es Wörter $u$ und
+$v$ gibt, sodass $y=uxv$.
+
+- Falls $u=\varepsilon$, $x$ *Präfix* von $y$
+- Falls $v=\varepsilon$, $x$ *Suffix* von $y$
+:::
+
+::: bsp
+- $01$ ist Teilwort von $0\textbf{01}11$
+- $10$ ist Präfix von $\textbf{10}10011$
+- $011$ ist Suffix von $10101110\textbf{011}$
+:::
+
+## Endlicher, deterministischer Automat
+
+::: defi
+Für einen *endlichen, deterministischen Automat*
+$(Q,\Sigma,\delta,q_0,F)$ ist
+
+- $Q$ eine endliche Menge der *Zustände*
+- $\Sigma$ das *Alphabet*
+- $\delta: Q\times\Sigma\to Q$ die Übergangsfunktion
+- $q_0\in Q$ der *Startzustand*
+- $F\subset Q$ die Menge der *akzeptierenden Zustände*
+:::
+
+::: bsp
+```{=tex}
+\begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state,accepting] (q_2) [right of=q_1] {$q_2$};
+ \node[state] (q_3) [right of=q_2] {$q_3$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_3)
+ edge [loop above] node {1} ( )
+ (q_3) edge [bend left] node {0,1} (q_2);
+\end{tikzpicture}\end{center}
+```
+$Q=\{q_1,q_2,q_3\}$, $\Sigma=\{0,1\}$, $q_1$ Startzustand, $F=\{q_2\}$.
+
+$\delta$ kann dargestellt werden durch
+
+ / 0 1
+ ------- ------- -------
+ $q_1$ $q_1$ $q_2$
+ $q_2$ $q_3$ $q_2$
+ $q_3$ $q_2$ $q_2$
+
+Die Zustandsfolge ist mit $w=001$
+$$q_1\xrightarrow{0}q_1\xrightarrow{0}q_1\xrightarrow{1}q_2.$$
+:::
+
+::: defi
+- partielle Übergangsfunktion: nicht alle Übergänge sind definiert
+- totale Übergangsfunktion: alle Übergänge sind definiert
+:::
+
+::: defi
+Eine Folge $s_0,...,s_n\in Q$ von Zuständen heißt *Berechnung* des
+Automaten $M=(Q,\Sigma,\delta,q_0,F)$ auf dem Wort $w=w_1...w_n$, falls
+
+- $s_0=q_0$,q
+- $\forall i=0,...,n-1: s_{i+1}=\delta(s_i,w_{i+1})$
+
+Es ist also eine "gültige" Folge von Zuständen, die man durch Abarbeiten
+von $w$ erreicht.
+:::
+
+::: bsp
+```{=tex}
+\begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state,accepting] (q_2) [right of=q_1] {$q_2$};
+ \node[state] (q_3) [right of=q_2] {$q_3$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_3)
+ edge [loop above] node {1} ( )
+ (q_3) edge [bend left] node {0,1} (q_2);
+\end{tikzpicture}\end{center}
+```
+- $w=001$ ergibt die Zustandsfolge $q_1q_1q_1q_2$
+:::
+
+::: defi
+Eine Berechnung *akzeptiert* das Wort $w$, falls die Berechnung in einem
+akzeptierten Zustand endet.
+
+Die von einem endlichen Automaten $M$ *akzeptierte* (erkannte) Sprache
+$L(M)$ ist die Menge der Wörter, die von $M$ akzeptiert werden:
+$$L(M)\defeq\{w\in\Sigma^*\mid M\text{ akzeptiert } w\}$$
+:::
+
+::: bem
+Eine Berechnung kann mehrmals in akzeptierenden Zuständen
+eintreten/austreten. Wichtig ist der Endzustand, nachdem der letzte
+Buchstabe des Eingabewortes verarbeitet wurde.
+:::
+
+::: bsp
+```{=tex}
+\begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state,accepting] (q_2) [right of=q_1] {$q_2$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_1)
+ edge [loop above] node {1} ( );
+\end{tikzpicture}\end{center}
+```
+- $w=1101\rightarrow q_1q_2q_2q_1q_2\rightarrow w$ wird akzeptiert
+- $w=010\rightarrow q_1q_1q_2q_1\rightarrow w$ wird **nicht**
+ akzeptiert
+
+Es folgt:
+$$L(M)=\{w\in\Sigma^*\mid w=\varepsilon\text{ oder }w\text{ endet mit }0\}$$
+:::
+
+::: defi
+Sei $\delta:Q\times\Sigma\to Q$ eine Übergangsfunktion. Die *erweiterte
+Übergangsfunktion* $\delta^*$: $Q\times\Sigma^*\to Q$ sei induktiv
+definiert:
+
+- $\delta^*(q,\varepsilon)=q$ für alle $q\in Q$
+- Für $w\in\Sigma^*$, $a\in\Sigma$ ist:
+ $$\delta^*(q,wa)=\delta(\underbrace{\delta^*(q,w)}_{\mathclap{\text{Zustand nach Lesen von $w$}}}, \overbrace{a}^{\mathclap{\text{Lesen von Buchstabe $a$}}}).$$
+:::
+
+## Reguläre Sprachen und Abschlusseigenschaften
+
+::: defi
+Eine Sprache $L\subset\Sigma^*$ heißt *reguläre Sprache*, wenn es einen
+endlichen Automaten $M$ gibt, der diese Sprache akzeptiert.
+
+Die Menge aller regulären Sprachen ist *REG*.
+:::
+
+::: satz
+Sei $L$ eine reguläre Sprache über $\Sigma$. Dann ist auch
+$\bar{L}\defeq\Sigma^*\setminus L$ eine reguläre Sprache.
+
+::: proof
+- $L$ regulär $\implies$ es gibt Automaten
+ $M=(Q,\Sigma,\delta,q_0,F)$, der $L$ akzeptiert
+- Definiere "Komplementautomat"
+ $\bar{M}=(Q,\Sigma,\delta,q_0,\bar{F})$ mit
+ $\bar{F}\defeq Q\setminus F$.
+- Dann gilt:
+ `\begin{align*} w\in\bar{L}&\iff M\text{ akzeptiert }w\text{ nicht}\\ &\iff \bar{M}\text{ akzeptiert }w. \end{align*}\qed`{=tex}
+:::
+:::
+
+::: satz
+Die Menge der regulären Sprachen ist abgeschlossen bezüglich der
+Vereinigung: $$L_1,L_2\in\text{REG}\implies L_1\cup L_2\in\text{REG}.$$
+
+::: proof
+Sei $M_1=(Q_1,\Sigma_1,\delta_1,s_1,F_1)$ ein Automat, der L_1 erkennt,
+$M_2=(Q_2,\Sigma_2,\delta_2,s_2,F_2)$ ein Automat, der L_2 erkennt.
+
+Wir definieren den Produktautomaten $M\defeq M_1\times M_2$:
+$M=(Q,\Sigma,\Delta,s,F)$ mit
+
+- $Q=Q_1\times Q_2$
+- $\Sigma=\Sigma_1\cup\Sigma_2$,
+- $\underbrace{s}_{\mathclap{\text{neuer Startzustand}}}=(s_1,s_2)$,
+ $F=\{(f_1,f_2)\mid f_1\in F_1\text{ oder } f_2\in F_2\}$,
+- $\underbrace{\Delta}_{\mathclap{\text{neue Übergangsfunktion}}}: Q\times\Sigma\to Q$,
+ $$\Delta((\underbrace{r_1}_{\in Q_1},\underbrace{r_2}_{\in Q_2}),\underbrace{a}_{\in\Sigma})=(\delta_1(r_1,a),\delta(r_2,a)).$$
+
+Übertragung der Definition auf erweiterte Übergangsfunktionen: Beweis
+durch Induktion (ausgelassen).
+
+Nach Definition von $F$ akzeptiert $M$ ein Wort $w$, wenn $M_1$ oder
+$M_2$ das entsprechende Wort akzeptieren. Der Satz folgt. `\qed`{=tex}
+:::
+:::
+
+::: bsp
+```{=tex}
+$M_1$: \begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state,accepting] (q_2) [right of=q_1] {$q_2$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_1)
+ edge [loop above] node {1} ( );
+\end{tikzpicture}\end{center}
+$M_2$: TODO \begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state] (q_2) [right of=q_1] {$q_2$};
+ \node[state,accepting] (q_2) [right of=q_2] {$q_2$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_1)
+ edge [loop above] node {1} ( )
+ (q_3) edge [bend left] node {0} (q_1)
+ edge [loop above] node {1} ( );
+\end{tikzpicture}\end{center}
+$M_1\times M_2$: TODO \begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state,accepting] (q_2) [right of=q_1] {$q_2$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_1)
+ edge [loop above] node {1} ( );
+\end{tikzpicture}\end{center}
+```
+:::
+
+::: satz
+Seien $L_1,L_2$ zwei reguläre Sprachen. Dann sind auch $L_1\cap L_2$ und
+$L_1\setminus L_2$ reguläre Sprachen.
+
+::: proof
+- $L_1\cap L_2$: Beweis funktioniert analog wie für $L_1\cup L_2$, nur
+ mit
+ $$F\defeq\{(q_1,q_2)\mid q_1\in F_1\text{\textbf{ und }}q_2\in F_2\}.$$
+- $L_1\setminus L_2=L_q\cap\bar{L_2}$
+
+`\qed`{=tex}
+:::
+:::
+
+## Nicht-deterministische Automaten
+
+::: bsp
+TODO (ggf. auch Sipser).
+
+```{=tex}
+\begin{center}\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \tikzstyle{every state}=[]
+
+ \node[state,initial] (q_1) {$q_1$};
+ \node[state,accepting] (q_2) [right of=q_1] {$q_2$};
+ \node[state] (q_3) [right of=q_2] {$q_3$};
+
+ \path[->]
+ (q_1) edge [loop above] node {0} ( )
+ edge [bend left] node {1} (q_2)
+ (q_2) edge [bend left] node {0} (q_1)
+ edge [loop above] node {1} ( );
+\end{tikzpicture}\end{center}
+```
+:::
+
+::: defi
+Ein *nicht-deterministischer Automat* besteht aus einem $5$-Tupel
+$(Q,\Sigma,\delta,q_0,F)$.
+
+- $Q$, $\Sigma$, $q_0$, $F$ wie beim deterministischen Automat,
+- $\delta: Q\times\Sigma\cup\{\varepsilon\}\to\overbrace{\pot(Q)}^{(*)}$
+ Übergangsfunktion
+
+$(*)$: Die Funktion definiert die **Menge** der möglichen Zustände, in
+die man von einem Zustand durch Lesen eines Buchstabens gelangen kann.
+:::
+
+::: defi
+Sei $M=(Q,\Sigma,\delta,q_0,F)$ ein nicht-deterministischer endlicher
+Automat, $w=w_1...w_n\in\Sigma^*$. Eine Folge von Zuständen
+$s_0,s_1,...,s_m\in Q$ heißt *Berechnng von $M$ auf $w$*, falls man $w$
+schreiben kann als $w=u_1u_2...u_m$ mit
+$u_i\in\Sigma\cup\{\underbrace{\varepsilon}_{\mathclap{\text{Übergänge $\varepsilon$, hier $u_i=\varepsilon$}}}\}$,
+sodass
+
+- $s_0=q_0$,
+- für alle $0\le i\le m-1:s_{i+1}\in\delta(s_1,u_{i+1}).$
+
+Die Berechnung heißt *akzeptierend*, falls $s_m\in F$.
+
+Der nicht-deterministische Automat $M$ *akzeptiert Wort $w$*, falls es
+eine akzeptierende Berechnung von $M$ auf $w$ gibt.
+:::
+
+::: bem
+$\varepsilon$-Transitionen: TODO.
+:::
+
+::: bsp
+Betrachte die regulären Sprachen
+
+- $A\defeq\{x\in\{0,1\}^*\mid\text{Anzahl }0\text{ gerade}\}$
+- $B\defeq\{x\in\{0,1\}^*\mid\text{Anzahl }0\text{ ungerade}\}$
+
+Zugehörige Automaten: TODO
+
+Nun betrachte *Konkatenation $AB$*. Um die Sprache zu erkennen, müsste
+der Automat bei einer Eingabe zunächst einen ersten Teil $A$ des Wortes
+betrachten und schauen, ob die Anzahl der $0$ gerade ist. **Irgendwann**
+müsste er beschließen, dass nun der zweite Teil $B$ des Wortes anfängt
+und er müsste schauen, ob dort die Anzahl der $0$ ungerade ist.
+
+$$\text{"Irgendwann"}\implies\text{nicht-deterministisch.}$$
+
+TODO: Graph.
+:::
+
+## Mächtigkeit
+
+::: bem
+Die Mächtigkeit eines Automaten wird hierbei beschrieben durch die
+Anzahl an Sprachen, die dieser erkennen kann.
+:::
+
+::: defi
+Zwei Automaten $M_1$, $M_2$ heißen *äquivalent*, wenn sie die gleiche
+Sprache erkennen: $$L(M_1)=L(M_2)$$
+:::
+
+::: satz
+Zu jedem nicht-deterministischen endlichen Automaten gibt es einen
+äquivalenten deterministischen endlichen Automaten.
+
+::: proof
+Lang aber trivial. Basically konstruiert man einfach eine
+deterministische Übergangsfunktion auf den nicht-deterministischen
+Verzweigungen.
+:::
+:::
+
+::: satz
+Es folgt:
+
+Eine Sprache $L$ ist regulär $\iff$ es gibt einen
+nicht-deterministischen Automaten, der $L$ akzeptiert.
+:::
+
+::: satz
+Die Klasse der regulären Sprachen ist abgeschlossen unter Konkatenation:
+$$L_1,L_2\in\mathrm{REG}\implies L_1L_2\in\mathrm{REG}$$
+:::
+
+::: satz
+Die Klasse REG ist abgeschlossen unter Bildung der Kleene'schen Hülle,
+d.h.: $$L\in\mathrm{REG}\implies L^*\in\mathrm{REG}$$
+:::
+
+## Reguläre Ausdrücke
+
+::: defi
+Sei $\Sigma$ ein Alphabet. Dann:
+
+- $\underbrace{\emptyset}_{\mathclap{\text{leere Sprache}}}$ und
+ $\overbrace{\varepsilon}^{\mathclap{\text{leeres Wort}}}$ sind
+ reguläre Ausdrücke.
+- Alle Buchstaben aus $\Sigma$ sind reguläre Ausdrücke.
+- Falls $R_1$, $R_2$ reguläre Ausdrücke sind, dann sind auch die
+ folgenden Ausdrücke regulär:
+ - $R_1\cup R_2$,
+ - $R_1\circ R_2$,
+ - $R_1^*$.
+:::
+
+::: defi
+Sei $R$ ein regulärer Ausdruck. Dann ist die *von $R$ induzierte Sprache
+$L(R)$* wie folgt definiert:
+
+- $R=\emptyset\implies L(R)=\emptyset$
+- $R=\epsilon\implies L(R)=\{\varepsilon\}$
+- $R=\sigma\text{ für ein }\sigma\in\Sigma\implies L(R)=\{\sigma\}$
+- $R=R_1\cup R_2\implies L(R)=L(R_1)\cup L(R_2)$
+- $R=R_1\circ R_2\implies L(R)=L(R_1)\circ L(R_2)$
+- $R=R_1^*\implies L(R)=(L(R_1))^*$
+:::
+
+::: satz
+Eine Sprache ist genau dann regulär, wenn sie durch einen regulären
+Ausdruck beschrieben wird.
+
+::: proof
+Strukturelle Induktion. Tja.
+:::
+:::
diff --git a/notes/theo2/main.pdf b/notes/theo2/main.pdf
new file mode 100644
index 0000000..398474f
--- /dev/null
+++ b/notes/theo2/main.pdf
Binary files differ
diff --git a/notes/theo2/makefile b/notes/theo2/makefile
new file mode 100644
index 0000000..58570c7
--- /dev/null
+++ b/notes/theo2/makefile
@@ -0,0 +1,23 @@
+VIEW = zathura
+
+all:
+ @mkdir -p build/
+ @pandoc main.md --filter pandoc-latex-environment --toc -N -V fontsize=11pt -V geometry:a4paper -V geometry:margin=2.5cm -o $(CURDIR)/build/main.tex --pdf-engine-opt=-shell-escape -H header.tex -B title.tex >/dev/null
+ @(pdflatex -shell-escape -halt-on-error -output-directory $(CURDIR)/build/ $(CURDIR)/build/main.tex | grep '^!.*' -A200 --color=always ||true) &
+ @progress 3 pdflatex
+ @cp build/main.pdf . &>/dev/null
+ @echo done.
+
+part:
+ @mkdir -p build/
+ @pandoc part.md --filter pandoc-latex-environment -N -V fontsize=11pt -V geometry:a4paper -V geometry:margin=2.5cm -o $(CURDIR)/build/main.tex --pdf-engine-opt=-shell-escape -H header.tex >/dev/null
+ @(pdflatex -shell-escape -halt-on-error -output-directory $(CURDIR)/build/ $(CURDIR)/build/main.tex | grep '^!.*' -A200 --color=always ||true) &
+ @progress 1 pdflatex
+ @echo done.
+
+clean:
+ @$(RM) -rf build
+
+run: all
+ @clear
+ @$(VIEW) build/main.pdf
diff --git a/notes/theo2/title.tex b/notes/theo2/title.tex
new file mode 100644
index 0000000..3adc197
--- /dev/null
+++ b/notes/theo2/title.tex
@@ -0,0 +1,21 @@
+\begin{titlepage}
+ \begin{center}
+ \vspace*{1cm}
+
+ {\huge\textbf{Theoretische Informatik 2\bigskip\\Berechenbarkeit und Komplexität}}
+
+ \vspace{0.5cm}
+ {\Large Inoffizielles Skript}\\
+ \textbf{Marvin Borner}
+
+ \vfill
+ {\Large \textbf{WARNUNG WIP: Fehler zu erwarten!}\\\textbf{Stand: \today, \currenttime}}\\
+ {\large Bitte meldet euch bei mir, falls ihr Fehler findet.}
+ % \includegraphics[width=0.4\textwidth]{zeller_logo}\\
+ \vfill
+
+ Vorlesung gehalten von\\
+ \textbf{Ulrike von Luxburg}\\
+ Sommersemester 2023
+ \end{center}
+\end{titlepage}