CB-I im WS99/00

Blatt 3 mit Lösungen

Aufgabe 1

  1. Entwerfen Sie einen einen Automaten, der arithmetische Ausdrücke in polnischer Postfix-Notation akzeptiert.
  2. Beschreiben Sie informell, welche zusätzlichen Aktionen bei den Zustandsübergängen unternommen werden müssten, damit die Ausdrücke auch berechnet würden.
  3. Setzen Sie das ganze in einen Algorithmus um, programmieren Sie es ggf.

Lösung

Ein einfacher endlicher Automat kann natürlich kein PP-Kalkulator sein, schon deshalb, weil er sich keine Zwischensummen merken kann. Man kann aber das Verhalten solch eines Rechners gut mit einem Automaten modellieren, an dessen Kanten noch Annotierungen über interne Abläufe angebracht sind, und dies Modell dann sehr einfach programmieren.
Wir betrachten hier als Eingabealphabet Ziffer, Leerzeichen, und als einzigen Operator (beispielhaft) das '+', und gehen davon aus, das die Stackverwaltenden Funktionen push und pop in den üblichen Bedeutungen zur Verfügung stehen:
Der entsprechende Programmcode ist dann eine switch bzw. case-Anweisung, die dei Zustandsnummer als Entscheidungstag verwendet. In den Einzelfällen stehen dann die annotierten Aktionen. Als Beispiel in C-ähnlicher Syntax das Programmfragment, das den Automaten realisiert:
  state = 1;
  switch (state) { 
  case 0:   /* q0 /
    c = getchar();
    if (c == '+') {
      res = pop() + pop();
      push(res);
    }
    if (isnumber(c)) {
      wert = tonumber(c);
      state = 1;
    }
    break;
  case 1:   /* q1 */
    c = getchar();
    if (c == '+') {
      res = wert + pop();
      push(res);
      state = 0:
    }
    if (isnumber(c)) {
      wert = wert*10 + tonumber(c);
    }
    if (c == ' ') {
      push(wert);
      state = 0;
    }
    break;
  };      

      

Aufgabe 2

In der Vorlesung wird ein Algorithmus vorgestellt, der die Zustandszahl eines endlichen Automaten minimiert.
  1. Verfeinern die den Algorithmus soweit, dass Sie ihn programmieren können. Welche Datenstrukturen kommen in Frage?
  2. Kennen Sie einen anderen Algorithmus mit dem gleichen Ziel?

Lösung:

  1. - keine Musterlösung vorgesehen -
  2. In Sander/Stucky/Herschel Automaten Sprachen Berechenbarkeit, Seite 63f wird ein Markierungsalgorithmus vorgeschlagen. Er beruht auf der Definition der k-Aequivalenz:
    1. q~0q' :<=> q und q' sind beide Endzustände, oder beide keine Endzustände
    2. q~kq' :<=> Für alle w aus T* mit |w|<=k gilt d(q,w)~0d(q',w)
    Man kann dann folgende Folgerung beweisen:
    ¬(q~0q') oder es existiert ein a aus T mit ¬(d(q,a)~kd(q',a)) => ¬(q~k+1q')
    Diese Folgerung wird dazu benutzt, algorithmisch iterativ die nicht aequivalenten Zustandspaare zu markieren. Die am Ende unmarkierten Paare sind aequivalent, und können zu einem Zustand vereinigt werden. Der reduzierte Automat ist dann noch kanonisch anzupassen.

Dietmar Lammers
Last modified: Wed Nov 17 15:58:10 MET 1999