Advertisement
Guest User

Untitled

a guest
May 6th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 5.91 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;; pomocnicza funkcja dla list tagowanych o określonej długości
  4.  
  5. (define (tagged-tuple? tag len p)
  6.   (and (list? p)
  7.        (= (length p) len)
  8.        (eq? (car p) tag)))
  9.  
  10. (define (tagged-list? tag p)
  11.   (and (pair? p)
  12.        (eq? (car p) tag)
  13.        (list? (cdr p))))
  14.  
  15. ;;
  16. ;; WHILE
  17. ;;
  18.  
  19. ; memory
  20.  
  21. (define empty-mem
  22.   null)
  23.  
  24. (define (set-mem x v m)
  25.   (cond [(null? m)
  26.          (list (cons x v))]
  27.         [(eq? x (caar m))
  28.          (cons (cons x v) (cdr m))]
  29.         [else
  30.          (cons (car m) (set-mem x v (cdr m)))]))
  31.  
  32. (define (get-mem x m)
  33.   (cond [(null? m) 0]
  34.         [(eq? x (caar m)) (cdar m)]
  35.         [else (get-mem x (cdr m))]))
  36.  
  37. ; arith and bool expressions: syntax and semantics
  38.  
  39. (define (const? t)
  40.   (number? t))
  41.  
  42. (define (true? t)
  43.   (eq? t 'true))
  44.  
  45. (define (false? t)
  46.   (eq? t 'false))
  47.  
  48. (define (op? t)
  49.   (and (list? t)
  50.        (member (car t) '(+ - * / = > >= < <= not and or mod rand))))
  51.  
  52. (define (op-op e)
  53.   (car e))
  54.  
  55. (define (op-args e)
  56.   (cdr e))
  57.  
  58. (define (op->proc op)
  59.   (cond [(eq? op '+) +]
  60.         [(eq? op '*) *]
  61.         [(eq? op '-) -]
  62.         [(eq? op '/) /]
  63.         [(eq? op '=) =]
  64.         [(eq? op '>) >]
  65.         [(eq? op '>=) >=]
  66.         [(eq? op '<)  <]
  67.         [(eq? op '<=) <=]
  68.         [(eq? op 'not) not]
  69.         [(eq? op 'and) (lambda x (andmap identity x))]
  70.         [(eq? op 'or) (lambda x (ormap identity x))]
  71.         [(eq? op 'mod) modulo]
  72.         [(eq? op 'exp) expt]))
  73.         ;;[(eq? op 'rand) (lambda (max) (min max 4))])) ; chosen by fair dice roll.
  74.                                                       ; guaranteed to be random.
  75.  
  76. (define (var? t)
  77.   (symbol? t))
  78.  
  79. (define (rand? t)
  80.   (tagged-tuple? 'rand 2 t))
  81.  
  82.  
  83. (define (eval-arith e m)
  84.   (define (helper m args acc)
  85.     (if (null? args)
  86.         (list acc m)
  87.         (let ((x (eval-arith (car args) m)))
  88.           (helper (second x) (cdr args) (append acc (list (first x)))))))
  89.         ;(helper (second (eval-arith (car args) m)) (cdr args) (append acc (list (first (eval-arith (car args) m)))))))
  90.   (cond [(true? e) (list true m)]
  91.         [(false? e) (list false m)]
  92.         [(var? e) (list (get-mem e m) m)]
  93.         [(rand? e) (let*
  94.                        ([expres (eval-arith (second e) m)]
  95.                         [eval-r ((rand (res-val expres)) (get-mem 'seed (car (res-state expres))))])
  96.                      (list (res-val eval-r) (set-mem 'seed (res-state eval-r) m)))]
  97.         [(op? e) (let* ([done (helper m (op-args e) '())]
  98.                   [e (apply (op->proc (op-op e)) (first done))])
  99.                  (list e (second done)))]
  100.         [(const? e) (list e m)]))
  101.  
  102. ;; syntax of commands
  103.  
  104. (define (assign? t)
  105.   (and (list? t)
  106.        (= (length t) 3)
  107.        (eq? (second t) ':=)))
  108.  
  109. (define (assign-var e)
  110.   (first e))
  111.  
  112. (define (assign-expr e)
  113.   (third e))
  114.  
  115. (define (if? t)
  116.   (tagged-tuple? 'if 4 t))
  117.  
  118. (define (if-cond e)
  119.   (second e))
  120.  
  121. (define (if-then e)
  122.   (third e))
  123.  
  124. (define (if-else e)
  125.   (fourth e))
  126.  
  127. (define (while? t)
  128.   (tagged-tuple? 'while 3 t))
  129.  
  130. (define (while-cond t)
  131.   (second t))
  132.  
  133. (define (while-expr t)
  134.   (third t))
  135.  
  136. (define (block? t)
  137.   (list? t))
  138.  
  139. ;; state
  140.  
  141. (define (res v s)
  142.   (cons v s))
  143.  
  144. (define (res-val r)
  145.   (car r))
  146.  
  147. (define (res-state r)
  148.   (cdr r))
  149.  
  150. ;; psedo-random generator
  151.  
  152. (define initial-seed
  153.   123456789)
  154.  
  155. (define (rand max)
  156.   (lambda (i)
  157.     (let ([v (modulo (+ (* 1103515245 i) 12345) (expt 2 32))])
  158.       (res (modulo v max) v))))
  159.  
  160. ;; WHILE interpreter
  161.  
  162. (define (old-eval e m)
  163.   (cond [(assign? e)
  164.          (set-mem
  165.           (assign-var e)
  166.           (eval-arith (assign-expr e) m)
  167.           m)]
  168.         [(if? e)
  169.          (if (eval-arith (if-cond e) m)
  170.              (old-eval (if-then e) m)
  171.              (old-eval (if-else e) m))]
  172.         [(while? e)
  173.          (if (eval-arith (while-cond e) m)
  174.              (old-eval e (old-eval (while-expr e) m))
  175.              m)]
  176.         [(block? e)
  177.          (if (null? e)
  178.              m
  179.              (old-eval (cdr e) (old-eval (car e) m)))]))
  180.  
  181. (define (eval e m seed) ;;;;;;;;;;;;;;;;;;;;;;;;w memory trzymaj seed
  182.   ;; TODO : ZAD B: Zaimplementuj procedurę eval tak, by
  183.   ;;        działała sensownie dla wyrażeń używających
  184.   ;;        konstrukcji "rand".
  185.   (old-eval e (set-mem 'seed seed m)))
  186.  
  187. (define (run e)
  188.   (eval e empty-mem initial-seed))
  189.  
  190. ;;
  191.  
  192.  
  193. (define fermat-test
  194.   '( (composite := false)
  195.      (if (or (= 2 n) (= 1 n))
  196.          ()
  197.          (while (> k 0)
  198.                 ( (a := (+ 2 (rand (- n 2))))
  199.                   (if (not (= 1 (mod (expt a (- n 1)) n)))
  200.                   ( (k := 0)
  201.                     (composite := true))
  202.                   (k := (- k 1))))))))
  203. #|(define fermat-test
  204.   '( (composite := false)
  205.      (if (or (= n 1) (= n 2))
  206.          ()
  207.          (while (> k 0)
  208.                 ( (a := (+ 2 (rand (- n 2))))
  209.                   (if (= (mod (expt a (- n 1)) n) 1)
  210.                       (k := (- k 1))
  211.                       ( (k := 0)
  212.                         (composite := true)))
  213.                   )
  214.                 )
  215.          ))
  216.   )   |#          
  217.  
  218.  
  219. (define (probably-prime? n k) ; check if a number n is prime using
  220.                               ; k iterations of Fermat's primality
  221.                               ; test
  222.   (let ([memory (set-mem 'k k
  223.                 (set-mem 'n n empty-mem))])
  224.     (not (get-mem
  225.            'composite
  226.            (eval fermat-test memory initial-seed)))))
  227.  
  228.  
  229. ;(probably-prime? 1 10)
  230. (probably-prime? 2 10)
  231. (probably-prime? 3 10)
  232. (probably-prime? 7 100)
  233. (probably-prime? 12 100)
  234. (probably-prime? 8 100)
  235. ;;;poniżej 5 nie działają
  236.  
  237.  
  238.  
  239.  
  240.               #|(while (< x n)
  241.                      ((new-a := (* new-a a))
  242.                       (x := (+ x 1))))
  243.               (if (not (= 1 (mod new-a n)))
  244.                 ( (k := 0)
  245.                   (composite := true) )
  246.                 ( (k := (- k 1)) )) ))))|#
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement