# Grundlagen formaler Sprachen
## Von einer Problembeschreibung zur Codierung

**Erinnerung k-Clique**
- Eingabe: Graph $V = (V, E)$ und $k ∈ Ν$
- Ausgabe: Gibt es eine Clique C der Größe k in G

> Wie erhält ein Algorithms diese Eingabe (Graph)
> 
> Wie teilt der Algorithmus die Ausgabe (Ja/Nein) mit?

### Beispiel: Codierung eines gerichteten Graphen
- Graph sei über Adjazenzlisten gegeben
- Wir Codieren den Graphen als Bitstring

**Mögliche Codierung eines Graphen**
![image_678.png](image_678.png)

- andere Codierungen oder auch anderes Alphabet denkbar
- geht auch für gerichtete Graphen (z.B. für k-Clique)


## Grundbegriffe
### Alphabete und Zeichenketten
> Alphabet Σ: endliche Menge von Zeichen
> 
> Zeichenkette s über Alphabet Σ: endliche Zeichenfolge aus Σ
 
- die leere Zeichenkette bezeichnen wir als ε
- $s_1 * s_2$ ist die **Konkatenation** (_Verkettung_) zweier Zeichenketten $s_1$ und $s_2$

- $Σ^*$: Menge aller (auch leerer) Zeichenketten über Σ
- $Σ^+$: Menge aller nicht-leerer Zeichenketten über Σ

#### Beispiel Alphabete und Zeichenketten
Sei $Σ=\{a,b,c\}$
- Alle Zeichenketten der Länge 2 über Σ:
  - {$aa$, $ab$, $ac$, $ba$, $bb$, $bc$, $ca$, $cb$, $cc$}
- $s_1 = ababc ∈ Σ^*$ und $s_2 = cbbb ∈ Σ^*$
- für $s = ababccbbb$ gilt $s = s_1 * s_2 ∈ Σ^*$


### Präfixe, Suffixe und Teilzeichenketten
> Sei s ∈ $Σ^*$ eine Zeichenkette über Σ.
> 
> 
> Suffix u von s: $∃s' in Σ^*$ so dass $s = s' * u$
> 
> Präfix u von s: $∃s'' ∈ E^*$ so dass $s = u * s''$
> 
> Teilzeichenkette u von s: $∃s',s'' ∈ E^*$ so dass $s = s' * u * s''$

- $|s|$: Länge der Zeichenkette s
- $\#_a(s)$: Häufigkeit des Zeichens $a ∈ Σ$ in Zeichenkette $s ∈ Σ^*$

#### Beispiel Präfixe, Suffixe und Teilzeichenketten
Sei $Σ = \{0,1\}$ und $s = 101011110$.
- Wieviele Präfixe hat s?
  - 8
- Wie viele Teilzeichenketten der Länge 3 hat s?
  - 3?
- **kompaktere Notation**: $s:s = 101011110 = (10)^21^40$

## Sprachen und das Wortproblem
> im Folgenden sei immer Σ das zugrunde liegende Alphabet

**Definition**:
> formale Sprache L über Σ: eine Teilmenge von $Σ^*$
> 
> Wort w aus L: ein Element $w ∈ L$

- L kann unendliche ($|l| = ∞$) oder endliche ($|L| = k ∈ Ν$) sein

**Beispiel**
- Σ = {0,1,...,9}
- Beschreibe die Worte aus $L=\{007*s | s ∈ Σ^*\}$.
  - $(007)^1\{0,1,...,9\}^*$ **?**
- Wie viele Wörter enthält $L=\{s ∈ \{0,1,2\}^* | |s| ≤ 5\}$?
  - $ \sum_{n=0}^{5} 5^n$ **?**

### Algorithmisches Problem für formale Sprachen
- L sei eine beliebige Sprache über Σ
- ![image_679.png](image_679.png)
- es handelt sich also um ein Entscheidungsproblem
- wir geben typischerweise $1$ aus, wenn $s ∈ L$ und sonst $0$