限制模式
Mathematica 中提供了对模式进行限制的一般方法. 这可以通过在模式后面加 /;condition 来实现,此运算符
可读作"斜杠分号"、"每当"或"只要",其作用是当所指定的 condition 值为 True 时模式才能使用.
| pattern/;condition | 当条件满足时,模式才匹配 |
| lhs:>rhs/;condition | 当条件满足时,才使用规则 |
| lhs:=rhs/;condition | 当条件满足时,才使用定义 |
对模式和变换规则进行限制.
定义

,其自变量

必为正.
当

的自变量为正时,才计算.
| Out[2]= |  |
| Out[3]= |  |
可以在变换规则中用
,也可以在单个模式中用
. 可以将 /;condition 放在
定义域或
规则后告诉 Mathematica 只有当指定的条件满足时才能使用此定义或规则. 但要注意
不能放在
或
规则后,因为这些是立即被处理的(见 "立即定义和延时定义" ).
要求自变量

为正的另一种定义方式.
| Out[5]= |  |
运算符
可以用来限制运算规则的使用范围. 典型的情况是,先定义与较广范围的表达式匹配的模式,然后在后面给出一些数学上的限制,使其最终匹配成功的表达式缩减到一个较小的范围.
这一规则仅适用于具有

结构的表达式.
| Out[7]= |  |
此表达式的数学形式正确,但结构不一致,故无法使用前面的规则.
| Out[8]= |  |
此规则适用于任何形如

的表达式,但要求

.
| Out[10]= |  |
在定义模式或规则时,可以把
放在不同的位置. 例如,可以将
放在规则的右端,其形式为
,也可以将其放在左端,其形式为
. 还可以把它插在表达式 lhs 的中间. 但要注意在指定条件中使用的模式名称必须在该条件涉及的模式中出现,否则在判断条件是否成立的过程中所使用的名称就不一定限制在与模式匹配的表达式值之中,这时 Mathematica 会使用一些全局变量,而不是取决于模式匹配的值.
例如,在
的条件中将使用与
匹配的
和
的值,而在
的条件中将用一个全局变量
的值,而不是与模式匹配的
值.
当确信适当的名称定义了之后,通常将条件
放在一个模式可能最小的项上是最有效的,因为 Mathematica 逐块对模式进行匹配,一旦发现
条件不成立,就不再进行匹配.
将

放在

处比放在整个模式后更有效.
| Out[11]= |  |
在这种情况下,需要在

处加括号.
| Out[12]= |  |
通常用
使模式和变换规则使用到具有某一性质的表达式上,在 Mathematica 中有一类函数去测试表达式的性质. 这类函数后有一个
,表明它们在"提问".
| IntegerQ[expr] | 整数 |
| EvenQ[expr] | 偶数 |
| OddQ[expr] | 奇数 |
| PrimeQ[expr] | 素数 |
| NumberQ[expr] | 任何数 |
| NumericQ[expr] | 数字型 |
| PolynomialQ[expr,{x1,x2,...}] | 关于 , , ... 的多项式 |
| VectorQ[expr] | 表示向量的列表 |
| MatrixQ[expr] | 表示矩阵的集合的列表 |
| VectorQ[expr,NumericQ], MatrixQ[expr,NumericQ] |
| 所有元素都是数字的向量和矩阵 |
| VectorQ[expr,test], MatrixQ[expr,test] |
| 对所有元素 test 的函数值都为 True 的向量和矩阵 |
| ArrayQ[expr,d] | 深度与 d 匹配的完全数组 |
测试表达式数学特性的一些函数.
| Out[13]= |  |
| Out[15]= |  |
以
结尾的 Mathematica 测试函数的一个重要特性是:当它无法确定一个表达式具有所指出的特性时,测试函数的返回值为 False.
| Out[16]= |  |
| Out[17]= |  |
函数如 IntegerQ[x] 测试 x 是否是一个整数. 在 x
Integers 的假定下,可以使用 Refine、Simplify 及相关函数对符号变量 x 进行推导.
| SameQ[x,y] 或 x===y | x 与 y 相等 |
| UnsameQ[x,y] 或 x=!=y | x 与 y 不等 |
| OrderedQ[{a,b,...}] | a、b ... 按标准顺序排列 |
| MemberQ[expr,form] | form 与表达式 expr 中的一个元素匹配 |
| FreeQ[expr,form] | form 与表达式 expr 中的任何元素不匹配 |
| MatchQ[expr,form] | expr 与模式 form 匹配 |
| ValueQ[expr] | 定义了 expr 的一个值 |
| AtomQ[expr] | expr 无任何子表达式 |
测试表达式结构特性的一些函数.
"

" 意味着方程保持着符号形式;当表达式不同时,"

" 输出
False.
| Out[18]= |  |

不在集合

中.
| Out[19]= |  |
然而,

不是完全不含

.
| Out[20]= |  |
从

中移出不含

的项.
| Out[22]= |  |
| pattern?test | 模式与 test 的结果为 True 的表达式匹配 |
限制模式的另一种方法.
通过所涉及模式名满足的条件确定是否可以匹配.
通过检查函数 test 在表达式的值来确定是否可以匹配. 用
比
更方便.
当

的变量为数值时才进行运算.
| Out[24]= |  |
| Out[26]= |  |
具有例外情况的模式.
| Out[27]= |  |
| Out[28]= |  |
| Out[29]= |  |
Except[c] 在一定意义上是个非常普遍的模式:它与除了 c 以外的 任意表达式 匹配. 在许多情况下,我们需要使用Except[c, patt],其工作原理是从匹配 patt 的表达式开始,并且排除与 c 匹配的表达式.