$Id: fa.html,v 1.1.1.1 2002/05/24 10:46:47 challenger Exp $
data NFA s = NFA { states :: Set s -- Zustandsmenge , starts :: Set s -- Startzustände (!) , finals :: Set s -- akzeptierende Zustände , trans :: FiniteMap (s, Char) (Set s) -- Übergangsfunktion }(Dabei ist der Typ s der Zustände (fast) frei wählbar.) Beachten Sie, daß eine Menge von Startzuständen angegeben werden muß.
Sie können einen NFA mit Zustandsmenge Int (= kleine ganze Zahlen) zum Beispiel so bezeichnen:
import NFA import Set import FiniteMap student :: NFA Int student = NFA { states = mkSet [1, 2, 3], starts = mkSet [2], finals = mkSet [2], trans = listToFM [((1, 'a'), mkSet [2]), ((2, 'a'), mkSet [1]), ((2, 'b'), mkSet [3]), ((3, 'b'), mkSet [2])]}Die hierbei benutzten Funktionen mkSet und listToFM haben diese Typen:
mkSet :: [a] -> Set a listToFM :: [(a,b)] -> FiniteMap a bAlternativ können Sie die Elemente (Tripel) der Übergangsrelation direkt angeben
student :: NFA Int student = NFA { states = mkSet [1, 2, 3], starts = mkSet [2], finals = mkSet [2], trans = collect [ (1,'a',2), (2,'a',1), (2,'b',3), (3,'b',2) ] }mit Hilfe der vordefinierten Funktion
collect :: [ (a, Char, a) ] -> FiniteMap (a, Char) (Set a)Natürlich können Sie auch Haskell-Konstruktionen benutzen, um längere Listen von Tripeln zu erzeugen. Der folgende Automat akzeptiert a^5^*
ring :: Int -> NFA Int ring n = NFA { states = mkSet [ 1 .. n ], starts = mkSet [ 1 ], finals = mkSet [ 1 ], trans = collect ( (n, 'a', 1) : [ (k, 'a', k+1) | k <- [1 .. n-1] ] ) } student :: NFA Int student = ring 5