SICP問題3.69

pairsの定義(教科書で定義)

(define (pairs s t)
  (cons-stream
   (list (stream-car s) (stream-car t))
   (interleave
    (stream-map (lambda (x) (list (stream-car s) x))
                (stream-cdr t))
    (pairs (stream-cdr s) (stream-cdr t)))))

三つの無限ストリームS,TおよびUを取り、i <= j <= kとなる三つの組(S_{i}, T_{j}, U_{k})のストリームを生じる手続きtriplesの定義。上記のpairsを使う

(define (triples s t u)
  (cons-stream 
   (list (stream-car s) (stream-car t) (stream-car u))
   (interleave
    (stream-map (lambda (x) (cons (stream-car s) x))
                (pairs t u))
    (triples (stream-cdr s) (stream-cdr t) (stream-cdr u)))))

triplesを使った正の整数のPythagoras三つ組,つまりi<=ji^2+j^2=k^2であるすべての三つ組(i, j, k)のストリーム
テスト

(stream-ref-range (triples integers integers integers) 0 50)
; (1 1 1)
; (2 2 2)
; (1 1 2)
; (2 2 2)
; (1 2 2)
; (3 3 3)
; (1 1 3)
; (2 2 3)
; (1 2 3)
; (3 3 3)
; (1 1 4)
; (2 3 3)
; (1 3 3)
; (4 4 4)
; (1 1 5)
; (2 2 4)
; (1 2 4)
; (3 3 4)
; (1 1 6)
; (2 3 4)
; (1 3 4)
; (4 4 4)
; (1 1 7)
; (2 2 5)
; (1 2 5)
; (3 4 4)
; (1 1 8)
; (2 4 4)
; (1 4 4)
; (5 5 5)
; (1 1 9)
; (2 2 6)
; (1 2 6)
; (3 3 5)
; (1 1 10)
; (2 3 5)
; (1 3 5)
; (4 4 5)
; (1 1 11)
; (2 2 7)
; (1 2 7)
; (3 4 5)
; (1 1 12)
; (2 4 5)
; (1 4 5)
; (5 5 5)
; (1 1 13)
; (2 2 8)
; (1 2 8)
; #<undef>