Exercise 2.41. Write a procedure to find all ordered triples of distinct positive integers i, j, and k less than or equal to a given integer n that sum to a given integer s.
(define (enumerate-integers i j)
(if (= i j)
(list j)
(cons i (enumerate-integers (+ i 1) j))))
(define (filter f seq)
(if (null? seq)
null
(if (f (car seq))
(cons (car seq) (filter f (cdr seq)))
(filter f (cdr seq)))))
(define (remove x seq)
(filter (if (pair? x)
(lambda (y) (not (member y x)))
(lambda (y) (not (= x y)))) seq))
(define (unique-triples-less-than n)
(let ((the-number-list (enumerate-integers 1 (- n 1))))
(flatmap (lambda (i)
(flatmap (lambda (j)
(map (lambda (k) (list i j k))
(remove (list i j) the-number-list)))
(remove i the-number-list)))
(enumerate-integers 1 (- n 1)))))
(define (flatmap f seq)
(accumulate append null (map f seq)))
(define (accumulate op initial seq)
(if (null? seq)
initial
(op (car seq)
(accumulate op initial (cdr seq)))))
(define (s-sum-triples-below-n n s)
(filter (lambda (y) (= (accumulate + 0 y) s))
(unique-triples-less-than n)))
Can this code be improved in any way?