-- Typdefinitionen für den NFA: ------------------------------- module NFA where type Sigma = [Char] -- = String, hier aber nicht gemeint... type DeltaNFA state = state -> Maybe Char -> [state] type NFA state = ([state], -- Liste der Zustaende Sigma, -- Alphabet (DeltaNFA state), -- Transitionsfunktion state, -- Anfangszustand [state]) -- Menge der Endzustaende -- -- Show: NFA, DFA -- -------------------------------------------------------------------------------- showNFA :: NFA Int -> IO() showNFA (qs,cs,delta,q0,finals) = putStr ("States: " ++ show qs ++ '\n':"Alphabet: " ++ show cs ++ '\n':"Transition table:" ++ (showDelta qs cs delta) ++ '\n':"Start state :" ++ show q0 ++ '\n':"Final states:" ++ show finals) showDelta :: [Int] -> Sigma -> DeltaNFA Int -> String showDelta [] cs delta = ['\n'] showDelta (q:qs) cs delta = concat (map (showLine q delta) cs) ++ '\n': show q ++ " - eps -> " ++ show (delta q Nothing) ++ (showDelta qs cs delta) where showLine :: Int -> DeltaNFA Int -> Char -> String showLine q delta c = '\n': show q ++ " - " ++ [c] ++ " -> " ++ show (delta q (Just c)) {- showDFA :: DFA [Int] -> IO() showDFA (qs,cs,delta,q0,finals) = putStr ("States: " ++ show qs ++ '\n':"Alphabet: " ++ show cs ++ '\n':"Transition table:" ++ (showDeltaDFA qs cs delta) ++ '\n':"Start state :" ++ show q0 ++ '\n':"Final states:" ++ show finals) showDeltaDFA :: [[Int]] -> Sigma -> DeltaDFA [Int] -> String showDeltaDFA [] cs delta = ['\n'] showDeltaDFA (q:qs) cs delta = concat (map (showLine q delta) cs) ++ (showDeltaDFA qs cs delta) where showLine :: [Int] -> DeltaDFA [Int] -> Sigma -> String showLine q delta c = '\n': show q ++ " - " ++ [c] ++ " -> " ++ show (delta q [c]) showD :: DFA Int -> IO() showD (qs,cs,delta,q0,finals) = putStr ("States: " ++ show qs ++ '\n':"Alphabet: " ++ show cs ++ '\n':"Transition table:" ++ (showDeltaD qs cs delta) ++ '\n':"Start state :" ++ show q0 ++ '\n':"Final states:" ++ show finals) showDeltaD :: [Int] -> Sigma -> DeltaDFA Int -> String showDeltaD [] cs delta = ['\n'] showDeltaD (q:qs) cs delta = concat (map (showLine q delta) cs) ++ (showDeltaD qs cs delta) where showLine :: Int -> DeltaDFA Int -> Sigma -> String showLine q delta c = '\n' : show q ++ " - " ++ [c] ++ " -> " ++ show (delta q [c]) -}