module DFA 
where

data DFA q s = DFA { states :: [q],
                     symbols :: [s],
                     delta :: q -> s -> q,
                     start :: q,
                     final :: [q]}

trans :: (q -> s -> q) -> q -> [s] -> q
trans d q [] = q
trans d q (s:ss) = trans d (d q s) ss

accept :: (Eq q) => DFA q s -> [s] -> Bool
accept m@(DFA {delta = d, start = q0, final = f}) w = elem (trans d q0 w) f

ma = DFA { states = [0,1,2],
           symbols = [0,1],
           delta = \p a -> (2*p+a) `mod` 3,
           start = 0,
           final = [2]
         }


