From: ···············@sdsu
Subject: Cartesian product
Date: 
Message-ID: <3677@sdsu.UUCP>
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.
From: Denys Duchier
Subject: Re: Cartesian product
Date: 
Message-ID: <56828@yale-celray.yale.UUCP>
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