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

2.5.6 模式、规则和定义中的计算

模式匹配和计算有重要的关系,首先看到模式匹配是在至少有部分计算出的表达 式上进行的,所以与这些表达匹配的模式也应该进行计算.

计算模式表明它与给出的表达式匹配

条件 /; 右端仅匹配过程中使用时才计算

有时需要保持模式或模式的一部分不计算,这可以用 HoldPattern 包装不需要 计算的这一部分.在模式匹配中,HoldPattern[patt] 等价于 patt,但 表达式patt 保持被计算的形式.

防止模式被计算

HoldPattern 使 1+1 不计算,并将它与 /. 左端的 1+1 匹配

注意 Hold 等函数禁止对表达式进行计算,但它们不影响对有 /. 和其它一些 运算的表达式的项的操作.

当其变量不是原子形式时定义 r 的值

由这一定义,表达式 r[3] 等不变

而根据 r 的定义模式 r[x_] 变化

需要用 HoldPattern 包装 r[x_] 去禁止它被计算

lhs -> rhs 等变换规则的左端通常是立即计算的,其原因是这些规则作用的 表达式已经被计算出来了. lhs -> rhs 的右端也是立即计算出来的,但使用延 迟规则 lhs :> rhs 可以使表达式 rhs 不计算.

-> 中,右端立即计算,而在 :> 中,右端不立即计算

使用规则的结果是 :> 的右端放在 Hold 中,没有被计算

变换规则的计算

变换规则的左端常被计算,而定义的左端通常不计算,这个差异的原因在于 变换规则一般是将 /. 用到已经计算出来的表达式上,而定义用在计算过程中, 且作用于没有完全计算出来的表达式上. 要作用于这些表达式上,定义的左端至少 是部分地未被计算.
符号的定义是一个最简单的情况,x=value 等定义左端的符号未计算. 如果 x 在前面已经给赋值 y,且 x=value 要计算出的话,就会出现 y=value 的情形.

此定义中左端的符号没有计算

重新定义这一符号

如果计算了左端,定义的不是 k,而是 k 的值 w[4]

现在看到 w[4] 的值为 w[5]

尽管在定义左端出现的单个符号不计算,但复杂的表达式则部分地 被计算,在定义左端的表达式 f[args] 中,args 已被计算.

已计算出 1+1,故定义的是 g[2]

这里显示 g 的值

通过考察表达式计算过程中定义的使用,就会理解为什么出现在定义左端 函数的变量被计算.如 2.5.1 节所述,求一个函数的值时,Mathematica 先计算它的每个变量,然后再查找函数的定义,于是当 Mathematica 使用一个函数 的定义时,它的变量在此以前计算出来. 这里的例外是有些函数具有 其变量不被计算的属性.

定义中的计算

大部分情况下需要求定义左端函数的变量,但有时也不需要计算出它们, 此时可以用 HoldPattern 封装不需要计算的那些项即可.