2011-04-06 81 views
5

好日子,了解跟踪*

当试图通过使用标准TraceTraceScan命令及其漂亮的视觉表现在最近thread发展到了解数学的评价程序,我遇到了一些含糊其行为。

首先,当我评价

在[1]:=跟踪并[a + 1,TraceOriginal->真]

我得到

缺货[ 1] = {a + 1,{Plus},{a},{1},a + 1,1 + a,{Plus},{1},{a},1 + a}

所有子列表都对应于子评估(如文档中所述)。最后一个表达式1+a可能与评估结果相对应,尽管在文档中没有明确说明。但究竟是什么意思表达式a+11+a在列表中间? the standard evaluation sequence对应哪些评估步骤对应?

第二个奇怪的是与TraceScan。考虑以下内容:

In [1]:= list = {}; TraceScan [AppendTo [list,StyleForm [#,“Input”]] &,(a + 1),_,AppendTo [list,#] &];列表

输出[1] = {一个+ 1,另外,一个,一个,,1,1 +一个,另外,,1,一个,一,1 + A,A + 1}

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

P.S.这些结果转载于Mathematica 7.0.1和5.2。

+0

我认为这应该迁移到:http://math.stackexchange.com/ – RobertPitt 2011-04-06 07:03:33

+2

@RobertPitt这个问题不是关于数学。它只与* Mathematica *的内部相关。正如你所看到的,我尽可能使用原始的例子:当'a'未定义时,在* Mathematica *中评估表达式'a + 1'。我正在尝试理解* Mathematica *内部发生的事情,当我评估这个时。这似乎并不像预期的那么简单...... – 2011-04-06 07:55:31

+1

@RobertPitt这是一个常见的误解。标签Mathematica是指由Wolfram Research Inc.开发的Mathematica程序。它不等同于_Mathematics_或_math_。另见http://meta.stackexchange.com/q/81152/158668。 – 2011-04-06 08:59:59

回答

3

TraceScanfp参数是用两个参数调用的。首先是最初的未评价表达。第二个是评估的结果。在你的例子中,第二个AppendTo正在使用第一个参数,所以你看到了未评估的表达式。将#更改为#2,然后您会看到您期望的结果。

还要注意,第二个参数是包裹在HoldForm(文档尽管),所以一般必须小心使用,其保持它的参数为fp参数以避免产生伪评价的功能。

Trace和TraceScan

Trace的行为相当详细的描述Mathematica 8 documentation比较。它指出,默认情况下,Trace仅在之后显示表达式头部和参数已被评估。于是,我们看到这样一个序列:

In[28]:= SetAttributes[f, Orderless] 
     Trace[f[a, 1]] 
Out[29]= {f[a,1],f[1,a]} 

只有输入表达式,并将其结果被示出。 TraceOriginal选项控制(引号)“是否在评估其头部和参数前查看表达式”。当这个选项是True则输出补充有头部和参数表达式:

In[30]:= Trace[f[a,1], TraceOriginal->True] 
Out[30]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]} 

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

正如链接文档所述,Trace对返回的表达式非常有选择性。例如,它完全省略了简单的评估链。 TraceScan是全面的,并为每次评估调用提供的功能,无论是否微不足道。您可以使用以下TraceScan表达看到一整套评价:

TraceScan[Print, f[a,1], _, Print[{##}]&] 

下表按Trace有和没有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]} 

由于Trace的内部是无法访问的,所以在这个表中有一定的推测是哪个条目匹配。进一步的实验可能会提供调整对齐的信息。但关键是Trace生成的所有信息都可以使用TraceScan - 而TraceScan提供的信息更多。

+0

“TraceScan”的输出仍然有些奇怪。评估'list1 = {}; list2 = {}; TraceScan [AppendTo [list1,#]&,(a + 1),_, AppendTo [list2,#1]&];'给出两个不同的列表:{a + 1,Plus,a,1,1 + a ,Plus,1,a}'和'{Plus,a,1,Plus,1,a,1 + a,a + 1}'... – 2011-04-06 21:50:15

+1

@Alexey这两个列表通常会有所不同。考虑'Plus',它是第二个要评估的表达式(出现在'list1'的第二个表达式中),但它是第一个完成评估的表达式(在list2中出现的第一个表达式)。同样,“a + 1”是要评估的第一个表达式,但评估完成的最后一个表达式。匹配评估的开始和结束是一件棘手的事情。 [traceView2](http://stackoverflow.com/questions/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117)使用堆栈来执行此匹配。 – WReach 2011-04-06 23:46:59

+0

@WReach非常清楚的解释,谢谢!唯一的问题是关于Trace [a + 1,TraceOriginal-> True]和'list = {}的输出之间的差异; TraceScan [AppendTo [list,#]&,a + 1]; list'。第一个返回一个包含中间两个表达式的列表:'a + 1'和'1 + a'。其中第一个看起来与应用“Orderless”属性之前的评估序列*的中间步骤相对应,第二个是应用此属性的结果。这样对吗?但是在TraceScan的情况下,我找不到应用这个属性的步骤。 – 2011-04-07 06:53:12

3

问题的第一部分很简单。 在列表中间的表达式a+11+aOrderless属性Plus触发的情况,并且该条款按默认顺序排列。 这是standard evaluation sequence tute中的第8个点。

TraceScan中的“奇怪”也出现在版本8中。 因为,这是一个难得的命令,这里是为TraceScan

TraceScan文档[F,EXPR,形式,FP]将f 后 评价在expr的 评价使用的词句评价和FP前。

请注意,如果你把它应用到表达a + 1 + b

In[32]:= TraceScan[Print["f \t",#]&, a+1+b, _, Print["fp\t",#]&] 
During evaluation of In[32]:= f  a+1+b 
During evaluation of In[32]:= f  Plus 
During evaluation of In[32]:= fp Plus 
During evaluation of In[32]:= f  a 
During evaluation of In[32]:= fp a 
During evaluation of In[32]:= f  1 
During evaluation of In[32]:= fp 1 
During evaluation of In[32]:= f  b 
During evaluation of In[32]:= fp b 
During evaluation of In[32]:= f  1+a+b 
During evaluation of In[32]:= fp 1+a+b 
During evaluation of In[32]:= fp a+1+b 
Out[32]= 1+a+b 

从这里,很明显发生了什么。 fp适用于评估 - 所以最终的fp实际上对应于第一个f。它直到最后才打印,因为子表达式需要先评估。

+0

你对TraceScan行为的解释对我来说并不明显。我需要更简洁的例子来找到这种行为的逻辑。特别是,'Trace [a + 1 + b,TraceOriginal - > True]给出了{a + 1 + b,{Plus},{a},{1},{b},a + 1 + b,1 + A + b}'。你的意思是第二个'a + 1 + b'是评估的结果吗?但在应用'Orderless'属性之前,它应该只是一个中间表达式。评估结果为“1 + a + b”。 – 2011-04-06 09:36:34

+0

我不知道该怎么解释它(可能是因为我不太清楚为什么最后的'fp'有它没有评估过的形式)。无论如何,与TraceScan文档修改的例子相比较:TraceScan [Print [“f \ t”,#]&,f [1,2 + 3],_,Print [“fp \ t”,#] &]' – Simon 2011-04-06 10:01:29

+0

谢谢你以任何方式回答。现在我理解'Trace'输出中'Orderless'属性的应用位置。唯一的问题仍然是关于“TraceScan”的行为。 – 2011-04-06 10:46:55