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.
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 ] ]
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* )