Advertisement
Guest User

Untitled

a guest
May 12th, 2014
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.22 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;State table entry has form
  4. ; (symbol state next-symbol next-state dir)
  5.  
  6. (define @ vector-ref)
  7.  
  8. (define blank 'b)
  9.  
  10. (define (find-entry table sym state)
  11.   (define result #f)
  12.   (for ((entry table))
  13.     (when (and (eq? sym (@ entry 0))
  14.                (eq? state (@ entry 1)))
  15.       (set! result entry)))
  16.   (when (not result)
  17.     (printf "[Error: entry not found: ~s]" (list sym state)))
  18.   result)
  19.  
  20. (define (run-tm state-table
  21.                 start-state
  22.                 stop-states
  23.                 init-tape
  24.                 init-tape-index)
  25.   (let ((state start-state)
  26.         (tape init-tape)
  27.         (index init-tape-index))
  28.     (define (iterate)
  29.       (if (member state stop-states)
  30.           (list state
  31.                 (vector-filter (lambda (x) (not (eq? x blank))) (vector-drop tape index))
  32.                 index)
  33.           (let* ((sym (@ tape index))
  34.                  (entry (find-entry state-table sym state))
  35.                  (next-symbol (@ entry 2))
  36.                  (next-state (@ entry 3))
  37.                  (dir (@ entry 4)))
  38.             (when (not (eq? next-symbol blank))
  39.               (vector-set! tape index next-symbol))
  40.             (set! state next-state)
  41.             (when (eq? dir 'l)
  42.               (set! index (- index 1)))
  43.             (when (eq? dir 'r)
  44.               (set! index (+ index 1)))
  45.             (when (>= index (vector-length tape))
  46.               (set! tape
  47.                     (vector-append tape (make-vector (vector-length tape) blank))))
  48.             (when (< index 0)
  49.               (let ((len (vector-length tape)))
  50.                 (set! tape
  51.                       (vector-append (make-vector len blank) tape))
  52.                 (set! index (+ index len))))
  53.             (iterate))))
  54.     (iterate)))
  55.  
  56. ;Program for Turing Machine to add 1 to binary number
  57. ;alphabet = '(0 1)
  58. ;states = (1 2 3 4 'STOP)
  59. ;start-state = 1
  60. ;stop-states = 'STOP
  61.  
  62. (define table-plus1
  63.   #(#(1 1 1 1 r)
  64.     #(0 1 0 1 r)
  65.     #(b 1 b 2 l)
  66.     #(1 2 0 2 l)
  67.     #(0 2 1 3 l)
  68.     #(b 2 1 stop n)
  69.     #(0 3 0 3 l)
  70.     #(1 3 1 3 l)
  71.     #(b 3 b stop r)))
  72.  
  73. ;Run Turing Machine with adder program
  74. (run-tm table-plus1
  75.         1
  76.         '(stop)
  77.         (vector 1 0 1 1 1 0 1 1)
  78.         0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement