module DFA open System type State = { name: String } type DFA = { sigma: Char list states: State list delta: State -> Char -> State beginState: State acceptingStates: State list } let processChar (dfa: DFA) (state: State) (char: Char) = dfa.delta state char let rec processCharArray (dfa: DFA) (state: State) (charArr: Char list) = match charArr with | [] -> state | _ -> processCharArray dfa (processChar dfa state charArr.Head) charArr.Tail let acceptsWord (dfa: DFA) (word: String) = dfa.acceptingStates |> List.contains (processCharArray dfa dfa.beginState (Seq.toList word))