added the text examples in the section on unordered and ordered Sets
authorRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Tue, 7 Sep 2010 10:55:25 +0000 (16:25 +0530)
committerRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Tue, 7 Sep 2010 10:55:25 +0000 (16:25 +0530)
src/sicp/ch2_3.clj

index b1eea97e4be7414f6eb4cadeff63399bc1da3188..548d3aa1cf6f909465dc8537a7a4f4d1cb5a2625 100644 (file)
@@ -1,5 +1,6 @@
 (ns sicp.ch2_3
-  (:use [sicp.utils :only (error)]))
+  (:use [sicp.utils :only (error)]
+        [sicp.ex2_54 :only (equal?)]))
 
 (defn memq [item x]
   (cond
 (defn multiplicand [p]
   (second (rest p)))
 
+;;;; 2.3.3 sets
+(defn element-of-set? [x set]
+  (cond (empty? set) false
+        (equal? x (first set)) true
+        :else (element-of-set? x (rest set))))
+
+;; add an element to the set, if not already part of the set and return the set. If
+;; already part of the set, then return the set
+(defn adjoin-set [x set]
+  (if (element-of-set? x set)
+    set
+    (cons x set)))
+
+;; intersection of two sets (i.e. elements of the set which are present in both the
+;; sets)
+(defn intersection-set [set1 set2]
+  (cond (or (empty? set1) (empty? set2)) ()
+        (element-of-set? (first set1) set2) (cons (first set1)
+                                                  (intersection-set (rest set1) set2))
+        :else (intersection-set (rest set1) set2)))
+
+
+;;; sets as ordered list
+(defn element-of-set? [x set]
+  (cond (empty? set) false
+        (= (first set) x) true
+        (< x (first set)) false
+        :else (element-of-set? x (rest set))))
+
+(defn intersection-set [set1 set2]
+  (if (or (empty? set1) (empty? set2))
+    ()
+    (let [x1 (first set1)
+          x2 (first set2)]
+      (cond (= x1 x2) (cons x1 (intersection-set (rest set1)
+                                                 (rest set2)))
+            (< x1 x2) (intersection-set (rest set1) set2)
+            (< x2 x1) (intersection-set (rest set2) set1)))))