标准运算过程

本节描述 Wolfram 系统计算表达式的标准过程,该过程适用于大部分表达式. 但用来表示 Wolfram 系统程序和控制结构等一些类型的表达式不按标准方式处理.

在标准计算过程中,Wolfram 系统先计算表达式的头部,然后再计算表达式的元素. 这些元素本身也是表达式,其计算过程也是这样递推地进行.

3个 Print 函数逐个处理,打印出它们的自变量,返回值为 Null.
In[1]:=
Click for copyable input
Out[1]=
把符号 设置为 Plus.
In[2]:=
Click for copyable input
Out[2]=
光处理头部 ,所以这个表达式就是求几项之和.
In[3]:=
Click for copyable input
Out[3]=

当 Wolfram 系统处理完一个表达式的头部以后,它就判断该头部是否是具有一定属性的符号. 如果该符号具有 OrderlessFlatListable 属性,则在处理完表达式的元素后,Wolfram 系统立即进行与这些属性有关的变换.

标准计算过程的下一步就是用 Wolfram 系统已知的定义对表达式进行计算. Wolfram 系统先使用用户给出的定义,如果没有合适的用户定义可用,它就试用内部的定义.

当 Wolfram 系统找到一个可用的定义后,它就对表达式进行相应的变换. 其结果仍然是一个表达式,这个表达式再按标准计算过程进行处理.

计算表达式的头部.
依次计算表达式的每个元素.
使用与属性 OrderlessListableFlat 相关的变换规则.
使用已经给出的定义.
使用内部定义.
计算出结果.

标准计算过程.

"计算原理" 节所述,Wolfram 系统遵循的原则是将一个表达式一直计算到没有定义可用为止,这意味着 Wolfram 系统反复进行计算直到结果不再变化为止.

下面是一个显示标准计算过程的例子,其中我们取 .

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]计算了 以后的结果
49Power 的内部定义给出这一结果
Plus[Times[14,x],49,1]这是 Plus 的自变量被计算出以后的结果
Plus[50,Times[14,x]]调用 Plus 的内部定义进行计算
50+14x输出计算结果

Wolfram 系统计算的一个简单例子.

Wolfram 系统提供了跟踪计算过程的一些方法,正如 "计算的跟踪" 中讨论的. 函数 Trace[expr] 给出了显示计算过程中产生的子表达式的嵌套列表.(注意,标准计算过程采用深度优先方式遍历表达式树,因此表达式最小的子部分首先出现在 Trace 的结果中.)

首先令 等于 .
In[4]:=
Click for copyable input
Out[4]=
这里给出了计算过程中所产生的子表达式的嵌套列表.
In[5]:=
Click for copyable input
Out[5]=

Wolfram 系统中适合不同定义的顺序是十分重要的. Wolfram 系统在内部定义之前使用你所给出的定义,这意味着用户给出的定义超越内部定义,在 "修改内部函数" 节中有详细的讨论.

这表达式用内部定义 ArcSin 计算.
In[6]:=
Click for copyable input
Out[6]=
可以自己给出 ArcSin 的定义,但必须先清除保护属性.
In[7]:=
Click for copyable input
在内部定义之前使用了刚给出的定义.
In[8]:=
Click for copyable input
Out[8]=

"与不同符号相关的定义" 节的讨论知道,可以把符号与定义通过上值或下值联系起来. Wolfram 系统在下值之前试用上值.

对表达式 有两种定义方式:f 的下值或 g 的上值. Wolfram 系统在与 f 有关的定义之前试用与 g 有关的定义.

这一顺序遵循特殊定义在一般定义之前使用的原则. 通过在与函数有关的下值之前使用与变量有关的上值,Wolfram 系统允许定义一些能超越一般函数的特殊变量.

这里定义了 有关的一个规则.
In[9]:=
Click for copyable input
这里定义了 有关的一个规则.
In[10]:=
Click for copyable input
有关的规则先于与 有关的规则而使用.
In[11]:=
Click for copyable input
Out[11]=
删除了与 有关的规则后,就使用与 有关的规则.
In[12]:=
Click for copyable input
Out[12]=
在表达式 中,与 g 有关的规则在与 f 有关的规则之前使用.

定义使用的顺序.

Plus 等大部分 Wolfram 系统的内部函数有下值. 然而,一些 Wolfram 系统的内部对象也有上值. 例如,表示幂级数的SeriesData 对象对各种数学运算有内部定义的上值.

等表达式在标准运算过程中试用的所有定义的顺序为:

  • 用户给出的与 g 有关的定义;
  • g 有关的内部定义;
  • 用户给出的与 f 有关的定义;
  • f 有关的内部定义

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

有关的 对象的复合.
In[13]:=
Click for copyable input
有关的复合的一般规则.
In[14]:=
Click for copyable input
给出两个对象 时,与 有关的规则就被使用.
In[15]:=
Click for copyable input
Out[15]=
给出两个 对象时,与 有关的一般规则就被使用.
In[16]:=
Click for copyable input
Out[16]=

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

定义 关于 的上值.
In[17]:=
Click for copyable input
定义 的上值.
In[18]:=
Click for copyable input
使用哪一个上值依赖于 中哪一个变量先出现.
In[19]:=
Click for copyable input
Out[19]=