David Schirrmeister 21f691f6a3 update
2025-06-15 17:42:22 +02:00

11 KiB
Raw Blame History

Übungsblatt 8

Wenzel Schwan (1125033), Paul Kneidl (1125219), David Schirrmeister (1125746), Michelle Klein (1126422)

Übung 1

1(a)

Beschreiben Sie für jeden der folgenden regulären Ausdrücke \alpha_i die entsprechende Sprache L(\alpha_i) (formal oder informal, Ihre Wahl):

  • (i) \alpha_1 = (00 \mid 1)^* (11 \mid 0)
    • Alle Wörter, welche mit beliebig vielen Aneinanderreihungen von 00 und 1 beginnen und dann mit 11 oder 0 enden
  • (ii) \alpha_2 = (1 \mid 01 \mid 001)^* (1 \mid 111)
    • Alle Wörter, welche mit beliebig vielen Aneinanderreihungen von 1, 01 und 001 beginnen und dann mit 1 oder 111 enden

1(b)

Bestimmen Sie für jeden der folgenden regulären Ausdrücke \beta_i einen endlichen Automaten (deterministisch oder nichtdeterministisch, Ihre Wahl), der die Sprache L(\beta_i) akzeptiert:

  • (i) \beta_1 = \emptyset
    • @startuml
      scale 0.50
      
      left to right direction
      skinparam dpi 150
      
      skinparam state {
      BackgroundColor #FFFACD
      BorderColor black
      FontName Helvetica
      RoundCorner 30
      Shadowing false
      LineThickness 0
      }
      
      state S##[bold]
      [*]-->S
      @enduml
      
  • (ii) \beta_2 = ((0 \mid 1)^* 1)^*
    • @startuml
      scale 0.50
      
      left to right direction
      skinparam dpi 150
      
      skinparam state {
      BackgroundColor #FFFACD
      BorderColor black
      FontName Helvetica
      RoundCorner 30
      Shadowing false
      LineThickness 0
      }
      
      state S##[bold]
      state U##[bold]
      
      [*]-->S
      S --> T: 0,1
      T --> U: 1
      T --> T: 0,1
      S --> U: 1
      U --> T: 0,1
      
      @enduml
      

1(c)

Betrachten Sie die endlichen Automaten N_1 und N_2 aus Abbildung 1. Bestimmen Sie für jede der drei Sprachen L(N_1), L(N_2) und L(N_1) \setminus L(N_2) einen regulären Ausdruck, der die jeweilige Sprache beschreibt.
image_923.png

  • L(N_1)
    • 1(0|1)^*1
  • L(N_2)
    • (0|1)^*11(0|1)^*
  • L(N_1) \backslash L(N_2)
    • 10(0|10)^*1

1(d)

Bestimmen Sie einen regulären Ausdruck, der die Sprache aller Binärstrings beschreibt, die nicht auf 11 enden.

(0|1)^*(00|01|10)

Übung 2

Betrachten Sie folgende reguläre Grammatik über dem Alphabet \Sigma = \{x, y, z\}:


G: \quad
S \Rightarrow xS \mid xA \mid zB \\
A \Rightarrow yA \mid B \\
B \Rightarrow zB \mid \varepsilon

2(a)

Erarbeiten Sie sich den Begriff eines nichtdeterministischen endlichen Automaten mit $\varepsilon$-Übergängen mit Hilfe des Skriptes (Seiten 137139).
Überlegen Sie sich, wie sich ein zur Grammatik G passender, nichtdeterministischer endlicher Automat mit $\varepsilon$-Übergängen konstruieren lässt, der die Sprache L(G) akzeptiert.
Geben Sie den Automaten dazu in Graphdarstellung an.

  @startuml
  scale 0.50

  left to right direction
  skinparam dpi 150
  
  skinparam state {
  BackgroundColor #FFFACD
  BorderColor black
  FontName Helvetica
  RoundCorner 30
  Shadowing false
  LineThickness 0
  }
  
  state B##[bold]
  
  [*]-->S
  S --> S: x
  S --> A: x
  S --> B: z
  A --> A: y
  A --> B: ε
  B --> B: z
  
  @enduml

2(b)

Nutzen Sie das Kochrezept aus den Folien (Kapitel 6), um die Grammatik zu normalisieren.
(Schritte 1 und 2 des Kochrezepts sind hier nicht notwendig, da es keine Regeln der entsprechenden Form gibt.)

  • S → xS | xA | zB
  • A → yA | zB | ε
  • B → zB | ε

2(c)

Nutzen Sie den zweiten Teil des Kochrezepts zur Umwandlung einer regulären Grammatik G in einen NEA (Kapitel 6), um für die normalisierte Grammatik einen NEA zu konstruieren, der die von der Grammatik erzeugte Sprache akzeptiert.

  @startuml
  scale 0.50

  left to right direction
  skinparam dpi 150
  
  skinparam state {
  BackgroundColor #FFFACD
  BorderColor black
  FontName Helvetica
  RoundCorner 30
  Shadowing false
  LineThickness 0
  }
  
  state B##[bold]
  state A##[bold]
  
  [*]-->S
  S --> S: x
  S --> A: x
  S --> B: z
  A --> A: y
  A --> B: z
  B --> B: z
  
  @enduml

Übung 3

3(a)

Entwerfen Sie eine reguläre Grammatik G_{\text{date}}, um Datumsangaben bestehend aus Tag (T), Monat (M) und Jahr (Y) in der Form YYYY-MM-TT über einem geeigneten Alphabet zu erzeugen.

  • Σ = {0,...,9,-}
  • S = S
  • V=\{S,Y,M,D,Y_1,Y_2,Y_3,A,B,M_1,M_2,C\}
  • R
    • S→YMD
    • Y → AY_1
    • Y_1 → AY_2
    • Y_2 → AY_3
    • Y_3 → AB
    • A→0|1|2|3|4|5|6|7|8|9
    • B→-
    • M→0M_1|1M_2
    • M_1→1B|2B|3B|4B|5B|6B|7B|8B|9B
    • M_2→0B|1B
    • D→0A|1A|2A|3C
    • C→0|1

3(b)

Entwerfen Sie eine reguläre Grammatik G_{\text{time}}, um Uhrzeiten bestehend aus Stunde (H) und Minute (M) in der Form HH:MM über einem geeigneten Alphabet zu erzeugen.

  • Σ = {0,...,9,:}
  • S = S
  • $V={S,H,M,A,H_1}$
  • R
    • S→HM
    • H→0H_1|1H_1|2H_1|3H_1|4H_1|5H_1
    • H_1→A:
    • A→0|1|2|3|4|5|6|7|8|9
    • M→0A|1A|2A|3A|4A|5A

3(c)

Kombinieren Sie die Grammatiken G_{\text{date}} und G_{\text{time}} zu drei neuen Grammatiken, welche jeweils die Sprache
L(G_{\text{date}}) \cup L(G_{\text{time}}),
L(G_{\text{date}}) \circ L(G_{\text{time}}) und
L(G_{\text{date}})^* erzeugen.

(i) $L(G_{\text{date}}) \cup L(G_{\text{time}})$

Um die Vereinigungsgrammatik zu erzeugen, fügt man eine neue Startregel hinzu, die entweder in das Datum oder in die Uhrzeit verzweigt. Es wird also eine neue Startvariable S' eingeführt und die bisherigen Startsymbole S_{\text{date}} und S_{\text{time}} ersetzt:

  • Neue Startregel:
    • S' \rightarrow S_{\text{date}} \mid S_{\text{time}}
  • Dabei ist S_{\text{date}} die bisherige Startvariable der Datumsgrammatik, S_{\text{time}} die der Uhrzeitgrammatik.
  • Alle Regeln aus beiden Grammatiken werden übernommen und S wird jeweils durch S_{\text{date}} bzw. S_{\text{time}} ersetzt, um Namenskonflikte zu vermeiden.

(ii) $L(G_{\text{date}}) \circ L(G_{\text{time}})$

Für die Konkatenation fügt man eine neue Startregel ein, die zuerst die Erzeugung eines Datums, danach die einer Uhrzeit erlaubt. Auch hier müssen die Startvariablen unterschieden werden:

  • Neue Startregel:
    • S' \rightarrow S_{\text{date}} S_{\text{time}}
  • Wieder werden alle bisherigen Regeln beibehalten, aber die Startvariablen entsprechend umbenannt.
  • Die Sprache besteht dann aus Zeichenketten der Form YYYY-MM-DDHH:MM.

(iii) $L(G_{\text{date}})^*$

Um beliebig viele Datumsangaben zu erzeugen, wird ein neuer Startzustand S' eingeführt, der entweder ein Datum erzeugt, gefolgt von einer rekursiven Wiederholung, oder auf \varepsilon endet:

  • Neue Startregeln:
    • S' \rightarrow S_{\text{date}} S' \mid \varepsilon
  • Die übrige Grammatik bleibt unverändert.
  • Es können also beliebig viele aufeinanderfolgende Datumsangaben erzeugt werden, z.B. 2025-06-152025-07-01...

Bei allen drei Fällen ist es notwendig, Namenskonflikte zwischen den Nichtterminalen der beiden Grammatiken (Datum vs. Uhrzeit) zu vermeiden. Das kann man entweder durch Präfixe (z.B. A_{\text{date}}, A_{\text{time}}) oder durch getrennte Mengen von Nichtterminalen und Startsymbolen lösen.

Übung 4

Betrachten Sie den nichtdeterministischen endlichen Automaten N. Bestimmen Sie systematisch einen regulären Ausdruck, der die Sprache L(N) beschreibt, indem Sie wie folgt vorgehen:
image_924.png

4(a)

Wandeln Sie N in einen äquivalenten nichtdeterministischen Automaten N_\varepsilon mit $\varepsilon$-Übergängen um, der genau einen akzeptierenden Zustand hat.

    @startuml
    scale 0.50

    left to right direction
    skinparam dpi 150
    
    skinparam state {
    BackgroundColor #FFFACD
    BorderColor black
    FontName Helvetica
    RoundCorner 30
    Shadowing false
    LineThickness 0
    }
    
    state Z##[bold]
    
    [*]-->A
    A --> A: a
    A --> B: a
    A --> D: a
    D --> E: a
    E --> Z: ε
    B --> C: a
    C --> F: a
    F --> F: b
    F --> Z: ε
    F --> G: c
    A --> G: c
    G --> G: c
    G --> Z: ε
    
    @enduml

4(b)

Als nächstes erlauben wir anstatt einfachen Symbolen an den Kanten auch reguläre Ausdrücke.
Ein regulärer Ausdruck \alpha an einer Kante von Zustand q \in Q nach q' \in Q (wir schreiben q \xrightarrow{\alpha} q') bedeutet dabei, dass der Automat durch Lesen eines Wortes der Sprache L(\alpha) von Zustand q in Zustand q' wechseln kann.

Mit diesem neuen Mittel ausgerüstet, können wir z.B. den Zustand B aus dem Automaten N_\varepsilon entfernen, indem wir die Kanten A \xrightarrow{a} B und B \xrightarrow{a} C entfernen und stattdessen die neue Kante A \xrightarrow{aa} C einfügen.

Entfernen Sie auf diese Weise nacheinander die Zustände B, C, D und E aus N_\varepsilon und zeichnen Sie den entstehenden Automaten.

    @startuml
    scale 0.50

    left to right direction
    skinparam dpi 150
    
    skinparam state {
    BackgroundColor #FFFACD
    BorderColor black
    FontName Helvetica
    RoundCorner 30
    Shadowing false
    LineThickness 0
    }
    
    state Z##[bold]
    
    [*]-->A
    A --> A: a
    A --> F: aaa
    A --> Z: aa
    F --> F: b
    F --> Z: ε
    F --> G: c
    A --> G: c
    G --> G: c
    G --> Z: ε
    
    @enduml

4(c)

Als nächstes entfernen wir den Zustand F.
Betrachten Sie dazu jedes Paar q, q' \in Q \setminus \{F\} mit Kanten q \xrightarrow{\alpha} F und F \xrightarrow{\beta} q'.
Fügen Sie als Ersatz für diese Kanten eine Kante q \xrightarrow{\gamma} q' für einen geeignet gewählten regulären Ausdruck \gamma ein (beachten Sie die Schleife F \xrightarrow{b} F in F!).
Nach Bearbeitung aller solcher Paare kann der Zustand F gelöscht werden (warum?).

Entfernen Sie auf diese Weise neben Zustand F auch den Zustand G und zeichnen Sie den entstehenden Automaten.

    @startuml
    scale 0.50

    left to right direction
    skinparam dpi 150
    
    skinparam state {
    BackgroundColor #FFFACD
    BorderColor black
    FontName Helvetica
    RoundCorner 30
    Shadowing false
    LineThickness 0
    }
    
    state Z##[bold]
    
    [*]-->A
    A --> A: a
    A --> Z: aa | aaa  | aaa(b)* | aaa(c)+ | (c)+
    
    @enduml

4(d)

Sie sollten nun einen Automaten mit noch zwei Zuständen (Startzustand und Endzustand) haben.
Leiten Sie von diesem Automaten den regulären Ausdruck für die Sprache L(N) ab.
(Beachten Sie die Schleife in Zustand A!)

(a)^*(aa|aaa|aaa(b)^*|aaa(c^+)|(c)^+)

4(e)

Der erhaltene reguläre Ausdruck ist vermutlich recht lang.
Versuchen Sie ihn (durch „scharfes Hinsehen“) soweit wie möglich zu vereinfachen.

a^*(aa|aaa(b^*|c^*)|c^+)

ODER

a^*(aa(a(b^*|c^*))^?|c^+)