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を取り、となる三つの組のストリームを生じる手続き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三つ組,つまりでであるすべての三つ組のストリーム
テスト
(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>