\begin{code}


module Language.HaLex.Examples.Robot where

import Language.HaLex.Dfa
import Language.HaLex.FaAsDiGraph
import qualified Language.HaLex.DfaMonad as DfaMonad


\end{code}


\begin{code}


-- ex :: Dfa IO [Char] [Char]
ex = Dfa ["esquerda","direita","largar","pegar"]
         ["C0 sem pepita","C0 com pepita","C1 sem pepita","C1 com pepita"]
         "C0 sem pepita"
         ["C0 sem pepita"]
         delta
  where 
    delta "C0 sem pepita" "direita"  = "C1 sem pepita" 
    delta "C0 sem pepita" _          = "C0 sem pepita" 

    delta "C0 com pepita" "largar"   = "C0 sem pepita" 
    delta "C0 com pepita" "direita"  = "C1 com pepita" 
    delta "C0 com pepita" _          = "C0 com pepita" 

    delta "C1 sem pepita" "esquerda" = "C0 sem pepita" 
    delta "C1 sem pepita" "pegar"    = "C1 com pepita" 
    delta "C1 sem pepita" _          = "C1 sem pepita"

    delta "C1 com pepita" "esquerda" = "C0 com pepita" 
    delta "C1 com pepita" "largar"   = "C1 sem pepita" 
    delta "C1 com pepita" _          = "C1 com pepita"     

moves = ["direita","pegar","esquerda","largar"]
moves2 = ["esquerda","pegar","direita","pegar","esquerda","largar"]
moves3 = ["esquerda","pegar","direita"]
moves4 = moves2 ++ moves

g = dfa2graphviz2file ex "xxx"

\end{code}





\begin{code}

robotM :: DfaMonad.Dfa Maybe [Char] [Char]
robotM = DfaMonad.Dfa ["esquerda","direita","largar","pegar"]
             ["C0 sem pepita","C0 com pepita","C1 sem pepita","C1 com pepita"]
             "C0 sem pepita"
             ["C0 sem pepita"]
             delta
  where 
    delta "C0 sem pepita" "direita"  = return "C1 sem pepita" 
    delta "C0 sem pepita" _          = return "C0 sem pepita" 

    delta "C0 com pepita" "largar"   = return "C0 sem pepita" 
    delta "C0 com pepita" "direita"  = return "C1 com pepita" 
    delta "C0 com pepita" _          = return "C0 com pepita" 

    delta "C1 sem pepita" "esquerda" = return "C0 sem pepita" 
    delta "C1 sem pepita" "pegar"    = return "C1 com pepita" 
    delta "C1 sem pepita" _          = return "C1 sem pepita"

    delta "C1 com pepita" "esquerda" = return "C0 com pepita" 
    delta "C1 com pepita" "largar"   = return "C1 sem pepita" 
    delta "C1 com pepita" _          = return "C1 com pepita"     



acc = DfaMonad.dfaaccept robotM moves4

\end{code}






\begin{code}

robotM2 :: DfaMonad.Dfa IO [Char] [Char]
robotM2 = DfaMonad.Dfa ["esquerda","direita","largar","pegar"]
                       ["C0 sem pepita","C0 com pepita","C1 sem pepita","C1 com pepita"]
                       "C0 sem pepita"
                       ["C0 sem pepita"]
                       delta
  where 
    delta "C0 sem pepita" "direita"  = do putStrLn "Vou para C1 sem pepita"
                                          return "C1 sem pepita" 
    delta "C0 sem pepita" _          = return "C0 sem pepita" 

    delta "C0 com pepita" "largar"   = return "C0 sem pepita" 
    delta "C0 com pepita" "direita"  = return "C1 com pepita" 
    delta "C0 com pepita" _          = return "C0 com pepita" 

    delta "C1 sem pepita" "esquerda" = return "C0 sem pepita" 
    delta "C1 sem pepita" "pegar"    = return "C1 com pepita" 
    delta "C1 sem pepita" _          = return "C1 sem pepita"

    delta "C1 com pepita" "esquerda" = do putStrLn "Vou para C0 com pepita"
                                          return "C0 com pepita" 
    delta "C1 com pepita" "largar"   = return "C1 sem pepita" 
    delta "C1 com pepita" _          = return "C1 com pepita"     



acc2 = DfaMonad.dfaaccept robotM2 moves4


exShow = do d <- DfaMonad.showInDot robotM2 True
            writeFile "xxx" d

\end{code}