| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: turing | 
					
						
							|  |  |  | USING: arrays assocs io kernel math namespaces | 
					
						
							|  |  |  | prettyprint sequences strings vectors words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! 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 state-sym set-sym | 
					
						
							|  |  |  |     dup state-dir position [ + ] change
 | 
					
						
							|  |  |  |     state-next state set ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : c ( -- )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     #! Print current turing machine state. | 
					
						
							|  |  |  |     state get .
 | 
					
						
							|  |  |  |     tape get .
 | 
					
						
							|  |  |  |     2 position get 2 * + CHAR: \s <string> write "^" print ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : n ( -- )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     #! Do one step and print new state. | 
					
						
							|  |  |  |     turing-step c ;
 |