71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			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 ;
 |