Endliche Automaten im autotool

$Id: fa.html,v 1.1.1.1 2002/05/24 10:46:47 challenger Exp $

Benutzung

Der Datentyp NFA (nichtdeterministischer endlicher Automat) ist so definiert:
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 b
Alternativ 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

best viewed with any browser


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