了解痕迹*

Ale*_*kov 5 wolfram-mathematica

美好的一天,

当试图通过使用标准和命令以及他们在最近的线程中开发的漂亮的视觉表示来理解Mathematica的评估序列时,我在他们的行为中遇到了一些含糊之处.TraceTraceScan

首先,当我评估时

在[1]中:=跟踪[a + 1,TraceOriginal-> True]

我明白了

Out [1] = {a + 1,{Plus},{a},{1},a + 1,1 + a,{Plus},{1},{a},1 + a}

所有子列表都对应于子评估(如文档中所述).最后一个表达式1+a可能对应于评估结果,尽管文档中没有明确说明.但究竟是什么意思表达式a+11+a列表中间?它们对应的标准评估序列的评估步骤是什么?

第二个奇怪的是TraceScan.考虑以下:

在[1]中:= list = {}; TraceScan [AppendTo [列表,StyleForm [#, "输入"]],(A + 1),_,AppendTo [列表,#]]; 名单

OUT [1] = { A + 1,,另外,,一,1,1,1 +α,,另外,1,1,,一,1 + A,A + 1}

您可以看到列表中的最后两个表达式是1+aa+1.两者都是(子)评估的结果.但真正的输出是1+a,所以我不明白为什么a+1在评估链的末尾?为什么a+1在评估链的中间没有像在它的情况那样Trace?这是一个错误吗?

PS这些结果用Mathematica 7.0.1和5.2 复制.

WRe*_*ach 3

fp的参数是TraceScan用两个参数调用的。第一个是原始的未计算表达式。二是评估结果。在您的示例中,第二个AppendTo参数使用第一个参数,因此您会看到未计算的表达式。更改##2然后您将看到您期望的结果。

另请注意,第二个参数包装在其中HoldForm(尽管有文档),因此通常必须注意使用保存参数参数的函数,fp以避免生成虚假计算。

比较 Trace 和 TraceScan

Mathematica 8 文档中对 的行为Trace进行了相当详细的描述。它指出,默认情况下,仅在计算头和参数显示表达式。因此,我们看到这样的序列:Trace

In[28]:= SetAttributes[f, Orderless]
         Trace[f[a, 1]]
Out[29]= {f[a,1],f[1,a]}
Run Code Online (Sandbox Code Playgroud)

仅显示输入表达式及其结果。选项TraceOriginal控制(引用)“是否在计算头和参数之前查看表达式”。当使用此选项时,True输出将补充头部和参数表达式:

In[30]:= Trace[f[a,1], TraceOriginal->True]
Out[30]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]}
Run Code Online (Sandbox Code Playgroud)

新列表的第一个元素是计算头和参数之前的原始表达式。然后我们看到头部和参数正在被评估。最后,在计算头和参数之后,我们再次看到顶级表达式。列表的最后两个元素与原始跟踪输出的两个元素匹配。

正如链接文档所述,Trace它对于返回的表达式非常有选择性。例如,它完全省略了琐碎的评估链。 TraceScan是全面的,并且为每个评估(无论是否琐碎)调用所提供的函数。您可以使用以下TraceScan表达式查看完整的评估集:

TraceScan[Print, f[a,1], _, Print[{##}]&]
Run Code Online (Sandbox Code Playgroud)

Trace下表匹配了with 和 without生成的输出TraceOriginal以及表达式的输出TraceScan

Trace   Trace    TraceScan
        Original

        f[a,1]   f[a,1]
                 f
        {f}      {f
                 ,f}
                 a
        {a}      {a
                 ,a}
                 1
        {1}      {1
                 ,1}
                 f[1,a]
                 {f[1,a]
                 ,f[1,a]}
f[a,1]  f[a,1]   {f[a,1]
f[1,a]  f[1,a]   ,f[1,a]}
Run Code Online (Sandbox Code Playgroud)

考虑到 的内部结构是Trace不可访问的,该表中存在一定量的关于哪个条目与哪个条目匹配的猜测。进一步的实验可能会提供调整对齐的信息。然而,关键是,生成的所有信息都Trace可以使用TraceScan- 并TraceScan提供更多信息。