Advertisement
Guest User

Untitled

a guest
Jun 15th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 14.64 KB | None | 0 0
  1. ;;modyfikowalne pary/obiekty
  2. (define (make-account balance)
  3.   (define (withdraw amount)
  4.     (if (>= balance amount)
  5.         (begin (set! balance (- balance amount))
  6.                balance)
  7.         "Insufficient funds"))
  8.   (define (deposit amount)
  9.     (set! balance (+ balance amount))
  10.     balance)
  11.   (define (dispatch m)
  12.     (cond ((eq? m 'withdraw) withdraw)
  13.           ((eq? m 'deposit) deposit)
  14.           (else (error "Unknown request -- MAKE-ACCOUNT"
  15.                        m))))
  16.   dispatch)
  17.  
  18. (define (cons x y)
  19.   (define (set-x! v) (set! x v))
  20.   (define (set-y! v) (set! y v))
  21.   (define (dispatch m)
  22.     (cond ((eq? m 'car) x)
  23.           ((eq? m 'cdr) y)
  24.           ((eq? m 'set-car!) set-x!)
  25.           ((eq? m 'set-cdr!) set-y!)
  26.           (else (error "Undefined operation -- CONS" m))))
  27.   dispatch)
  28.  
  29. (define (car z) (z 'car))
  30. (define (cdr z) (z 'cdr))
  31.  
  32. (define (set-car! z new-value)
  33.   ((z 'set-car!) new-value)
  34.   z)
  35.  
  36. (define (set-cdr! z new-value)
  37.   ((z 'set-cdr!) new-value)
  38.   z)
  39. ;; leniwe listy
  40.  
  41. (define (lcons x f)
  42.   (cons x f))
  43.  
  44. (define (lhead l)
  45.   (car l))
  46.  
  47. (define (ltail l)
  48.   ((cdr l)))
  49.  
  50. (define (nats-from m)
  51.   (lcons
  52.    m
  53.    (lambda () (nats-from (+ m 1)))))
  54.  
  55. (define nats
  56.   (nats-from 0))
  57.  
  58. (define (take n l)
  59.   (if (or (null? l) (= n 0))
  60.       null
  61.       (cons (lhead l)
  62.             (take (- n 1) (ltail l)))))
  63.  
  64. (define (filter p l)
  65.   (cond [(null? l) null]
  66.         [(p (lhead l))
  67.          (lcons (lhead l)
  68.                 (lambda ()
  69.                   (filter p (ltail l))))]
  70.         [else (filter p (ltail l))]))
  71.  
  72. (define (prime? n)
  73.   (define (div-by m)
  74.     (cond [(= m n) true]
  75.           [(= (modulo n m) 0) false]
  76.           [else (div-by (+ m 1))]))
  77.   (if (< n 2)
  78.       false
  79.       (div-by 2)))
  80.  
  81.  
  82. ;; racklog
  83. (define %male
  84.   (%rel ()
  85.         [('adam)]
  86.         [('john)]
  87.         [('joshua)]
  88.         [('mark)]
  89.         [('david)]))
  90.  
  91.  
  92. (define %female
  93.   (%rel ()
  94.         [('eve)]
  95.         [('helen)]
  96.         [('ivonne)]
  97.         [('anna)]))
  98.  
  99. (define %parent
  100.   (%rel ()
  101.         [('adam 'helen)]
  102.         [('adam 'ivonne)]
  103.         [('adam 'anna)]
  104.         [('eve 'helen)]
  105.         [('eve 'ivonne)]
  106.         [('eve 'anna)]
  107.         [('john 'joshua)]
  108.         [('helen 'joshua)]
  109.         [('ivonne 'david)]
  110.         [('mark 'david)]))
  111.  
  112. (define %sibling
  113.   (%rel (a b c)
  114.         [(a b)
  115.          (%parent c a)
  116.          (%parent c b)]))
  117.  
  118. (define %sister
  119.   (%rel (a b)
  120.         [(a b)
  121.          (%sibling a b)
  122.          (%female a)]))
  123.  
  124.  
  125. (define %ancestor
  126.   (%rel (a b c)
  127.         [(a b)
  128.          (%parent a b)]
  129.         [(a b)
  130.          (%parent a c)
  131.          (%ancestor c b)]))
  132. define %my-append
  133.   (%rel (x xs ys zs)
  134.         [(null ys ys)]
  135.         [((cons x xs) ys (cons x zs))
  136.          (%my-append xs ys zs)]))
  137.  
  138. (define %my-member
  139.   (%rel (x xs y)
  140.         [(x (cons x xs))]
  141.         [(y (cons x xs))
  142.          (%my-member y xs)]))
  143.  
  144. (define %select
  145.   (%rel (x xs y ys)
  146.         [(x (cons x xs) xs)]
  147.         [(y (cons x xs) (cons x ys))
  148.          (%select y xs ys)]))
  149.  
  150. ;; prosta rekurencyjna definicja
  151. (define %simple-length
  152.   (%rel (x xs n m)
  153.         [(null 0)]
  154.         [((cons x xs) n)
  155.          (%simple-length xs m)
  156.          (%is n (+ m 1))]))
  157.  
  158. ;; test w trybie +- (działa)
  159. (%find-all (a) (%simple-length (list 1 2) a))
  160. ;; test w trybie ++ (działa)
  161. (%find-all () (%simple-length (list 1 2) 2))
  162. ;; test w trybie -+ (1 odpowiedź, pętli się)
  163. (%which (xs) (%simple-length xs 2))
  164. ;; test w trybie -- (nieskończona liczba odpowiedzi)
  165. (%which (xs a) (%simple-length xs a))
  166.  
  167. ;; definicja zakładająca, że długość jest znana
  168. (define %gen-length
  169.   (%rel (x xs n m)
  170.         [(null 0) !]
  171.         [((cons x xs) n)
  172.          (%is m (- n 1))
  173.          (%gen-length xs m)]))
  174. ;; test w trybie ++ (działa)
  175. (%find-all () (%gen-length (list 1 2) 2))
  176. ;; test w trybie -+ (działa)
  177. (%find-all (xs) (%gen-length xs 2))
  178.  
  179.  
  180. ;; funkcje proste
  181.  
  182. (define (append xs ys)
  183.   (if (null? xs)
  184.       ys
  185.       (cons (car xs) (append (cdr xs) ys))))
  186.  
  187. (define (mult-append . x)
  188.   (define (iter xs acc)
  189.     (if (null? xs)
  190.         acc
  191.         (append (car xs) (iter (cdr xs) acc))))
  192.   (iter x null))
  193.  
  194. (define (map f xs)
  195.   (if (null? xs)
  196.       null
  197.       (cons (f (car xs))
  198.             (map f (cdr xs)))))
  199.  
  200. (define (foldr f start xs)
  201.   (if (null? xs)
  202.       start
  203.       (f (car xs) (foldl f start (cdr xs)))))
  204.  
  205. (define (foldl f start xs)
  206.   (if (null? xs)
  207.       start
  208.       (foldl f (f (car xs) start) (cdr xs))))
  209.  
  210. (define (reverse xs)
  211.   (if (null? xs)
  212.       null
  213.       (append (reverse (cdr xs)) (list (car xs)))))
  214.  
  215. (define (reverseI xs)
  216.   (define (reverse-iter xs acc)
  217.     (if (null? xs)
  218.         acc
  219.         (reverse-iter (cdr xs) (cons (car xs) acc))))
  220.   (reverse-iter xs null))
  221. #lang racket
  222.  
  223. ;; spoko funkcje
  224.  
  225.  
  226. (define (reverse-rek xs)
  227.   (if (pair? xs)
  228.       (append (reverse-rek (cdr xs)) (cons (car xs) null))
  229.       xs))
  230.  
  231. (define (fold-right op nval xs) ;; spoko funkcja
  232.   (if (null? xs)
  233.       nval
  234.       (op (car xs)
  235.           (fold-right op nval (cdr xs)))))
  236.  
  237.  
  238. (define (insert xs n)
  239.   (if (> n (car xs))
  240.       (cons (car xs) (insert (cdr xs) n))
  241.       (cons n xs)))
  242.  
  243.  
  244. (define (append-s . xs)
  245.   (fold-right append null xs))
  246.      
  247. (define (permi xs)
  248.   (if (null? xs)
  249.       null
  250.       (append-s (map (lambda (zs) (insert (car zs) zs)) (permi (cdr xs))))))
  251.  
  252.  
  253.  
  254. (define (mirror tree) ;3
  255.   (if (leaf? tree)
  256.       tree
  257.       (make-node (node-val tree )
  258.                  (mirror (node-right tree))
  259.                  (mirror (node-left tree)))))
  260.  
  261. (define (flatten tree) ;4
  262.   (if (leaf? tree)
  263.       null
  264.       (append (flatten (node-left tree))
  265.             (cons (node-val tree)
  266.                   (flatten (node-right tree))))))
  267.  
  268. (define (treesort xs) ;5
  269.   (define (treesorcik xs tree)
  270.     (if (null? xs)
  271.         tree
  272.        (treesorcik (cdr xs) (bst-insert (car xs) tree))))
  273.   (flatten (treesorcik xs 'leaf)))
  274.  
  275. (define (append xs ys)
  276.   (if (null? xs)
  277.       ys
  278.       (cons (car xs) (append (cdr xs) ys))))
  279.  
  280. (define (map f xs)
  281.   (if (null? xs)
  282.       null
  283.       (cons (f (car xs))
  284.             (map f (cdr xs)))))
  285.  
  286. (define (flatten2 t)
  287.   (define (flat t acc)
  288.     (if (leaf? t)
  289.         acc
  290.         (flat (node-left t) (cons (node-value t) (flat (node-right t) acc)))))
  291.   (flat t null))
  292.  
  293.  
  294. ;;interpreter
  295.     [(if? e)
  296.          (if (val->bool (eval-env (if-cond e) env))
  297.              (eval-env (if-then e) env)
  298.              (eval-env (if-else e) env))]
  299.         [(cond? e)
  300.          (eval-cond-clauses (cond-clauses e) env)]
  301.         [(var? e)
  302.          (find-in-env (var-var e) env)]
  303.         [(lambda? e)
  304.          (closure-cons (lambda-vars e) (lambda-expr e) env)]
  305.         [(lambda-rec? e)
  306.          (closure-rec-cons (lambda-rec-name e)
  307.                            (lambda-rec-vars e)
  308.                            (lambda-rec-expr e)
  309.                            env)]
  310.         [(app? e)
  311.          (apply-closure ;; gdy podamy (list lambda-rec/lamba argumenty)
  312.            (eval-env (app-proc e) env) ;; <- wylicza domkniecie
  313.            (map (lambda (a) (eval-env a env)) ;;<- ewaluuję podaną liste argumentów
  314.                 (app-args e)))])) ;; cala funkcja polega na dodaniu do srodowika argumentu z lambda-rec/lambda polaczony z ewaluowana lista argumentow
  315. ;;                                     i a nastepnie ewaluacji lambda-rec-expr/lambda-expr; z Lambda podobnie, tylko ze nie laczy nazwy lambdy
  316. ;;                                       z expr
  317.  
  318. (define (eval-cond-clauses cs env)
  319.   (if (null? cs)
  320.       (error "no true clause in cond")
  321.       (let ([cond (cond-clause-cond (car cs))]
  322.             [expr (cond-clause-expr (car cs))])
  323.            (if (val->bool (eval-env cond env))
  324.                (eval-env expr env)
  325.                (eval-cond-clauses (cdr cs) env)))))
  326.  
  327. (define (apply-closure c args)
  328.   (cond [(closure? c)
  329.          (eval-env
  330.             (closure-expr c)
  331.             (env-for-closure
  332.               (closure-vars c)
  333.               args
  334.               (closure-env c)))]
  335.         [(closure-rec? c)
  336.          (eval-env
  337.            (closure-rec-expr c)
  338.            (add-to-env
  339.             (closure-rec-name c)
  340.             c
  341.             (env-for-closure
  342.               (closure-rec-vars c)
  343.               args
  344.               (closure-rec-env c))))]))
  345.  
  346. (define x2 (lambda-rec-cons '(mnozenie x ) '(* x 2)))
  347.  
  348.  
  349.  
  350.  
  351. (define (env-for-closure xs vs env)
  352.   (cond [(and (null? xs) (null? vs)) env]
  353.         [(and (not (null? xs)) (not (null? vs)))
  354.          (add-to-env
  355.            (car xs)
  356.            (car vs)
  357.            (env-for-closure (cdr xs) (cdr vs) env))]
  358.         [else (error "arity mismatch")])) ;; dodaje rownolegle zmienne z definicji domkniecia z argumentami
  359.  
  360. (define (env-for-let def env)
  361.   (add-to-env
  362.     (let-def-var def)
  363.     (eval-env (let-def-expr def) env) ;; dodaje symbol z def-leta do srodowiska wraz z ewaluacja wyrazenia z definicji
  364.     env))
  365.  
  366. ;;kontrakty
  367. (define/contract ( x y
  368. (-> predykat? predykat? predykat?)
  369. (def funkcji)
  370.  
  371. (define natural/c (and/c integer? (not/c negative?)))
  372. (define exact-natural/c (and/c natural/c exact?))
  373. (define positive-natural/c (and/c integer? positive?))
  374.  
  375. (define/contract (jakiesgowno f x)
  376. (-> (-> number? number?) number? (-> number? number?))
  377.       ^^ to tyczy sie f   ^x       ^ zwraca funkcje ktora bierze number i zwraca number
  378.  
  379.  
  380. ;; wyłącznie wyniki funkcji f
  381. (define/contract (map f xs)
  382.   (let ([a (new-?/c 'a)] <- ważne
  383.         [b (new-?/c 'b)]) <- ważne mówi o tym że f zmienia z a na b i wynikowa lista bedzie tylko z b sie skladala
  384.     (-> (-> a b) (listof a) (listof b)))
  385.   (if (null? xs)
  386.       null
  387.       (cons (f (car xs))
  388.             (map f (cdr xs)))))
  389.  
  390.  
  391. (define sort2/c jakis konrakt)
  392.  
  393. (define/contract sort sort2/c funkcja) <- funkcja z kontraktem sort2
  394.  
  395. (and/c (listof integer?) sorted?) <- w kontrakcie mogą być normalnie zdefiniowane predykaty
  396.  
  397.  [dict-insert (->i ([d dict?]
  398.                        [k string?]
  399.                        [v any/c])
  400.                       [result (and/c dict? (not/c dict-empty?))]
  401.                       #:post (result k v)
  402.                       (let ((p (dict-lookup result k)))
  403.                         (and
  404.                           (pair? p)
  405.                           (eq? (car p) k)
  406.                           (eq? (cdr p) v))))]
  407.     [dict-remove (->i ([d dict?]
  408.                        [k string?])
  409.                       [result dict?]
  410.                       #:post (result k)
  411.                       (eq? #f (dict-lookup result k)))]
  412.     [dict-lookup (->i ([d dict?]
  413.                        [k string?])
  414.                      (result (or/c (cons/c string? any/c) #f))
  415.                      #:post (result d)
  416.                      (if (dict-empty? d) (eq? #f result) #t))])))
  417.  
  418.  
  419. (->
  420.  
  421.  
  422.  
  423. ;;typowany racket
  424.  
  425. #lang typed/racket
  426.  
  427. (: funkcja (typy))
  428. (: funkcja (All (A B) (-> A A B) <- wszystko mozemy podac jako A i sie bedzie zgadzac)
  429.  
  430. (define-type (Node A B) (List 'node A B B))
  431.  
  432. (define-predicate node? (Node Any Any))
  433.  
  434. (:print-type node?)
  435. dało by (-> Any Boolean : (List 'node Any Any Any))
  436.  
  437. (define-type (Node A B) (List 'node A B B) )
  438.  
  439.  (define-predicate node? (Node Any Any))
  440.  
  441.  
  442. (define-type Rat (Pairof Integer Integer))
  443.  
  444.  
  445. (define-type Gowno Integer)
  446.  
  447. (define-predicate kupa? Gowno)
  448.  
  449. (define-predicate git? Integer)
  450.  
  451.  
  452.  
  453. (: make-rat (-> Integer Integer Rat))
  454. (define (make-rat n d)
  455.   (let ((c (gcd n d)))
  456.     (cons (quotient n c) (quotient d c))))
  457.  
  458.  
  459. (define-type BinopRel (U '= '>))
  460. (define-type BinopBool (U 'and 'or))
  461. (define-type BinopSym (U BinopNum BinopRel BinopBool))
  462. (struct expr-binop ([op : BinopSym] [l : Expr] [r : Expr]))
  463. (struct expr-if ([c : Expr] [t : Expr] [f : Expr]))
  464. (struct expr-let ([var : Symbol] [def : Expr] [expr : Expr]))
  465. (define-type Literal (U Integer Boolean))
  466. (define-type Expr (U Symbol Literal expr-binop expr-if expr-let))
  467.  
  468. (define-predicate literal? Literal)
  469. (define-predicate op-num? BinopNum)
  470. (define-predicate op-rel? BinopRel)
  471. (define-predicate op-bool? BinopBool)
  472.  
  473. ;; środowiska
  474.  
  475. (define-type Value (U Integer Boolean))
  476. (define-type (Env A) (Listof (List Symbol A)))
  477. (define-type VEnv (Env Value))
  478.  
  479. (: empty-env (All (A) (-> (Env A))))
  480. (define (empty-env)
  481.   null)
  482.  
  483. (: add-to-env (All (A) (-> Symbol A (Env A) (Env A))))
  484. (define (add-to-env x v env)
  485.   (cons (list x v) env))
  486.  
  487. ;; słowniki
  488. #lang racket
  489.  
  490. ;; sygnatura słowników bez kontraktów
  491. ;(define-signature dict^
  492. ;  (dict? dict-empty? empty-dict dict-insert dict-remove dict-lookup))
  493.  
  494. ;; sygnatura słowników z prostymi kontraktami
  495. ;(define-signature dict^
  496. ;  ((contracted
  497. ;    [dict?       (-> any/c boolean?)]
  498. ;    [dict-empty? (-> dict? boolean?)]
  499. ;    [empty-dict  (and/c dict? dict-empty?)]
  500. ;    [dict-insert (-> dict? string? any/c dict?)]
  501. ;    [dict-remove (-> dict? string? dict?)]
  502. ;    [dict-lookup (-> dict? string?
  503. ;                     (or/c (cons/c string? any/c) #f))])))
  504.  
  505. ;; sygnatura słowników z kontraktami zależnymi
  506. (define-signature dict^
  507.   ((contracted
  508.     [dict?       (-> any/c boolean?)]
  509.     [dict-empty? (-> dict? boolean?)]
  510.     [empty-dict  (and/c dict? dict-empty?)]
  511.     [dict-insert (->i ([d dict?]
  512.                        [k string?]
  513.                        [v any/c])
  514.                       [result (and/c dict? (not/c dict-empty?))]
  515.                       #:post (result k v)
  516.                       (let ((p (dict-lookup result k)))
  517.                         (and
  518.                           (pair? p)
  519.                           (eq? (car p) k)
  520.                           (eq? (cdr p) v))))]
  521.     [dict-remove (->i ([d dict?]
  522.                        [k string?])
  523.                       [result dict?]
  524.                       #:post (result k)
  525.                       (eq? #f (dict-lookup result k)))]
  526.     [dict-lookup (->i ([d dict?]
  527.                        [k string?])
  528.                      (result (or/c (cons/c string? any/c) #f))
  529.                      #:post (result d)
  530.                      (if (dict-empty? d) (eq? #f result) #t))])))
  531.    
  532. ;; implementacja słowników na listach
  533. (define-unit dict-list@
  534.   (import)
  535.   (export dict^)
  536.  
  537.   (define (dict? d)
  538.     (and (list? d)
  539.          (eq? (length d) 2)
  540.          (eq? (car d) 'dict-list)))
  541.  
  542.   (define (dict-list d) (cadr d))
  543.   (define (dict-cons l) (list 'dict-list l))
  544.  
  545.   (define (dict-empty? d)
  546.     (eq? (dict-list d) '()))
  547.  
  548.   (define empty-dict (dict-cons '()))
  549.  
  550.   (define (dict-lookup d k) (assoc k (dict-list d)))
  551.  
  552.   (define (dict-remove d k)
  553.     (dict-cons (remf (lambda (p) (eq? (car p) k)) (dict-list d))))
  554.  
  555.   (define (dict-insert d k v)
  556.     (dict-cons (cons (cons k v)
  557.                      (dict-list (dict-remove d k))))))
  558.  
  559. ;; otwarcie implementacji słownika
  560. (define-values/invoke-unit/infer dict-list@)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement