Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 7.42 KB | None | 0 0
  1. ;;Exercise 4
  2.  
  3. (define-struct page [title content])
  4.  
  5. ; A Wiki is a [List-of Page]
  6. ; A Page is a (make-page Symbol [List-of Symbol])
  7. ; INTERPRETATION: An individual page contains a title and a
  8. ; list of links to other pages (represented by their titles).
  9.  
  10. (define P0 (make-page 'dead-end '()))
  11.  
  12. (define PA (make-page 'a (list 'b)))
  13. (define PB (make-page 'b (list 'c)))
  14. (define PC (make-page 'c (list 'd)))
  15. (define PD (make-page 'd (list 'a)))
  16. (define PD2 (make-page 'd '()))
  17.  
  18. (define P1 (make-page 'a (list 'b 'c)))
  19. (define P2 (make-page 'b (list 'd )))
  20. (define P3 (make-page 'c (list 'b 'a)))
  21. (define P4 (make-page 'd '()))
  22.  
  23. (define W0 '())
  24. (define W1 (list P0))
  25. (define W2 (list PA PB PC PD))
  26. (define W3 (list P1 P2 P3 P4))
  27. (define W4 (list PA PB PC PD2))
  28.  
  29. ;;Checks if a cycle exists in a given Wiki
  30. ;; cycle? : Wiki -> Boolean
  31. (check-expect (cycle? W0) #false)
  32. (check-expect (cycle? W1) #false)
  33. (check-expect (cycle? W2) #true)
  34. (check-expect (cycle? W3) #true)
  35. (check-expect (cycle? W4) #false)
  36.  
  37. (define PAGE-1 (make-page 'A (list 'B 'C)))
  38. (define PAGE-2 (make-page 'B (list 'A)))
  39. (define PAGE-3 (make-page 'C '()))
  40. (define PAGE-4 (make-page 'D '()))
  41. (define PAGE-5 (make-page 'B '()))
  42. (define PAGE-6 (make-page 'C (list 'D)))
  43. (define PAGE-7 (make-page 'B '()))
  44. (define PAGE-8 (make-page 'C (list 'D 'A)))
  45. (define PAGE-9 (make-page 'B (list 'D)))
  46. (define PAGE-10 (make-page 'C (list 'A)))
  47. (define PAGE-11 (make-page 'A (list 'A 'B 'C 'E 'T)))
  48. (define PAGE-12 (make-page 'B (list 'B 'C 'D 'F)))
  49. (define PAGE-13 (make-page 'C (list 'D 'E 'F 'T 'R)))
  50. (define PAGE-14 (make-page 'D (list 'A 'B 'F)))
  51.  
  52. (define WIKI-1 (list PAGE-1 PAGE-2 PAGE-3 PAGE-4))
  53. (define WIKI-2 (list PAGE-1 PAGE-5 PAGE-6 PAGE-4))
  54. (define WIKI-3 (list PAGE-1 PAGE-7 PAGE-8 PAGE-4))
  55. (define WIKI-4 (list PAGE-1 PAGE-9 PAGE-10 PAGE-4))
  56. (define WIKI-5 (list PAGE-11 PAGE-12 PAGE-13 PAGE-14))
  57.  
  58. (check-expect (cycle? '()) #false)
  59. (check-expect (cycle? (list PAGE-1)) #false)
  60. (check-expect (cycle? (list (make-page 'A (list 'B 'A)))) #true)
  61. (check-expect (cycle? WIKI-1) #true)
  62. (check-expect (cycle? WIKI-2) #false)
  63. (check-expect (cycle? WIKI-3) #true)
  64. (check-expect (cycle? WIKI-4) #true)
  65. (check-expect (cycle? WIKI-5) #true)
  66.  
  67. (define (cycle? w)
  68.   (local ((define (page-connected? p)
  69.            (connected? (page-title p) (page-title p) w)))
  70.    
  71.   (ormap page-connected? w)))
  72.  
  73. ;; Page Page Wiki -> Boolean
  74. (define (connected? from to W)
  75.   (local (;;Page Wiki -> [List-of Symbol]
  76.           ;;Gets list of out-links from certain page in wiki
  77.           (define (lookup p W)
  78.             (cond
  79.               [(empty? W) '()]
  80.               [(cons? W)
  81.                (if (symbol=? (page-title (first W)) p)
  82.                    (page-content (first W))
  83.                    (lookup p (rest W)))]))
  84.  
  85.           (define from-links (lookup from W))
  86.          
  87.           (define is-to-in-links (member? to from-links))
  88.           ;; Symbol -> Boolean
  89.           (define (redefine-connected new-from)
  90.             (if (symbol=? from new-from)
  91.                 #false
  92.                 (connected? new-from to (remove-out-links W new-from)))))
  93.     (if is-to-in-links
  94.         #true
  95.         (ormap redefine-connected from-links))))
  96.  
  97. ;;Wiki Symbol -> Wiki
  98. (define (remove-out-links w s)
  99.   (local (;;Symbol -> Boolean
  100.           (define (should-keep? out-link)
  101.             (not (symbol=? out-link s)))
  102.           ;;Page -> Page
  103.           (define (filter-out-links p)
  104.             (make-page (page-title p) (filter should-keep? (page-content p)))))
  105.     (map filter-out-links w)))
  106.  
  107. ;;Exercise 5
  108.  
  109. (define-struct node [left right])
  110. ; A TreeOutline is one of
  111. ; - 'leaf
  112. ; - (make-node TreeOutline TreeOutline)
  113.  
  114.  
  115. (define TREE1 'leaf)
  116. (define TREE2 (make-node 'leaf 'leaf))
  117. (define TREE3 (make-node (make-node 'leaf 'leaf) 'leaf))
  118. (define TREE4 (make-node (make-node 'leaf 'leaf)
  119.                          (make-node (make-node 'leaf
  120.                                                (make-node 'leaf 'leaf))
  121.                                     'leaf)))
  122.  
  123. (check-expect (all-trees-of-size 0) (list 'leaf))
  124. (check-expect (all-trees-of-size 1) (list (make-node 'leaf 'leaf)))
  125. (check-expect (all-trees-of-size 2) (list (make-node 'leaf (make-node 'leaf 'leaf))
  126.                                           (make-node (make-node 'leaf 'leaf) 'leaf)))
  127. (check-expect (all-trees-of-size 3) (list
  128.                                      (make-node 'leaf (make-node 'leaf (make-node 'leaf 'leaf)));; 0-2
  129.                                      (make-node 'leaf (make-node (make-node 'leaf 'leaf) 'leaf));; 0-2
  130.                                      (make-node (make-node 'leaf 'leaf) (make-node 'leaf 'leaf));; 1-1
  131.                                      (make-node (make-node 'leaf (make-node 'leaf 'leaf)) 'leaf);; 2-0
  132.                                      (make-node (make-node (make-node 'leaf 'leaf) 'leaf) 'leaf)));2-0
  133.  
  134. (check-expect (length (all-trees-of-size 4)) 14)
  135. (check-expect (length (all-trees-of-size 5)) 42)
  136. (check-expect (length (all-trees-of-size 6)) 132)
  137.  
  138. ;;Natural -> [List-of TreeOutline]
  139. (define (all-trees-of-size n)
  140.   (cond
  141.     [(= n 0) (list 'leaf)]
  142.     [else
  143.      (local [(define LEFT (build-list n all-trees-of-size))
  144.              (define RIGHT (reverse LEFT))]
  145.        (foldr append '() (map merge-treeoutlines LEFT RIGHT)))]))
  146.  
  147. ;; [List-of TreeOutline] [List-of TreeOutline] -> [List-of TreeOutline]
  148. ;;Merges two [List-of TreeOutline] into one by taking the "cross product" of the them.
  149. ;;They are combined by (make-node TreeOutline TreeOutline)
  150. (check-expect (merge-treeoutlines '() '()) '())
  151. (check-expect (merge-treeoutlines '() (list 'leaf)) '())
  152. (check-expect (merge-treeoutlines (list 'leaf) '()) '())
  153. (check-expect (merge-treeoutlines (list 'leaf) (list 'leaf)) (list (make-node 'leaf 'leaf)))
  154. (check-expect (merge-treeoutlines (list (make-node 'leaf 'leaf))
  155.                                   (list (make-node 'leaf (make-node 'leaf 'leaf))
  156.                                         (make-node (make-node 'leaf 'leaf) 'leaf)))
  157.               (list
  158.                (make-node (make-node 'leaf 'leaf) (make-node 'leaf (make-node 'leaf 'leaf)))  ;; 1-2
  159.                (make-node (make-node 'leaf 'leaf) (make-node (make-node 'leaf 'leaf) 'leaf))));; 1-2
  160.  
  161. (define (merge-treeoutlines aloto1 aloto2)
  162.   (local (;;Combines given TreeOutlone from map to given [List-of TreeOutline]
  163.           ;;It combines each with (make-node TreeOutline TreeOutline).
  164.           ;;TreeOutline -> [List-of TreeOutline]
  165.           (define (combine map-ato)
  166.             (merge-treeoutline aloto1 map-ato)))
  167.     (foldr append '() (map combine aloto2))))
  168.  
  169. ;;[List-of TreeOutline] TreeOutline -> [List-of TreeOutline]
  170. ;;Merges a [List-of TreeOutline] with TreeOutline by adding a node
  171. ;;to the "top". It used (make-node TreeOutline TreeOutline)
  172.  
  173. (check-expect (merge-treeoutline '() 'leaf) '())
  174. (check-expect (merge-treeoutline (list (make-node 'leaf (make-node 'leaf 'leaf))
  175.                                        (make-node (make-node 'leaf 'leaf) 'leaf )) 'leaf)
  176.               (list
  177.                (make-node (make-node 'leaf (make-node 'leaf 'leaf)) 'leaf)  ;; 2-0
  178.                (make-node (make-node (make-node 'leaf 'leaf) 'leaf) 'leaf)));; 2-0
  179. (define (merge-treeoutline aloto ato)
  180.   (local (;;Combines given TreeOutline with TreeOutline from map
  181.           ;;TreeOutline -> TreeOutline
  182.           (define (combine map-ato)
  183.             (make-node map-ato ato)))
  184.     (map combine aloto)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement