module DFAsimple where
  
type State = Int
type DFA = ([State], [Char], State->Char->State, State, [State])

extendDelta :: (State -> Char -> State) -> (State -> String -> State)
extendDelta delta = deltaStar
    where deltaStar q [] = q
          deltaStar q (a:w) = deltaStar (delta q a) w                        
-- equivalent definition: extendDelta = foldl
                              
evalDFA :: DFA -> String -> Bool
evalDFA (qs,alpha,delta,s,fs) w =
    let deltaStar = extendDelta delta
        q = deltaStar s w
    in elem q fs

-- Example DFA
evenDFA :: DFA
evenDFA = (states, alphabet, delta, s, fs)
    where states = [1,2]
          alphabet = ['a','b']
          s = 1
          fs = [1]
          delta 1 'a' = 2
          delta 1 'b' = 2                        
          delta 2 'a' = 1
          delta 2 'b' = 1

