(sicp16+)やっぱりもう1問した。

improver -> intervalに直した。

;;m2.41
;n>=k>j>iで総和がs
;今回は教科書に沿って,flatmapを使ってみよう
; ;;;;;;;;必要なもの(教科書);;;;;;;;;;;;;;;;
(define (flatmap proc seq)
  (accumulate append '() (map proc seq)))
(define (accumulate op init seq)
  (if (null? seq)
      init
      (op (car seq) (accumulate op init (cdr seq)))))
;;あと、ふつうのunique-pairsも
(define (usually-unique-pairs n)
  (flatmap
   (lambda (i)
     (map (lambda (j) (list i j))
          (enumerate-interval 1 (- i 1))))
     (enumerate-interval 1 n)))
; ;;;;;;;;;;;;;;;;;;;;;;;

(define (unique3-sum-is-s n s)
  (define (sum-equal-s? seq)
    (= s (cadddr seq))) ;;last-elemntのような関数を作ってみても良いかもしれない。
  (define (make-eachelements-and-sum seq)
    (map (lambda (xs) (append xs (list (accumulate + 0 xs)))) seq))
  (define unique-3
    (flatmap
     (lambda (i)
       (map (lambda (j) (cons i j))
            (unique-pairs (- i 1))))
     (enumerate-interval 1 n)))
  (filter sum-equal-s?
          (make-eachelements-and-sum unique-3)))
;	gosh> (unique3-sum-is-s 6 13)
;	((6 4 3 13) (6 5 2 13))

あー、勘違いしていた。

合計はリストの中に入ってないじゃないか。

(define (hontoha-kocchi n s)
(filter (lambda (xs) (= s (accumulate + 0 xs)))
    (flatmap
     (lambda (i)
       (map (lambda (j) (cons i j))
            (unique-pairs (- i 1))))
     (enumerate-interval 1 n))))
;	gosh> (hontoha-kocchi 10 12)
;	((5 4 3) (6 4 2) (6 5 1) (7 3 2) (7 4 1) (8 3 1) (9 2 1))