aboutsummaryrefslogtreecommitdiff
path: root/src/Turing/Examples.hs
blob: 3b113fd92d55e13a129ccc0e2076376cc87843e4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
module Turing.Examples where

import Data.List (intersperse)
import Data.Monoid

import Turing.Machine

mR1, mL1, mInit :: Machine
mR1 = mkMachine [(0, SymWild, R, 1)]
mL1 = mkMachine [(0, SymWild, L, 1)]
mInit = mL SymInit <> mR1

mR, mL, mR', mL', mW :: Symbol -> Machine
mR sy = mkMachine [(0, sy, W sy, 1), (0, SymWild, R, 0)]
mL sy = mkMachine [(0, sy, W sy, 1), (0, SymWild, L, 0)]
mR' sy = mkMachine [(0, sy, R, 0), (0, SymWild, W SymWild, 1)]
mL' sy = mkMachine [(0, sy, L, 0), (0, SymWild, W SymWild, 1)]
mW sy = mkMachine [(0, SymWild, W sy, 1)]

mWriteStr :: String -> Machine
mWriteStr = mconcat . intersperse mR1 . map (mW . charToSym)

mSub :: Machine
mSub = mkMachine [ (0, SymSpace,   R          , 1)
                 , (1, Symbol 'a', R          , 1)
                 , (1, SymSpace,   R          , 2)
                 , (2, SymSpace,   R          , 2)
                 , (2, Symbol 'a', R          , 3)
                 , (3, SymSpace,   L          , 9)
                 , (3, Symbol 'a', R          , 5)
                 , (9, Symbol 'a', W SymSpace , 9)
                 , (9, SymSpace,   L          , 4)
                 , (4, SymInit,    R          , 10)
                 , (4, SymWild,    L          , 4)
                 , (5, Symbol 'a', R          , 5)
                 , (5, SymSpace,   L          , 6)
                 , (6, Symbol 'a', W SymSpace , 6)
                 , (6, SymSpace,   L          , 7)
                 , (7, Symbol 'a', L          , 7)
                 , (7, SymSpace,   L          , 8)
                 , (8, SymSpace,   L          , 8)
                 , (8, Symbol 'a', W SymSpace , 2) ]

mDecr :: Machine
mDecr = mconcat [mR1, mR SymSpace, mL1, mW SymSpace, mL1, mL SymSpace]