Advertisement
Guest User

ondramaze

a guest
Mar 12th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 8.89 KB | None | 0 0
  1.  
  2. (define get-maze
  3.   '(
  4.     (w w w w w w)
  5.     (w 0 w 0 w w)
  6.     (w 0 w 0 0 w)
  7.     (w 0 0 0 w w)
  8.     (w w w w w w)
  9.     )
  10.   )
  11. (define right-hand-rule-prg
  12.   '(
  13.     (procedure start
  14.                ( turn-right
  15.                  (if wall?
  16.                      ( turn-left
  17.                        (if wall?
  18.                            (turn-left
  19.                             (if wall?
  20.                                 turn-left
  21.                                 step
  22.                                 )
  23.                             )
  24.                            step
  25.                            )
  26.                        )
  27.                      step  
  28.                      )
  29.                  put-mark
  30.                  start
  31.                  )
  32.                )  
  33.     (procedure turn-right (turn-left turn-left turn-left))
  34.     )
  35.   )
  36.  
  37.  
  38. (define (get-1d-element arr x)
  39.   (if (zero? x)
  40.       (car arr)
  41.       (get-1d-element (cdr arr) (- x 1))
  42.       ))
  43.  
  44. (define (get-2d-element arr x y)
  45.   (get-1d-element (get-1d-element arr x) y)
  46.   )
  47.  
  48. (define (set-1d-element arr x val)
  49.   (if (zero? x)
  50.       (cons val (cdr arr))
  51.       (cons (car arr) (set-1d-element (cdr arr) (- x 1) val))
  52.       ))
  53.  
  54. (define (set-2d-element arr x y val)
  55.   (if (zero? x)
  56.       (cons (set-1d-element (car arr) y val) (cdr arr))
  57.       (cons (car arr) (set-2d-element (cdr arr) (- x 1) y val))
  58.       ))
  59.  
  60. (define (decrement-value arr x y)
  61.   (let* ((value (get-2d-element arr x y)))
  62.     (set-2d-element arr x y (- value 1))
  63.     ))
  64.  
  65. (define (increment-value arr x y)
  66.   (let* ((value (get-2d-element arr x y)))
  67.     (set-2d-element arr x y (+ value 1))
  68.     ))
  69.  
  70. (define (north? state)
  71.   (if (equal? (caddr state) 'north)
  72.       #t
  73.       #f
  74.       )
  75.   )
  76.  
  77. (define (south? state)
  78.   (if (equal? (caddr state) 'south)
  79.       #t
  80.       #f
  81.       )
  82.   )
  83. (define (west? state)
  84.   (if (equal? (caddr state) 'west)
  85.       #t
  86.       #f
  87.       )
  88.   )
  89. (define (east? state)
  90.   (if (equal? (caddr state) 'east)
  91.       #t
  92.       #f
  93.       )
  94.   )
  95.  
  96. (define (mark? expr)
  97.   (let* ((state (cadr expr))
  98.          (maze (car state))
  99.          (coordinate-x (car (cadr state)))
  100.          (coordinate-y (cadr (cadr state)))
  101.          (position (get-2d-element maze coordinate-x coordinate-y)))
  102.     (if (and (number? position) (> position 0))
  103.         #t
  104.         #f
  105.         )
  106.     )
  107.   )
  108.  
  109. (define (wall? expr)
  110.   (let* ((state (cadr expr))
  111.          (maze (car state))
  112.          (coordinate-x (car (cadr state)))
  113.          (coordinate-y (cadr (cadr state)))
  114.          (position (get-2d-element maze coordinate-x coordinate-y))
  115.          (direction (caddr state)))
  116.     (cond
  117.       ((equal? direction 'north)
  118.        (if (equal? 'w (get-2d-element maze (- coordinate-x 1) coordinate-y))
  119.            #t
  120.            #f
  121.            ))
  122.       ((equal? direction 'south)
  123.        (if (equal? 'w (get-2d-element maze (+ coordinate-x 1) coordinate-y))
  124.            #t
  125.            #f
  126.            ))
  127.       ((equal? direction 'east)
  128.        (if (equal? 'w (get-2d-element maze coordinate-x (+ coordinate-y 1)))
  129.            #t
  130.            #f
  131.            ))
  132.       (else (if (equal? 'w (get-2d-element maze coordinate-x (- coordinate-y 1)))
  133.                 #t
  134.                 #f
  135.                 ))  
  136.       )))
  137.  
  138. (define (put-mark expr)
  139.   (let* ((state (cadr expr))
  140.          (log (car expr))
  141.          (limit (caddr expr))
  142.          (maze (car state))
  143.          (coordinate-x (car (cadr state)))
  144.          (coordinate-y (cadr (cadr state)))
  145.          (position (get-2d-element maze coordinate-x coordinate-y))
  146.          (direction (caddr state)))
  147.     (if (number? position)
  148.         (list (append log (list 'put-mark)) (list (increment-value maze coordinate-x coordinate-y) (list coordinate-x coordinate-y) direction) limit)
  149.         expr
  150.         )))
  151.  
  152. (define (get-mark expr)
  153.   (let* ((state (cadr expr))
  154.          (log (car expr))
  155.          (limit (caddr expr))
  156.          (maze (car state))
  157.          (coordinate-x (car (cadr state)))
  158.          (coordinate-y (cadr (cadr state)))
  159.          (position (get-2d-element maze coordinate-x coordinate-y))
  160.          (direction (caddr state)))
  161.     (if (and (number? position) (> position 0))
  162.         (list (append log (list 'get-mark)) (list (decrement-value maze coordinate-x coordinate-y) (list coordinate-x coordinate-y) direction) limit)
  163.         expr
  164.         )))
  165.  
  166.    
  167. (define (turn-left expr)
  168.   (let* ((state (cadr expr))
  169.          (log (car expr))
  170.          (limit (caddr expr))
  171.          (maze (car state))
  172.          (coordinate-x (car (cadr state)))
  173.          (coordinate-y (cadr (cadr state)))
  174.          (direction (caddr state)))
  175.     (cond
  176.       ((north? state) (list (append log (list 'turn-left)) (list maze (list coordinate-x coordinate-y) 'west) limit))
  177.       ((south? state) (list (append log (list 'turn-left)) (list maze (list coordinate-x coordinate-y) 'east) limit))
  178.       ((west? state) (list (append log (list 'turn-left)) (list maze (list coordinate-x coordinate-y) 'south) limit))
  179.       (else  (list (append log (list 'turn-left)) (list maze (list coordinate-x coordinate-y) 'north) limit ))
  180.       ))
  181.   )
  182.  
  183. (define (step expr)
  184.   (let* ((state (cadr expr))
  185.          (log (car expr))
  186.          (limit (caddr expr))
  187.          (maze (car state))
  188.          (coordinate-x (car (cadr state)))
  189.          (coordinate-y (cadr (cadr state)))
  190.          (direction (caddr state)))
  191.     (if (wall? expr)
  192.         expr
  193.         (cond
  194.           ((north? state) (list (append log (list 'step)) (list maze (list (- coordinate-x 1) coordinate-y) direction) limit))
  195.           ((south? state) (list (append log (list 'step)) (list maze (list (+ coordinate-x 1) coordinate-y) direction) limit))
  196.           ((west? state) (list (append log (list 'step)) (list maze (list coordinate-x (- coordinate-y 1)) direction) limit))
  197.           (else  (list (append log (list 'step)) (list maze (list coordinate-x (+ coordinate-y 1)) direction) limit))
  198.           )
  199.      
  200.         ))
  201.   )
  202. (define (atom? x)
  203.   (and (not (pair? x))
  204.        (not (null? x))))
  205.  
  206. (define (is-command? expr program)
  207.   (cond
  208.     ((equal? expr 'turn-left) #t)
  209.     ((equal? expr 'step) #t)
  210.     ((equal? expr 'put-mark) #t)
  211.     ((equal? expr 'get-mark) #t)
  212.     ((is-procedure? expr program) #t)
  213.     (else #f)
  214.     ))
  215.  
  216. (define (is-form? expr) (list? expr))
  217.  
  218. (define (is-condition? expr) (and (list? expr) (equal? 'if (car expr))))
  219.  
  220. (define (is-procedure? expr program)
  221.   (if (and (atom? expr) (not (null? program)))
  222.       (if (equal? expr (cadr (car program)))
  223.           #t
  224.           (is-procedure? expr (cdr program))
  225.           )
  226.       #f
  227.       ))
  228.  
  229. (define (eval-command expr state program)
  230.   (cond
  231.     ((is-condition? expr) (eval-condition expr state program))
  232.     ((equal? expr 'turn-left) (turn-left state))
  233.     ((equal? expr 'step) (step state))
  234.     ((equal? expr 'put-mark) (put-mark state))
  235.     ((equal? expr 'get-mark) (get-mark state))
  236.     ((is-procedure? expr program) (eval-procedure expr (list (car state) (cadr state) (- (caddr state) 1)) program))
  237.     )
  238.   )
  239.  
  240. (define (eval-condition expr state program)
  241.   (cond
  242.     ((equal? (cadr expr) 'wall?) (if (wall? state)
  243.                                      (eval-expr state (caddr expr) program)
  244.                                      (eval-expr state (cadddr expr) program)))
  245.     ((equal? (cadr expr) 'mark?) (if (mark? state)
  246.                                      (eval-expr state (caddr expr) program)
  247.                                      (eval-expr state (cadddr expr) program)))
  248.     ((equal? (cadr expr) 'north?) (if (north? state)
  249.                                       (eval-expr state (caddr expr) program)
  250.                                       (eval-expr state (cadddr expr) program)))
  251.    
  252.     (else display "CHYBA EVAL-CONDITION"))
  253.                                  
  254.   )
  255.  
  256. (define (eval-form expr state program)
  257.   (cond
  258.     ((null? expr) state)
  259.     ((is-condition? expr) (eval-condition expr state program))
  260.     ((is-command? (car expr) program) (eval-form (cdr expr) (eval-command (car expr) state program) program))
  261.     (else (eval-form (cdr expr) (eval-form (car expr) state program) program))
  262.     )
  263.   )
  264.  
  265. (define (get-procedure expr program)
  266.   (if (equal? expr (cadr (car program)))
  267.       (car program)
  268.       (get-procedure expr (cdr program))
  269.       )
  270.   )
  271. (define (eval-procedure expr state program)
  272.   (display expr)
  273.   (if (> (caddr state) 0)
  274.       (let* ((as (eval-expr state (caddr (get-procedure expr program)) program)))
  275.         (list (car as) (cadr as) (+ (caddr as) 1)))
  276.       state))
  277.  
  278.  
  279. (define (eval-expr state expr program)
  280.   (cond ((is-command? expr program) (eval-command expr state program))
  281.         ((is-form? expr)   (eval-form expr state program))
  282.         ((is-procedure? expr program) (eval-procedure expr (list (car state) (cadr state) (- (caddr state) 1))  program))
  283.         (else display "CHYBA EVAL-EXPR"))
  284.  
  285.   )
  286.      
  287.  
  288. (define (simulate state expr program limit)
  289.   (eval-expr (list '() state limit) expr program)
  290.   )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement