Does anyone have a lisp function that performs the Cartesian product
on a list, i.e.,
(CARTESIAN '((A B) (C D) (E F))) will return
((A C E) (A C F) (A D E) (A D F) (B C E) (B C F) (B D E) (B D F))
not necessarily in that order.
In article <····@sdsu.UUCP>, ···············@sdsu writes:
> Does anyone have a lisp function that performs the Cartesian product
> on a list, i.e.,
> (CARTESIAN '((A B) (C D) (E F))) will return
> ((A C E) (A C F) (A D E) (A D F) (B C E) (B C F) (B D E) (B D F))
> not necessarily in that order.
(DEFUN CARTESIAN (L)
(COND ((NULL L) NIL)
((NULL (CDR L))
(MAPCAR #'LIST (CAR L)))
(T (MAPCAN #'(LAMBDA (X) (MAPCAR #'(LAMBDA (Y) (CONS Y X)) (CAR L)))
(CARTESIAN (CDR L))))))
--Denys