factor/extra/turing/turing.factor

71 lines
1.5 KiB
Factor

USING: arrays assocs io kernel math namespaces
prettyprint sequences strings vectors words accessors ;
IN: turing
! A turing machine simulator.
TUPLE: state sym dir next ;
! Mapping from symbol/state pairs into new-state tuples
SYMBOL: states
! Halting state
SYMBOL: halt
! This is a simple program that outputs 5 1's
H{
{ { 1 0 } T{ state f 1 1 2 } }
{ { 2 0 } T{ state f 1 1 3 } }
{ { 3 0 } T{ state f 1 -1 1 } }
{ { 1 1 } T{ state f 1 -1 2 } }
{ { 2 1 } T{ state f 1 -1 3 } }
{ { 3 1 } T{ state f 1 -1 halt } }
} states set
! Current state
SYMBOL: state
! Initial state
1 state set
! Position of head on tape
SYMBOL: position
! Initial tape position
5 position set
! The tape, a mutable sequence of some kind
SYMBOL: tape
! Initial tape
20 0 <array> >vector tape set
: sym ( -- sym )
#! Symbol at head position.
position get tape get nth ;
: set-sym ( sym -- )
#! Set symbol at head position.
position get tape get set-nth ;
: next-state ( -- state )
#! Look up the next state/symbol/direction triplet.
state get sym 2array states get at ;
: turing-step ( -- )
#! Do one step of the turing machine.
next-state
dup sym>> set-sym
dup dir>> position [ + ] change
next>> state set ;
: c ( -- )
#! Print current turing machine state.
state get .
tape get .
2 position get 2 * + CHAR: \s <string> write "^" print ;
: n ( -- )
#! Do one step and print new state.
turing-step c ;