标准运算过程
本节描述
Mathematica 计算表达式的标准过程,该过程适用于大部分表达式. 但用来表示
Mathematica 程序和控制结构等一些类型的表达式不按标准方式处理.
在标准计算过程中,
Mathematica 先计算表达式的头部,然后再计算表达式的元素. 这些元素本身也是表达式,其计算过程也是这样递推地进行.
| Out[1]= |  |
| Out[2]= |  |
光处理头部

,所以这个表达式就是求几项之和.
| Out[3]= |  |
当
Mathematica 处理完一个表达式的头部以后,它就判断该头部是否是具有一定属性的符号. 如果该符号具有
Orderless、
Flat 或
Listable 属性,则在处理完表达式的元素后,
Mathematica 立即进行与这些属性有关的变换.
标准计算过程的下一步就是用
Mathematica 已知的定义对表达式进行计算.
Mathematica 先使用用户给出的定义,如果没有合适的用户定义可用,它就试用内部的定义.
当
Mathematica 找到一个可用的定义后,它就对表达式进行相应的变换. 其结果仍然是一个表达式,这个表达式再按标准计算过程进行处理.
标准计算过程.
如
"计算原理" 节所述,
Mathematica 遵循的原则是将一个表达式一直计算到没有定义可用为止,这意味着
Mathematica 反复进行计算直到结果不再变化为止.
下面是一个显示标准计算过程的例子,其中我们取

.
| 2ax+a^2+1 | 原来的表达式 |
| Plus[Times[2,a,x],Power[a,2],1] | 该表达式的内部形式 |
| Times[2,a,x] | 先计算这一项 |
| Times[2,7,x] | 被取为7 |
| Times[14,x] | Times 的内部定义给出这一结果 |
| Power[a,2] | 下一步的计算 |
| Power[7,2] | 计算了 以后的结果 |
| 49 | Power 的内部定义给出这一结果 |
| Plus[Times[14,x],49,1] | 这是 Plus 的自变量被计算出以后的结果 |
| Plus[50,Times[14,x]] | 调用 Plus 的内部定义进行计算 |
| 50+14x | 输出计算结果 |
Mathematica 计算的一个简单例子.
Mathematica 提供了"跟踪"计算过程的一些方法,正如
"计算的跟踪" 中讨论的. 函数
Trace[expr] 给出了显示计算过程中产生的子表达式的嵌套列表. (注意,标准计算过程采用深度优先方式遍历表达式树,因此表达式最小的子部分首先出现在
Trace 的结果中.)
首先令

等于

.
| Out[4]= |  |
| Out[5]= |  |
Mathematica 中适合不同定义的顺序是十分重要的.
Mathematica 在内部定义之前使用你所给出的定义,这意味着用户给出的定义超越内部定义,在
"修改内部函数" 节中有详细的讨论.
| Out[6]= |  |
| Out[8]= |  |
由
"与不同符号相关的定义" 节的讨论知道,可以把符号与定义通过上值或下值联系起来.
Mathematica 在下值之前试用上值.
对表达式

有两种定义方式:
f 的下值或
g 的上值.
Mathematica 在与
f 有关的定义之前试用与
g 有关的定义.
这一顺序遵循特殊定义在一般定义之前使用的原则. 通过在与函数有关的下值之前使用与变量有关的上值,
Mathematica 允许定义一些能超越一般函数的特殊变量.
这里定义了

与

有关的一个规则.
这里定义了

与

有关的一个规则.
与

有关的规则先于与

有关的规则而使用.
| Out[11]= |  |
删除了与

有关的规则后,就使用与

有关的规则.
| Out[12]= |  |
• 在表达式 中,与 g 有关的规则在与 f 有关的规则之前使用. |
定义使用的顺序.
Plus 等大部分
Mathematica 的内部函数有下值. 然而,一些
Mathematica 的内部对象也有上值. 例如,表示幂级数的
SeriesData 对象对各种数学运算有内部定义的上值.

等表达式在标准运算过程中试用的所有定义的顺序为:
上值在下值前使用在许多情况下是很重要的. 在定义一个复合运算时,可以定义复合对象的上值,一旦这些对象出现,上值就被使用. 也可以对这个复合给出一个过程,这个过程在没有出现特定对象的情况下使用. 对这一过程可以定义下值,因为下值在上值之后使用,所以仅当所有对象都没有上值时才使用此过程.
与

有关的"

对象"的复合.
与

有关的复合的一般规则.
给出两个对象

时,与

有关的规则就被使用.
| Out[15]= |  |
给出两个

对象时,与

有关的一般规则就被使用.
| Out[16]= |  |
在一个表达式中一般会有几个对象具有上值.
Mathematica 先检查表达式的头部,并试用与它有关的上值,随后检查表达式的每个元素,试用其上值.
Mathematica 先对用户定义的上值,再对内部定义的上值实施这一过程. 该过程意味着,在一系列元素中,先出现元素的上值优于晚出现元素的上值.
定义

关于

的上值.
定义

的上值.
使用哪一个上值依赖于

中哪一个变量先出现.
| Out[19]= |  |