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 ;
 |