此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.1)

2.3.5 限制模式

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

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

定义 fac,其自变量必为正

fac 的自变量为正时才计算

给出列表中的负值元素

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

要求自变量为正的另一种定义方式

自变量为正的阶梯函数

运算符 /; 可以用来限制运算规则的使用范围. 典型的情况是先定义与很广 泛的一类表达式匹配的模式,然后再给出一些数学上的限制使其作用于较少 的一类表达式上.

这一规则仅适用具有 v[x_, 1 - x_] 结构的表达式

此表达式的结构可以用上面的规则

此表达式的数学形式正确,但结构不一致,故无法使用前面的规则

此规则适用于任何形如 w[x_, y_] 的表达式,但要 求 y Equal 1 - x

新规则不能用于这一表达式

在定义模式或规则时,可以把 /; 放在不同的位置.例如可以将 /; 放在规则 的右端,其形式为 lhs :> rhs /; condition ,也可以将/;放在左端, 其形式为lhs /; condition -> rhs, 还可以把它插在表达式 lhs 的中间. 但要注意在指定条件中使用的模式名称必须在该条件涉及的模式中出现,否则 在判断条件是否成立的过程中所使用的名称就不一定限制在与模式匹配的表达式值之中, 而会使用一些全局变量.
例如,在 f[x_, y_] /; (x + y < 2) 的条件中将使用与 f[x_, y_] 匹配的 xy 的值,而在 f[x_ /; x + y < 2, y_] 的条件中将用一个全局变量 y 的值,而不是与模式匹配的 y 值
当确信适当的名称定义了之后,通常将条件/; 放在一个模式可能最小的项 上是最有效的,因为 Mathematica 逐块对模式进行匹配,一但发现条件不成立, 就不再进行匹配.

/; 放在 x_ 模式后有效

在这种情况下需要加括号

通常用 /; 使模式和变换规则使用到具有某一性质的表达式上,在 Mathematica 中有一类函数去测试表达式的性质,这类函数后有一个Q.

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

对集合中的数字用变换规则

此定义仅适用于整数向量

上面的定义仅能用于第一个元素

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

4561 是个整数,所以其返回值为 True

因为 x 不是一个整数,故返回值为 False

有时可以给测试函数赋值. 例 x /: IntegerQ[x] = True , 则 Mathematica 就认为 x 是一个整数. 此时,如果使用测试函数 IntegerQ[x] 得到的值为 True. 然而 Mathematica 不能进行函数的传递,IntegerQ[x^2] 的值就不一定是 True. 必须调用 Mathematica 中的程序包来实现这种功能.

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

"Equal" 意味着方程保持着符号形式,当表达式不同时, "Equal=" 输出 False

n 不在集合 {x, x^n}

尽管 {x, x^n} 中含有 n,但结果仍为 False

可以用 FreeQ 来定义 h 的一个线性运算

h 中移出不含 x 的项

限制模式的另一种方法

 通过所涉及模式名满足的条件确定是否可以匹配,  表达式的值来确定是否可以匹配, 用 ?/; 更方便.

NumberQ 作匹配的条件

p 的变量为数值时才进行运算

更复杂的定义不要忘了函数两边的括号

该定义仅在一些情况下有效