メモ

すごいHaskell 本を読んだりしながら、オートマトンを書き換えている。

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.9852 "A Taxonomy of Finite Algorithms (1993) by Bruce Watson を参考に、オートマトンは5つ組ではなく、ε-遷移を通常の遷移と分けた6つ組とした。骨格は以下の通り。

type Symbol = Char
-- Fintite Automaton type
type States a = Set a
type Alphabet = Set Symbol
type Transition a = Set (Labelled a)
type ETransition a = Set (Epsilon a)

-- Labelled fromState Symbol toState
data Labelled a = Labelled a Symbol a deriving (Eq, Ord)
-- Epsilon fromState toState
data Epsilon a = Epsilon a a deriving (Eq, Ord)

data FA a = FA
    (States a) -- A finite set of states. Q
    Alphabet -- A finite set of symbol (alphabet). V
    (Transition a) -- A set of transition. T
    (ETransition a) -- A set of epsilon-transition. E
    (States a) -- A set of start state. S 
    (States a) -- A set of accept states. F

isDet :: (Ord a) => FA a -> Bool
isDet m@(FA qset cset tset eset q0set fset) = 
    S.size q0set <= 1 && -- does not have multiple start states
    isEfree m &&
    -- map to single states
    all (<= 1) [ S.size (transit tset q c) | q <- elems qset, c <- elems cset ]

transit1 :: (Ord a) => Transition a -> a -> Symbol -> a
transit1 t q c = elem1 (transit t q c)

isString :: Ord a => FA a -> [Symbol] -> Bool
isString (FA _ cset _ _ _ _) = all (`S.member` cset)

accept :: (Ord a) => FA a -> [Symbol] -> Bool
accept m@(FA qset cset tset eset q0set fset) str
    | isDet m && isString m str = S.member (foldl (transit1 tset) (elem1 q0set) str) fset

accept m str = error "Not implmented NFA accept or invalid string."