むむ、考えているうちに先を越された。
(define (combination ls)
(if (null? ls)
'(())
(apply append (map (lambda (y)
(map (pa$ cons y)
(combination (cdr ls))))
(car ls)))))

(print
(combination '((a b c) (d e f g) (h i j) (k l))))

-- Haskell版
combination (x:xs) = concat $ map (\y -> (map (y:) (combination xs))) x
combination _ = [[]]