module Language.UTM.Syntax where
import Data.Map (Map)
import Data.String
data TuringMachine = TuringMachine
{ startState :: State
, acceptState :: State
, rejectState :: State
, blankSymbol :: Symbol
, inputAlphabet :: [Symbol]
, transitionFunction :: TransitionFunction
} deriving (Eq, Show)
tapeAlphabet :: TuringMachine -> [Symbol]
tapeAlphabet tm = blankSymbol tm : inputAlphabet tm
type TransitionFunction = Map (State, Symbol) (State, Symbol, Action)
data Action
= L
| R
deriving (Eq, Ord, Show)
data Tape = Tape [Symbol] Symbol [Symbol]
deriving (Eq, Show)
data Configuration = Configuration State Tape
deriving (Eq, Show)
type ComputationHistory = [Configuration]
type Input = [Symbol]
newtype State = State String
deriving (Eq, Ord, Show, IsString)
newtype Symbol = Symbol String
deriving (Eq, Ord, Show, IsString)
syms :: String -> [Symbol]
syms = map (Symbol . return)
unsyms :: [Symbol] -> String
unsyms = concatMap (\(Symbol s) -> s)