combination problem solved with Mathematica

*To*: mathgroup at yoda.physics.unc.edu*Subject*: combination problem solved with Mathematica*From*: gaylord at ux1.cso.uiuc.edu*Date*: Mon, 30 Mar 1992 03:45:36 -0600

========================= the following query appeared in comp.lang.functional some time ago "given a tuple of lists, generate a list of tuples with each component of each output tuple chosen from one of the components of the corresponding tuple lists. In other words, given ([1,2], [3,4,5]) as input, the program should produce [(1,3), (1,4), (1,5), (2,3), (2,4), (2,5)] The request was for a program written in some functional language such as Standard ML. ====================================== Andrew Koenig's recent response in comp.lang.functional was limited to (ML) lists because " the original problem exactly because it can't be solved in that form in ML: there is no way to write an ML program that decomposes arbitrary tuples " ================================== The functions defined by Andrew Koenig in his solution are easily duplicated in Mathematica, which is a functional programming language (as well as a rewrite system) and are not limited by datatype it is even simpler to use one of Mathematica's built-in 'functions' list1 = {a, 2}; list2 = {cat, g, dog, 4}; Distribute[List[list1, list2], List] {{a, cat}, {a, g}, {a, dog}, {a, 4}, {2, cat}, {2, g}, {2, dog}, {2, 4}} Flatten[Outer[List, list1, list2], 1] {{a, cat}, {a, g}, {a, dog}, {a, 4}, {2, cat}, {2, g}, {2, dog}, {2, 4}} Other related built-in functions are: Nest, Fold , Map, Thread (a 'zip'operation), Inner. Finally, one can play around (and avoid work) by doing all sorts of 'wierd' things: eg., (1) join list1 and list2 to create the list {a, 2, cat, g, dog, 4} (2) create all of the combinations of this list taken two at a time [this was recently done in three different ways in the uiuc.mathematica and sci.math.symbolic groups and would be interesting to do in ML (for lists) as well] (3) select by pattern matching, those pairs whose first elements belong to list1