限制模式

Mathematica 中提供了对模式进行限制的一般方法. 这可以通过在模式后面加 /;condition 来实现,此运算符 可读作"斜杠分号"、"每当"或"只要",其作用是当所指定的 condition 值为 True 时模式才能使用.

pattern/;condition当条件满足时,模式才匹配
lhs:>rhs/;condition当条件满足时,才使用规则
lhs:=rhs/;condition当条件满足时,才使用定义

对模式和变换规则进行限制.

定义 ,其自变量 必为正.
In[1]:=
Click for copyable input
的自变量为正时,才计算.
In[2]:=
Click for copyable input
Out[2]=
给出列表中的负值元素.
In[3]:=
Click for copyable input
Out[3]=

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

要求自变量 为正的另一种定义方式.
In[4]:=
Click for copyable input
自变量为正的阶乘函数.
In[5]:=
Click for copyable input
Out[5]=

运算符 可以用来限制运算规则的使用范围. 典型的情况是,先定义与较广范围的表达式匹配的模式,然后在后面给出一些数学上的限制,使其最终匹配成功的表达式缩减到一个较小的范围.

这一规则仅适用于具有 结构的表达式.
In[6]:=
Click for copyable input
此表达式的结构可以用上面的规则.
In[7]:=
Click for copyable input
Out[7]=
此表达式的数学形式正确,但结构不一致,故无法使用前面的规则.
In[8]:=
Click for copyable input
Out[8]=
此规则适用于任何形如 的表达式,但要求 .
In[9]:=
Click for copyable input
新规则可以用于这一表达式.
In[10]:=
Click for copyable input
Out[10]=

在定义模式或规则时,可以把 放在不同的位置. 例如,可以将 放在规则的右端,其形式为 ,也可以将其放在左端,其形式为 . 还可以把它插在表达式 lhs 的中间. 但要注意在指定条件中使用的模式名称必须在该条件涉及的模式中出现,否则在判断条件是否成立的过程中所使用的名称就不一定限制在与模式匹配的表达式值之中,这时 Mathematica 会使用一些全局变量,而不是取决于模式匹配的值.

例如,在 的条件中将使用与 匹配的 的值,而在 的条件中将用一个全局变量 的值,而不是与模式匹配的 值.

当确信适当的名称定义了之后,通常将条件 放在一个模式可能最小的项上是最有效的,因为 Mathematica 逐块对模式进行匹配,一旦发现 条件不成立,就不再进行匹配.

放在 处比放在整个模式后更有效.
In[11]:=
Click for copyable input
Out[11]=
在这种情况下,需要在 处加括号.
In[12]:=
Click for copyable input
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 匹配的完全数组

测试表达式数学特性的一些函数.

对集合中的数字用变换规则.
In[13]:=
Click for copyable input
Out[13]=
此定义仅适用于整数向量.
In[14]:=
Click for copyable input
上面的定义仅能用于第一个元素.
In[15]:=
Click for copyable input
Out[15]=

结尾的 Mathematica 测试函数的一个重要特性是:当它无法确定一个表达式具有所指出的特性时,测试函数的返回值为 False.

是个整数,所有其返回值为 True.
In[16]:=
Click for copyable input
Out[16]=
因为 不是一个整数,故返回值为 False.
In[17]:=
Click for copyable input
Out[17]=

函数如 IntegerQ[x] 测试 x 是否是一个整数. 在 x in Integers 的假定下,可以使用 RefineSimplify 及相关函数对符号变量 x 进行推导.

SameQ[x,y] x===yxy 相等
UnsameQ[x,y] x=!=yxy 不等
OrderedQ[{a,b,...}]ab ... 按标准顺序排列
MemberQ[expr,form]form 与表达式 expr 中的一个元素匹配
FreeQ[expr,form]form 与表达式 expr 中的任何元素不匹配
MatchQ[expr,form]expr 与模式 form 匹配
ValueQ[expr]定义了 expr 的一个值
AtomQ[expr]expr 无任何子表达式

测试表达式结构特性的一些函数.

"" 意味着方程保持着符号形式;当表达式不同时," " 输出 False.
In[18]:=
Click for copyable input
Out[18]=
不在集合 中.
In[19]:=
Click for copyable input
Out[19]=
然而, 不是完全不含 .
In[20]:=
Click for copyable input
Out[20]=
可以使用 FreeQ 定义线性规则.
In[21]:=
Click for copyable input
从  中移出不含 的项.
In[22]:=
Click for copyable input
Out[22]=
pattern?test模式与 test 的结果为 True 的表达式匹配

限制模式的另一种方法.

通过所涉及模式名满足的条件确定是否可以匹配. 通过检查函数 test 在表达式的值来确定是否可以匹配. 用 更方便.

用函数 NumberQ 测试该定义对 是否匹配.
In[23]:=
Click for copyable input
的变量为数值时才进行运算.
In[24]:=
Click for copyable input
Out[24]=
更复杂的定义不要忘了函数两边的括号.
In[25]:=
Click for copyable input
该定义仅在一些情况下有效.
In[26]:=
Click for copyable input
Out[26]=
Except[c]与任何非 c 表达式匹配的模式
Except[c,patt]patt 匹配但非 c 的模式

具有例外情况的模式.

这里给出除0以外的所有元素.
In[27]:=
Click for copyable input
Out[27]=
Except 可以把模式作为一个变量.
In[28]:=
Click for copyable input
Out[28]=
这里选出所有非0整数.
In[29]:=
Click for copyable input
Out[29]=

Except[c] 在一定意义上是个非常普遍的模式:它与除了 c 以外的 任意表达式 匹配. 在许多情况下,我们需要使用Except[c, patt],其工作原理是从匹配 patt 的表达式开始,并且排除与 c 匹配的表达式.

New to Mathematica? Find your learning path »
Have a question? Ask support »