#lang sicp (define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence))))) (define (flatmap proc seq) (accumulate append nil (map proc seq))) (define (filter predicate sequence) (cond ((null? sequence) nil) ((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence)))) (else (filter predicate (cdr sequence))))) (define (enumerate-interval a b) (if (> a b) '() (cons a (enumerate-interval (+ a 1) b)))) (define (sum l) (accumulate + 0 l)) ; returns a function which checks given list for ; specific sum (define (sum-is-num s) (lambda (list) (= (sum list) s))) (define (ordered-triples-with-sum n s) (filter (sum-is-num s) (flatmap (lambda (i) (flatmap (lambda (j) (map (lambda (k) (list i j k)) (enumerate-interval 1 (- j 1)))) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n))))