; Expression evaluators - Is your expression transitive?
; ------------------------------
; The Little Lisper 3rd Edition
; Chapter 8
; Exercise 9
; Common Lisp
; http://t...content-available-to-author-only...r.com/thelittlelisper
; http://t...content-available-to-author-only...t.com/2010/06/little-lisper-chapter-8-friends-and.html
; http://t...content-available-to-author-only...t.com/2010/06/little-lisper.html
; ------------------------------
(setf r1 '((a b)(a a)(b b)))
(setf r2 '((c c)))
(setf r3 '((a c)(b c)))
(setf r4 '((a b)(b a)))
(setf f1 '((a 1)(b 2)(c 2)(d 1)))
(setf f2 '())
(setf f3 '((a 2)(b 1)))
(setf f4 '((1 $)(3 *)))
(setf d1 '(a b))
(setf d2 '(c d))
(setf x 'a)
; ------------------------------
(defun member* (a l)
(cond
((null l) NIL)
((atom (car l))
(or
(eq (car l) a)
(member* a (cdr l))))
(t (or
(member* a (car l))
(member* a (cdr l))))))
(defun eqlist? (l1 l2)
(cond
((and (null l1) (null l2)) t)
((or (null l1) (null l2)) NIL)
(t (and
(eq (car l1) (car l2))
(eqlist? (cdr l1) (cdr l2))))))
(defun member_ (lista listb)
(cond
((null lista) t)
((null listb) NIL)
((atom listb)
(eq lista listb))
((atom lista)
(member* lista listb))
((eqlist? lista listb) t)
(t (or (member_ lista (car listb))
(member_ lista (cdr listb))))))
(defun subset? (set1 set2)
(cond
((null set1) t)
((member_ (car set1) set2)
(subset? (cdr set1) set2))
(t NIL)))
(defun union_ (set1 set2)
; (print 'union_)
; (print set1)
; (print set2)
(cond
((null set1) set2)
((member_ (car set1) set2) ;member?
(union_ (cdr set1) set2)) ; union_
(t (cons (car set1)
(union_ (cdr set1) set2))))) ;union_
(union_ '(tomatoes and marcaroni casserole) '(marcaroni and cheese))
;(TOMATOES CASSEROLE MARCARONI AND CHEESE)
(defun first_ (l)
(cond
((null l) '())
(t (car l))))
(defun second_ (l)
(cond
((null l) '())
(t (car (cdr l)))))
(defun third_ (l)
(cond
((null l) '())
(t (car (cdr (cdr l))))))
(defun pair? (lat)
(cond
((null lat) NIL)
((atom lat) NIL)
((and (and (not (eq (first_ lat) NIL))
(not (eq (second_ lat) NIL))))
(eq (third_ lat) NIL))
(t NIL)))
(defun rel? (rel)
(cond
((null rel) t)
((atom rel) NIL)
((pair? (car rel))
(rel? (cdr rel)))
(t NIL)))
(defun rapply (rel x)
(cond
((null rel) '())
((null x) NIL)
((and (rel? rel) (atom x))
(cond
((eq (first_ (car rel)) x)
(cons (second_ (car rel)) (rapply (cdr rel) x)))
(t (rapply (cdr rel) x))))
(t NIL)))
(defun lat? (l)
(cond
((null l) t)
((atom (car l)) (lat? (cdr l)))
(t nil)))
(defun build (a b)
(cons a (cons b '())))
(defun rin (x set)
(cond
((null x) NIL)
((null set) '())
((lat? set)
(cons (build x (car set))
(rin x (cdr set))))
(t NIL)))
(defun rcomp (rel1 rel2)
(cond
((null rel1) '())
(t (union_ ;'union_
(rin
(first_ (car rel1))
(rapply rel2 (second_ (car rel1))))
(rcomp (cdr rel1) rel2)))))
(defun transitive? (rel)
(subset? (rcomp rel rel) rel))
(print (transitive? r1))
;T
(print (transitive? r3))
;T
(print (transitive? f1))
;T
;non transitive relation
(print (transitive? '((a b)(b d))))
;ie transforms to not nil and not something that is part of the parent relation