标题：笛卡尔乘积
序偶与笛卡尔积
在日常生活中，有许多事物是成对出现的，而且这种成对出现的事物，具有一定的顺序。例如，上，下；左，右；3〈4；张华高于李明；中国地处亚洲；平面上点的坐标等。一般地说，两个具有固定次序的客体组成一个序偶，它常常表达两个客体之间的关系。记作〈x，y〉。上述各例可分别表示为〈上，下〉；〈左，右〉；〈3，4〉；〈张华，李明〉；〈中国，亚洲〉；〈a，b〉等。
序偶可以看作是具有两个元素的集合。但它与一般集合不同的是序偶具有确定的次序。在集合中{a，b}={b，a}，但对序偶〈a，b〉≠〈b，a〉。
设x，y为任意对象，称集合{{x},{x,y}}为二元有序组，或序偶（ordered pairs），简记为<x,y>；。称x为<x,y>；的第一分量，称y为第二分量。
定义3-4.1 对任意序偶<a，b>,<c,d >,<a，b> = <c,d > 当且仅当a=c且b = d。
递归定义n元序组 <a1，…，an> 
<a1，a2> ={{a1}，{a1,a2}} 
<a1,a2,a3 > = { {a1}，{a1,a2},{a1,a2,a3}} 
= < <a1,a2 >,a3 > 
<a1，…an> = <<a1，…an-1>,an>
两个n元序组相等 
< a1，…an >= < b1，…bn >&Ucirc;(a1=b1) ∧ …∧ (an=bn)
定义3-4.2 对任意集合 A1，A2，…，An，
（1）A1×A2，称为集合A1，A2的笛卡尔积（Cartesian product），定义为
A1 ×A2={x | $u $v(x = <u,v>；∧u &Icirc;A1∧v&Icirc;A2)}={<u,v> | u &Icirc;A1∧v&Icirc;A2} 
（2）递归地定义 A1 × A2× … × An 
A1 × A2×… × An= (A1× A2 × …× An-1）×An 
例题1 若A={α，β}，B={1，2，3}，求A×B，A×A，B×B以及（A×B）&Ccedil；（B×A）。
解 A×B={〈α，1〉，〈α，2〉，〈α，3〉，〈β，1〉，〈β，2〉，<；β，3〉}
B×A={〈1，α〉，〈1，β〉，〈2，α〉，〈2，β〉，〈3，α〉，〈3，β〉}
A×A={〈α，α〉，〈α，β〉，〈β，α〉，〈β，β〉}
B×B={〈1，1〉，〈1，2〉，〈1，3〉，〈2，1〉，〈2，2〉，〈2，3〉，〈3，1〉，〈3，2〉，〈3，3〉}
（A×B）&Ccedil；（B×A）=&AElig; 
由例题1可以看到（A×B）&Ccedil；（B×A）=&AElig; 
我们约定若A=&AElig；或B=&AElig；，则A×B=&AElig；。
由笛卡尔定义可知：
（A×B）×C={〈〈a，b〉，c〉|（〈a，b〉∈A×B）∧（c∈C）}
={〈a，b，c〉|（a∈A）∧（b∈B）∧（c∈C）} 
A×（B×C）={〈a，〈b，c〉〉|（a∈A）∧（〈b，c〉∈B×C）} 
由于〈a，〈b，c〉〉不是三元组，所以 
（A×B）×C ≠A×（B×C） 
定理3-4.1 设A,B,C为任意集合，*表示 &Egrave；，&Ccedil；或 – 运算，那么有如下结论：
笛卡尔积对于并、交差运算可左分配。即：
A×（B*C)=(A×B)*(A×C) 
笛卡尔积对于并、交差运算可右分配。即：
(B*C) ×A=(B×A)*(C×A)
证明¤ 当*表示 &Egrave；时，结论（1）的证明思路：（讨论叙述法） 
先证明A×（B &Egrave; C)&Iacute;(A×B) &Egrave; (A×C) 从<x,y>；∈A×（B&Egrave;C）出发，推出<x,y>；∈（A ×B) &Egrave; (A×C) 
再证明（A×B) &Egrave; (A×C) &Iacute; A×（B &Egrave; C) 
从<x,y>；∈（A×B) &Egrave; (A×C）出发，推出<x,y>；∈A×（B&Egrave;C) 
当*表示 &Egrave；时，结论（2）的证明思路：（谓词演算法） 见P-103页。¤ 
定理3-4.2 设A,B,C为任意集合，若C ≠ F，那么有如下结论：
A&Iacute;B&Ucirc;(A×C &Iacute;B×C) &Ucirc; (C×A&Iacute;C×B) ¤
定理前半部分证明思路 ：（谓词演算法） 
先证明A&Iacute;B &THORN; (A×C&Iacute;B×C)
以A&Iacute;B 为条件，从<x,y>；∈A×C出发，推出<x,y>；∈B×C
得出（A×C&Iacute;B×C）结论。
再证明（A×C &Iacute;B×C) &THORN; A&Iacute;B 
以C≠F为条件，从x∈A出发，对于y∈C，利用&THORN；附加式，推出x∈B 
得出（A&Iacute;B）结论。见P-103页。¤
定理3-4.3 设A,B,C,D为任意四个非空集合，那么有如下结论：
A×B &Iacute; C×D的充分必要条件是A&Iacute; C，B&Iacute; D 
¤证明思路：（谓词演算法） 
先证明充分性：A×B &Iacute; C×D &THORN; A&Iacute; C，B&Iacute; D 
对于任意的x∈A、y∈B，从<x,y>；∈A×B出发，利用条件A×B&Iacute; C×D， <x,y>；∈C×D，推出x∈C， y∈D。
再证明必要性：A&Iacute; C，B&Iacute; D &THORN;A×B&Iacute; C×D 
对于任意的x∈A、y∈B，从<x,y>；∈A×B出发，推出<x,y>；∈C×D。
直积笛卡尔（Cartesian Product）乘积又叫直积。设A、B是任意两个集合，在集合A中任意取一个元素x，在集合B中任意取一个元素y，组成一个有序对（x，y），把这样的有序对作为新的元素，他们的全体组成的集合称为集合A和集合B的直积，记为A×B，即A×B={（x，y）|x∈A且y∈B}。
程序代码
C#源代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;
public class Descartes
{
public static void run(List<List<string>> dimvalue, List<string> result, int layer, string curstring)
{
if (layer < dimvalue.Count - 1)
{
if (dimvalue[layer].Count == 0)
run(dimvalue, result, layer + 1, curstring);
else
{
for (int i = 0; i < dimvalue[layer].Count; i++)
{
StringBuilder s1 = new StringBuilder();
s1.Append(curstring);
s1.Append(dimvalue[layer][i]);
run(dimvalue, result, layer + 1, s1.ToString());
}
}
}
else if (layer == dimvalue.Count - 1)
{
if (dimvalue[layer].Count == 0) result.Add(curstring);
else
{
for (int i = 0; i < dimvalue[layer].Count; i++)
{
result.Add(curstring + dimvalue[layer][i]);
}
}
} 
}
}
程序使用说明（1）将每个维度的集合的元素视为List<string>,多个集合构成List<List<string>> dimvalue作为输入
（2）将多维笛卡尔乘积的结果放到List<string> result之中作为输出
（3）int layer, string curstring只是两个中间过程的参数携带变量
（4）程序采用递归调用，起始调用示例如下：
List<string> result = new List<string>();
Descartes.run(dimvalue, result, 0, "");
即可获得多维笛卡尔乘积的结果。[2]