]> git.rkrishnan.org Git - sicp.git/blobdiff - src/sicp/ex4_35.scm
solutions to 4.35, 4.36 and 4.37
[sicp.git] / src / sicp / ex4_35.scm
diff --git a/src/sicp/ex4_35.scm b/src/sicp/ex4_35.scm
new file mode 100644 (file)
index 0000000..f1b57da
--- /dev/null
@@ -0,0 +1,33 @@
+;; done in Chicken scheme which has a builtin amb operator
+;; - can be installed with
+;;   $ chicken-install amb
+
+(use amb)
+(use srfi-1)
+
+(define (require p)
+  (if (not p) (amb)))
+
+(define (an-element-of items)
+  (require (not (null? items)))
+  (amb (car items) (an-element-of (cdr items))))
+
+(define (an-integer-between low high)
+  (let [(count (- high low))]
+    (let [(items (iota count low))]
+      (an-element-of items))))
+
+(define (a-pythagorean-triple-between low high)
+  (let ((i (an-integer-between low high)))
+    (let ((j (an-integer-between i high)))
+      (let ((k (an-integer-between j high)))
+        (require (= (+ (* i i) (* j j)) (* k k)))
+        (list i j k)))))
+
+;; another implementation
+(define (an-integer-between-2 low high)
+  (require (< low high))
+  (amb low (an-integer-between-2 (+ low 1) high)))
+
+;; play with it
+(a-pythagorean-triple-between 1 20)