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

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

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