Mathematica 9 is now available

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 封装不需要计算的那些项即可.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.