(define (producto Lista)
  (cond ((null? Lista) '())
        (else (producto-aux (car Lista) (producto (cdr Lista))))))

(define (producto-aux cabezas solucion-parcial)
  (cond ((null? solucion-parcial) (map (lambda (x) (list x)) cabezas))
        (else (reduce append '()
                      (map (lambda (y) (map (lambda (x) (cons y x))
                                            solucion-parcial))
                           cabezas)))))


(write ( producto '((1 2 3) (4 5)) )  )
(write ( producto '(('a 's 'd)  (1 2 3)  ('X 'Y 'Z)) )  )
