Kellerautomaten in autotool


Benutzung

Der Automat aus dem Skript (von Prof. Gerber, http://www.informatik.uni-leipzig.de/~gerber/auto.ps), Seite 56 oben, sieht so aus:
import NPDA
import Set

-- der Automat soll { w w^R  |  w  in  {0, 1}* }
-- durch leeren Keller akzeptieren

student :: NPDA Char Char Integer
student = NPDA { eingabealphabet = mkSet "01"
	       , kelleralphabet  = mkSet "abc"
	       , zustandsmenge	 = mkSet [ 2, 3 ]
	       , tafel = t
	       , startzustand	 = 2
	       , startsymbol	 = 'a'
	       , akzeptiert	 = Leerer_Keller
	       }


-- die Tabelle direkt aus dem Skript abgeschrieben

t = listToFM [ -- Spalte 1 (Z 2, x = '0')
	       ( ( Just '0' , 2, 'a'), mkSet [ ( 2, "ba") ] )
	     , ( ( Just '0' , 2, 'b'), mkSet [ ( 2, "bb"), ( 3, "") ] )
	     , ( ( Just '0' , 2, 'c'), mkSet [ ( 2, "bc") ] )
	     
	     -- Spalte 2 (Z 2, x = '1')
	     , ( ( Just '1' , 2, 'a'), mkSet [ ( 2, "ca") ] )
	     , ( ( Just '1' , 2, 'b'), mkSet [ ( 2, "cb") ] )
	     , ( ( Just '1' , 2, 'c'), mkSet [ ( 2, "cc"), (3, "") ] )
	     
	     -- Spalte 3 (Z 2, x = epsilon)
	     , ( ( Nothing, 2, 'a'), mkSet [ ( 3, "") ] )

	     -- Spalten 4 bis 6 (Z 3)
	     , ( ( Just '0' , 3, 'b'), mkSet [ ( 3, "" ) ] )
	     , ( ( Just '1' , 3, 'c'), mkSet [ ( 3, "" ) ] )
	     , ( ( Nothing, 3, 'a'), mkSet [ ( 3, "" ) ] )
	     ]

Bitte verwenden Sie in Ihren Einsendungen stets den angegebenen Typ NPDA Char Char Integer.

Tricks

(Zum Lösen der Übungsaufgaben nicht notwendig.)

Mit List comprehensions läßt sich das Beispiel (Seite 56, siehe oben) kürzer schreiben:


-- durch List Comprehensions läßt sich das kompakter schreiben:

t' = plusFM_C union speichern prüfen

speichern = listToFM 
    [ ( ( Just x, 2, y ), mkSet [ ( 2, [h, y] ) ] )
    | (x, h) <- [ ('0', 'b'), ('1', 'c') ]
    , y <- "abc"
    ]

prüfen	  = listToFM 
    [ ( ( x, z, y ), mkSet [ ( 3, "" ) ] )
    | (x, y) <- [ ( Just '0', 'b'), ( Just '1', 'c'), ( Nothing, 'a') ]
    , z <- [ 2, 3 ]
    ]

Implementierung

Quelltexte: http://www.informatik.uni-leipzig.de/~autotool/pda/

Wir implementieren einen Kellerautomaten direkt, wie er im Buche steht:

data NPDA x y z = 
     NPDA { eingabealphabet  :: Set x 
	  , kelleralphabet   :: Set y 
	  , zustandsmenge    :: Set z 
	  , tafel	     :: FiniteMap (Maybe x, z, y) (Set (z, [y]))
	  , startzustand     :: z
	  , startsymbol	     :: y
	  , akzeptiert	     :: Modus z
	  }

data Modus z = Leerer_Keller | Zustand (Set z) 
     deriving (Show, Read)
Dabei ist [y] der Typ der Listen mit Elementen aus y, Set a ist der Typ der Mengen mit Elementen aus y, und FiniteMap a b sind endliche Abbildungen (stellen Sie sich Hashtabellen oder Suchbäume vor) mit Schlüsseln aus a und Werten aus b. Ein Element vom Typ Maybe x enthält entweder ein Just x oder Nothing.

Die Automatentabelle ist also tatsächlich eine Abbildung

(X + epsilon) x Z x Y  -> Pow ( Z x Y* )

best viewed with any browser


http://www.informatik.uni-leipzig.de/~joe/ mailto:joe@informatik.uni-leipzig.de