Advertisement
SageTheWizard

hw4snet

Nov 7th, 2018
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 11.52 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;; JACOB GALLUCCI                                                        ;;;
  3. ;;; CMPSC 441                                                             ;;;
  4. ;;; Dr. Chang                                                             ;;;
  5. ;;; [email protected]                                                       ;;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7. ;;;                    CMPSC441 : Artificial Intelligence                 ;;;
  8. ;;;                                                                       ;;;
  9. ;;;                                                                       ;;;
  10. ;;; SEMANTIC NET                                                          ;;;
  11. ;;;                                                                       ;;;
  12. ;;;   - Startup Code for homework 4                                       ;;;
  13. ;;;                                                                       ;;;
  14. ;;;   - Note that you don't have use this code                            ;;;
  15. ;;;     if you really want to dig in and write your own.                  ;;;
  16. ;;;                                                                       ;;;
  17. ;;;                                                                       ;;;
  18. ;;; Report bugs to [email protected]                                        ;;;
  19. ;;;                                                                       ;;;
  20. ;;; THANK YOU!                                                            ;;;
  21. ;;;                                                                       ;;;
  22. ;;;                                                                       ;;;
  23. ;;; Sukmoon Chang                                                         ;;;
  24. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25. ;;;                     PREDICATE CALCULUS FORMULAS  (PART 2)             ;;;
  26. ;;; 1. inst(x,y) && inst(y,z) -> inst(x,y)                                ;;;
  27. ;;; 2. inst(x,y) && isa(y,z) -> inst(x,z)                                 ;;;
  28. ;;; 3. inst(x,y) && haspart(y,z) -> haspart(x,z)                          ;;;
  29. ;;; 4. haspart(x,y) && inst(y,z) -> haspart(x,z)                          ;;;
  30. ;;; 5. haspart(x,y) && isa(y,z) -> haspart(x,z)                           ;;;
  31. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  32. ;;; DO NOT MODIFY NEXT LINE
  33. #lang mzscheme
  34.  
  35.  
  36.  
  37.  
  38.  
  39. ;;;
  40. ;;; Database maintaining the semantic net
  41. ;;; - procedures set-up-net and process-relation will populate *database*
  42. ;;;   in such a way that:
  43. ;;;      if we have relations
  44. ;;;           (isa helicopter air-vehicle)
  45. ;;;           (has-part helicopter propeller)
  46. ;;;           (has-part helicopter door)
  47. ;;;           (has-part propeller blade)
  48. ;;;      then *database* should look like
  49. ;;;           ((hellipcopter (isa (air-vehicle))          <-- from relation 1
  50. ;;;                          (has-part (propeller door))) <-- from relation 2, 3
  51. ;;;            (propeller (has-part (blade))))            <-- from relation 4
  52. ;;;
  53.  
  54.  
  55. ;;
  56. ;; Global database
  57. ;; - initially empty
  58. ;;
  59. (define *database* '())
  60.  
  61.  
  62. ;;
  63. ;; Build a semantic net
  64. ;; - The relations are given in a file named file-name
  65. ;; - This procedure reads a line at a time as a list from file-name
  66. ;;   and builds the database using the procedure process-relation
  67. ;; - You need to complete the procedure process-relation below
  68. ;;   for this to work
  69. ;; - You don't need to modify this procedure
  70. (define set-up-net
  71.   (lambda (file-name)
  72.     (with-input-from-file file-name
  73.       (lambda ()
  74.     (let loop ((in (read)))
  75.       (if (not (eof-object? in))
  76.           (begin
  77.         (process-relation in)
  78.         (loop (read)))))))))
  79.  
  80. ;;
  81. ;; Updates *database*
  82. ;; - Currently, this procedure simply prints out its argument.
  83. ;; - You need to modify it so that it updates *database* using set!
  84. ;; - This is the only place you need to use set!
  85. ;;   So, do not abuse set! anywhere else.
  86. (define process-relation
  87.   (lambda (rel)
  88.     (cond
  89.       ((null? rel) '())
  90.       ((equal? 'isa (car rel))
  91.        (set! *database* (add-isa rel *database*)))
  92.       ((equal? 'inst (car rel))
  93.        (set! *database* (add-inst rel *database*)))
  94.       ((equal? 'has-part (car rel))
  95.        (set! *database* (add-part rel *database*))))))
  96.          
  97.  
  98. ;;
  99. ;; Checks if element is in Database
  100. (define in-db?
  101.   (lambda (ele db)
  102.     (cond
  103.       ((null? db) #f)
  104.       ((equal? ele (car db)) #t)
  105.       (else (in-db? ele (cdr db))))))
  106. ;;
  107. ;; Trims DB to just the caar of each element for easier search
  108. ;; I'll be honest though, I added this for debugging and
  109. ;; I was too lazy to de-integrate out of the program
  110. (define trim-db
  111.   (lambda (db)
  112.     (cond
  113.       ((null? db) '())
  114.       (else (cons (caar db) (trim-db (cdr db)))))))
  115.  
  116. ;;
  117. ;; Adds the isa relationship to the database
  118. (define add-isa
  119.   (lambda (rel db)
  120.     (cond
  121.       ((null? db)
  122.        (list (list (cadr rel) (list 'isa (list (caddr rel))))))
  123.       ((not (in-db? (cadr rel) (trim-db db)))
  124.        (append db (list (list (cadr rel) (list 'isa (list (caddr rel)))))))
  125.       ((equal? (caar db) (cadr rel))
  126.        (cond
  127.          ((null? (cadar db))
  128.           (cons (cons (caar db) (list 'isa (list (caddr rel)))) (cdr db)))
  129.          ((equal? (caadar db) 'has-part)
  130.           (cons (cons (caar db) (cons (list 'isa (list (caddr rel))) (cadar db))) (cdr db)))
  131.          (else (cons (cons (caar db) (list (list 'isa (append (cadadar db) (cons (caddr rel) '()))))) (cdr db)))))
  132.       (else (cons (car db) (add-isa rel (cdr db)))))))
  133.  
  134. ;;
  135. ;; Adds the has-part relationship to an element of the database  
  136. (define add-part
  137.   (lambda (rel db)
  138.     (cond
  139.       ((null? db)
  140.        (list (list (cadr rel) (list 'has-part (list (caddr rel))))))
  141.       ((not (in-db? (cadr rel) (trim-db db)))
  142.        (append db (list (list (cadr rel) (list 'has-part (list (caddr rel)))))))
  143.       ((equal? (caar db) (cadr rel))
  144.        (cond
  145.          ((null? (cadar db))
  146.           (cons (cons (caar db) (list 'has-part (list (caddr rel)))) (cdr db)))
  147.          ((and (or (equal? (caadar db) 'isa) (equal? (caadar db) 'inst)) (null? (cddar db)))
  148.           (cons (append (car db) (list (list 'has-part (list (caddr rel))))) (cdr db)))
  149.          ((equal? (caadar db) 'has-part)
  150.           (cons (cons (caar db) (list (list 'has-part (append (cadadar db) (cons (caddr rel) '()))))) (cdr db)))
  151.          (else (cons (cons (caar db) (cons (cadar db) (list (list 'has-part (append (cadaddar db) (cons (caddr rel) '())))))) (cdr db)))))
  152.       (else (cons (car db) (add-part rel (cdr db)))))))
  153.  
  154. ;;
  155. ;; Adds the inst relationship to an element of the database
  156. (define add-inst
  157.   (lambda (rel db)
  158.     (cond
  159.       ((null? db)
  160.        (list (list (cadr rel) list (list 'inst (list (caddr rel))))))
  161.       (else (append db (list (list (cadr rel) (list 'inst (list (caddr rel))))))))))
  162.  
  163.  
  164. ;;;
  165. ;;; Procedures that implement semantic net
  166. ;;;
  167.  
  168.  
  169. ;;
  170. ;; Write isa?
  171. ;; - Currently, this procedure simply prints out its argument.
  172. (define isa?
  173.   (lambda (x y)
  174.     (cond
  175.       ((equal? x y) #t)
  176.       (else (check-isas (flatten (get-all-isa (get-isa x *database*) *database*)) y)))))
  177.  
  178. ;;
  179. ;; get-all-isa - creates a list of all isas recursively (gets the isas of the isas of x)
  180. (define get-all-isa
  181.   (lambda (main-isas db)
  182.     (cond
  183.       ((or (null? main-isas) (null? db)) '())
  184.       (else (cons (car main-isas) (get-all-isa (cdr (append main-isas (get-isa (car main-isas) *database*))) *database*))))))
  185. ;;
  186. ;; get-isa - gets the list of isas of an x element
  187. (define get-isa
  188.   (lambda (x db)
  189.     (cond
  190.       ((null? db) '())
  191.       ((equal? x (caar db)) (cadadar db))
  192.       (else (get-isa x (cdr db))))))
  193.  
  194. ;;
  195. ;; check-isas - returns t / f if element y is in the flattened list returned by get-all-isas
  196. (define check-isas
  197.   (lambda (all-isas y)
  198.     (cond
  199.       ((null? all-isas) #f)
  200.       ((equal? y (car all-isas)) #t)
  201.       (else (check-isas (cdr all-isas) y)))))
  202.  
  203. ;;
  204. ;; Write has-part?
  205. ;; - Currently, this procedure simply prints out its argument.
  206. ;; - For part 2, this procedure should also be able to handle instances
  207. ;; has-part? checks if an element x has a part y
  208. (define has-part?
  209.   (lambda (x y)
  210.     (check-parts (flatten (get-all-parts (flatten (get-parts-isas x *database*)) *database*)) y)))
  211.  
  212.  
  213. ;;
  214. ;; get-all-parts
  215. (define get-all-parts
  216.   (lambda (parts-isa db)
  217.     (cond
  218.       ((null? parts-isa) '())
  219.       (else (cons (car parts-isa) (get-all-parts (append (cdr parts-isa) (get-parts (car parts-isa) db)) *database*))))))
  220.  
  221. ;;
  222. ;; get-parts - gets the immediate parts of an element
  223. (define get-parts
  224.   (lambda (x db)
  225.     (cond
  226.       ((null? db) '())
  227.       ((equal? x (caar db))
  228.        (cond
  229.          ((equal? (caadar db) 'has-part) (cadadar db))
  230.          ((and (equal? (caadar db) 'isa) (not (null? (cddar db))))
  231.           (cadaddar db))
  232.          (else (cadadar db))))
  233.       (else (get-parts x (cdr db))))))
  234.  
  235. ;;
  236. ;; get-parts-isas - gets the main parts of an x and all isas of the element
  237. (define get-parts-isas
  238.   (lambda (x db)
  239.     (cons (get-parts x db) (get-all-isa (get-isa x db) db))))
  240.  
  241. ;;
  242. ;; check-parts - checks if a part y is in the list of parts of an element
  243. (define check-parts
  244.   (lambda (parts-lst y)
  245.     (cond
  246.       ((null? parts-lst) #f)
  247.       ((equal? y (car parts-lst)) #t)
  248.       (else (check-parts (cdr parts-lst) y)))))
  249.  
  250. ;;
  251. ;; Write parts-of
  252. ;; - Currently, this procedure simply prints out its argument.
  253. ;; - For part 2, this procedure should be able to handle instances
  254. ;; parts-of - returns all the parts of a given x as a list
  255. (define parts-of
  256.   (lambda (x)
  257.     (filter-repeats (filter-all-isas (flatten (get-all-parts (flatten (get-parts-isas x *database*)) *database*))
  258.                      (flatten (get-all-isa (get-isa x *database*) *database*))))))
  259.  
  260. ;;
  261. ;; filter-isa - filters an individual isa out of the list - used in filter-all-isas
  262. (define filter-isa
  263.   (lambda (isa parts)
  264.     (cond
  265.       ((null? parts) '())
  266.       ((equal? isa (car parts)) (filter-isa isa (cdr parts)))
  267.       (else (cons (car parts) (filter-isa isa (cdr parts)))))))
  268. ;;
  269. ;; filter-all-isas - filters all isas in the parts list
  270. (define filter-all-isas
  271.   (lambda (parts isas)
  272.     (cond
  273.       ((null? isas) parts)
  274.       (else (filter-all-isas (filter-isa (car isas) parts) (cdr isas))))))
  275. ;;
  276. ;; filter-repeats - with how my get-all-parts / get-all-isa functions work, repeats show up in the output, this filters them out
  277. (define filter-repeats
  278.   (lambda (list-of-parts)
  279.     (cond
  280.       ((null? list-of-parts) '())
  281.       (else (cons (car list-of-parts)
  282.                   (filter-repeats (filter-isa (car list-of-parts) (cdr list-of-parts))))))))
  283.  
  284. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  285. ;;; Functions below this point were added purely to make my life easier
  286. ;;;
  287.  
  288.  
  289. ;;
  290. ;; cadadar - easily access nested isa's to append
  291. (define cadadar
  292.     (lambda (x)
  293.       (car (cdr (car (cdr (car x)))))))
  294. ;;
  295. ;; cadaddar - easily access nested has-parts to append
  296. (define cadaddar
  297.   (lambda (x)
  298.     (car (cdr (car (cdr (cdr (car x))))))))
  299.  
  300. ;;
  301. ;; flatten - flattens list returned by get-all-isa and get-all-parts
  302. (define flatten
  303.   (lambda (slst)
  304.     (cond
  305.       ((null? slst) '())
  306.       ((list? (car slst)) (append (flatten (car slst))
  307.                                   (flatten (cdr slst))))
  308.       (else (cons (car slst) (flatten (cdr slst)))))))
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315. ;;;
  316. ;;; PLEASE DO NOT TOUCH BELOW THIS LINE
  317. ;;; IT IS FOR GRADING PURPOSE ONLY.
  318. ;;;
  319. (set-up-net "snet.data")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement