[离散数学]运算满足结合律等价于运算满足n元结合律
0.摘要
题中的三元结合律即指运算符合结合律,而所谓的“\(n\)元结合律”指\(n\)个元素做二元运算,形如\(a_1\oplus a_2\oplus\cdots\oplus a_n\)中,可以随意合法地加括号而保持值不变(合法指括号能正确匹配)。
本文使用强数学归纳法和递降法(类似无穷递降法,但不是用反证的思路)对此进行证明,即满足结合律的二元运算就会满足\(n\)元结合律。
1.运算、结合律
笔者不清楚离散数学哪里定义过运算,好像线性代数里又有定义过线性运算之类的尔尔,故在这里先基于离散数学的关系定义一下运算。
1.1 .运算
我们知道,运算往往是这样的形式,\(a\otimes b=c\)。而事实上,我们也有多元的运算,例如一元运算阶乘、三元运算混合积等等。因此,我们可以将运算定义为一个多元函数,函数用关系定义,因而全都归结到集合上。
我们跳过一些基本内容,例如集合、(二元)关系。
\(A_i\)是\(n\)个集合,\(A:=A_1\times A_2\times\cdots\times A_n\)和集合\(B\)构成集合\(A\times B\), 关系\(R\subseteq A\times B\). 如果\(\forall a\in A\exists!b\in B(aRb)\),则称关系\(R\)为\(A\rightarrow B\)的\(n\)元函数,常将\(R\)写为\(f\)。
在如上的定义下,二元运算定义为\(A_1\times A_2\rightarrow B\)上的函数。而对于运算,我们一般都会取良好的集合,并且有\(A_1=A_2=:A\).
1.2.结合律
这个大家都熟,我们称运算\(\oplus\)满足结合律,如果\((a\oplus b)\oplus c=a\oplus (b\oplus c)\)。结合律的前提是这个运算在某个集合上具有封闭性,即任意的\(a,b\in A\)有\(a\oplus b\in A\)。例如向量的内积就不满足结合律的前提,因为其将向量映射到了实数上,不满足封闭性。
此外,二元运算往往会规定左结合或右结合。左结合的意思是说,不加括号下写出的\(a\oplus b\oplus c\)会被默认理解为\((a\oplus b)\oplus c\),而右结合则是上式会被理解为\(a\oplus (b\oplus c)\)。这是一种约定、定义,而非性质。左结合的运算是很多的,例如加减乘除,而右结合的较少,例如幂运算和编程语言中的赋值运算\(a=b=c\)。不难看出,符合结合律的运算,都满足左结合和右结合;而不满足结合律的,例如减法,就只能满足左结合,不满足右结合。
2.加括号
我们先做一些定义:
Definition 2.1 我们称一种对运算式\(a_1\oplus a_2\oplus\cdots\oplus a_n\)的加括号方式是合法的,当括号可以对应正常匹配。即从左往右从0开始计数,碰到左括号加一,碰到右括号减一,任何一个过程的计数值为正数,且计数结束后,计数值为0。
我们约定本文遇到的加括号方式全是合法的。Definition 2.2 我们称一种加括号方式是完全的,当这个运算式可以不依赖结合顺序地计算,也即无论规定是左结合还是右结合,其运算顺序相同(或者更形式化的,其二叉运算树相同)。反之,如果存在部分运算式依赖于结合顺序,那么则称这种加括号方式是不完全的。对于一般的情形,可能完全可能不完全,我们称为随意(合法)的加括号方式。
我们有如下引理
Lemma 2.1 任意不完全的加括号方式,在约定结合顺序(左结合或右结合)之后,能够归结为唯一的一个完全的加括号方式。(显然,不证)
并且我们约定,两个加括号方式是相同的 ,如果其运算顺序相同。即\(a*b*c\)和\((a*b)*c\)加括号方式一样。在这样的约定下我们有如下引理:
Lemma 2.2 \(n\)元\(\oplus\)运算式,即\(a_1\oplus a_2\oplus\cdots\oplus a_n\),在其中随意合法地加括号,共有\((n-1)!\)种方式。
**Proof 2.2 ** 由于任意的加括号方式已规定了运算顺序,那么可以将过程统一为按这个运算顺序加括号,直到无法加括号。而加一次括号,相当于把括号中的两个元素视为一个整体,也即每次加括号,内部只有两个元素,且总体元素个数减一。因此,第一次加括号有\(n-1\)种方式,整体元素个数变为\(n-1\)个,类似的,一直加括号,直到整体元素为2个,此时不需要再加括号(再加括号要么不合法,要么不改变运算顺序),总方法数为\((n-1)!\)。
顺便一提,上述的“整体元素个数”其实是模糊的,精确定义可以定义为需要依赖左结合或右结合的次数加上2。事实上,如果引入二叉运算树,一些论证会更严谨,但是我不想作图,故对加括号方式进行定义。
引理2.2是错误的,可以穷举二叉运算树,\(n=4\)的情况为5种,并非\((4-1)!=6\)种。引理2.2是加括号顺序不同则不同的情况,但\((ab)(cd)\)的两个括号在不同的加入顺序下,最终应该是一样的。这个计数可以归结到 二叉运算树有多少种形态 这个问题上,而且这个问题不影响下方的证明,咕了。
3.证明
我们有目标命题\(p_n(n\ge3)\):若有二元运算\(\oplus\)满足结合律,则\(n\)元\(\oplus\)运算式\(a_1\oplus a_2\oplus\cdots\oplus a_n\)中,可以合法完全地加括号而保持值不变。若规定了结合顺序,则其可以随意合法加括号而保持值不变。
由上述引理,可以知道\(n=3\)的情形只有2种,其被结合律本身包含,即\((a\oplus b)\oplus c=a\oplus (b\oplus c)\),因此即有\(p_3\)成立。之后,假定\(p_k,k=3,4,\cdots,n\)成立,我们需要证明\(p_{n+1}\)。
对于\(n+1\)的情形,有\(a_1\oplus a_2\oplus\cdots\oplus a_n\oplus a_{n+1}\),当加括号完全时,整体元素为2或1,对于后者不妨去除最外层括号,归结为2的情况,即两个运算式做运算\(r_p\oplus r_q\),其中\(p,q\)表示运算式中元素个数,\(p+q=n+1\)。我们分类讨论\(r_q\)只包含\(a_{n+1}\)和不只包含\(a_{n+1}\)的情形。
对于情形一:由\(p_n\)即可得到,这种情形下的任何值都等于左结合的运算顺序下得到的值。(不是指运算满足左结合,只是拿这个运算顺序作为值的基准)
对于情形二:我们期望能将这种情况转化为情况一,将\(r_q\)里也按运算顺序写为整体元素为2的运算式,即\(r_p\oplus (r_{q1}\oplus r_{q2})\),由\(p_3\)有\(r_p\oplus (r_{q1}\oplus r_{q2})=(r_p\oplus r_{q1})\oplus r_{q2}\),这就完成了一次去括号,将\(r_p\oplus r_{q1}\)合并,回到了最开始的情形,即\(r_{p+q1}\oplus r_{q2}\)这样两个运算式的讨论。
如上递归式地用结合律做变换,只要我们可以证明这样的步骤是有限的,即可证明结论,而这是简单的。因为,\(q_1\ge1,q_1+q_2=q\),有\(q_2=q-q_1\le q-1\)。每次做变换,都能使得变换后的右边的运算式,内部元素减一(如果换一个良好的记号,就是\(q_{i+1}\le q_i-1\),而\(q\)是有限的,总会减少到1,也即情形一,即有任何情形二的加括号方式,其运算值与情形一相同,结论得证。
Update
如果考虑二叉运算树,那么结合律等价于类似AVL搜索树中的左旋或右旋。换言之,序关系在搜索树的旋转变换和结合律是类似的。

浙公网安备 33010602011771号