並列時の実行順序の組み合わせの数

久しぶりに,sicpを読んでみた。
(x y z) (a b c)で20通りなのはほんとなのかな?

(use srfi-1)

(define (f s1 s2)
  (cond ((and (null? s1) (null? s2)) '())
        ((null? s1) (cons (car s2) (f s1 (cdr s2))))
        ((null? s2) (cons (car s1) (f (cdr s1) s2)))
        (else
         (list (cons (car s1) (f (cdr s1) s2))
               (cons (car s2) (f s1 (cdr s2)))))))
        
(define (ftree->list t)
  (fold (lambda (st re)
          (receive (tree syms) (partition list? st)
            (cond ((null? tree) (cons syms re))
                  (else
                   (let1 sym (car syms)
                     (fold cons (map (cut cons sym <>) (ftree->list tree))
                           re))))))
        '() t))

;;
(length (ftree->list (f '(x y z) '(a b c)))); =>  20
(for-each print (ftree->list (f '(1 2) '(a b))))
;; =>  (1 a 2 b)
;; (1 a b 2)
;; (1 2 a b)
;; (a b 1 2)
;; (a 1 b 2)
;; (a 1 2 b)
;; #<undef>