2.3.7 有交换性和结合性的函数在 Mathematica 中模式是按结构形式匹配的,结构的等价是一个相当复杂的问题, 它需要考虑可交换性和结合性. 在模式匹配时,表达式 是相同的, 故模式 g[x_ + y_, x_] 不仅可以与 g[a + b, a] 匹配, 而且还可以与 g[a + b, b] 匹配. 这一表达式与模式有完全相同的形式
Out[1]= |  |
此处必须先将表达式写成 g[b + a, b] 的形式以便它与模式有相同的结构
Out[2]= |  |
在模式匹配中涉及到有可结合性和可交换性的函数时,Mathematica 就测试变量 的各种顺序来进行匹配.有时会有几种形式,Mathematica 就与先找到的形式 进行匹配. 例如 h[x_ + y_, x_ + z_] 可以与h[a + b, a + b] 按 x a, y b, z b 或x b, y a, z a 进行匹配,但 Mathematica 先找到了情形 x a, y b, z b, 故用这种匹配形式.
这里可以按 x a 或 x b 匹配,但 Mathematica 先找到了x a,故选用这一形式匹配
Out[3]= |  |
ReplaceList 显示两种可能的匹配
Out[4]= |  |
在 Mathematica 中可以给函数赋于一些属性以表明该函数在计算和匹配过程中是 被怎样处理的. 例如对函数赋于了 Orderless 属性后,它就有可交换性和对称性, 允许在模式匹配中对变量重新组合. 能赋给函数的属性 Plus 具有结合, 交换等属性
Out[5]= |  |
定义 q 为可交换性的函数 q 的变量自动按顺序排列
Out[7]= |  |
重新排列变量以进行匹配
Out[8]= |  |
Plus 和 Times 具有交换性和结合性,这就可以对其变量任意加括号, 如 x + (y + z)=x + y + z. Mathematica 在进行匹配时也考虑到了可结合性,如模式 g[x_ + y_] 可以和 g[a + b + c] 匹配,此时 x a, y (b+c). 将 g 的变量写为 a+(b+c) 以便和模式匹配
Out[9]= |  |
如果没有其限制时, Mathematica 把 x_ 与和式中 的第一个元素匹配
Out[10]= |  |
这里给出了所有的匹配形式
Out[11]= |  |
这里要求 x_ 与 b+d 匹配
Out[12]= |  |
一般情况下,当一个规则中的模式覆盖了函数的所有变量时才能按此规则进行变换, 但对具有结合属性的函数而言,没有覆盖其全部变量时,有时也可以进行变换. 没有覆盖全部变量,也可以使用这一规则
Out[13]= |  |
合并和式中的前两项
Out[14]= |  |
像 Plus 和 Times 这样的函数既有结合性也有交换性,而像 Dot 这样的函数 只有结合性却没有交换性. x_ 和 y_ 能匹配点积中的所有项
Out[15]= |  |
给函数 r 赋于属性 Flat 将表达式写成 r[r[a, b], r[a, b]] 的形式以便和模式匹配
Out[17]= |  |
将表达式写为 r[a, r[r[b], r[b]], c] 的形式以便与模式匹配
Out[18]= |  |
在不具有结合性的函数中,模式 x_ 仅与函数的一个变量匹配, 而在具有结合性的函数中,x_ 可与多个变量匹配,如 匹配. 在 x_ 与具有结合性的函数的一个变量匹配时,就需要弄清楚它是与变量 a 匹配,还是与 f[a] 匹配. Mathematica 规定当函数具有属性 OneIdentity 时为第一种,其余为第二种. 给函数r赋于属性 OneIdentity 这里 x_ 与单个变量匹配
Out[20]= |  |
函数 Plus, Times 和 Dot 都具有属性 OneIdentity,这反映了Plus[x] . 但在表示数学对象时,处理没有 OneIdentity 属性的可结合的函数常常是方便的.
|