X-Git-Url: https://git.rkrishnan.org/?p=sicp.git;a=blobdiff_plain;f=src%2Fsicp%2Fex4_35.scm;fp=src%2Fsicp%2Fex4_35.scm;h=f1b57da94aa433ceef76dc90065193a235e1e166;hp=0000000000000000000000000000000000000000;hb=16ffd75b36a5dbfbda3da703c2732f8f49208c11;hpb=ef9bb63c4d3fa21f9964c3a5e612bfc519406744 diff --git a/src/sicp/ex4_35.scm b/src/sicp/ex4_35.scm new file mode 100644 index 0000000..f1b57da --- /dev/null +++ b/src/sicp/ex4_35.scm @@ -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)