日安,
当我试图用标准的Trace和TraceScan命令来理解数学的计算序列时,以及它们在最近的线程中开发的良好的可视化表示,我在它们的行为上遇到了一些不明确的地方。
首先,当我评估
In1:= Tracea+1,TraceOriginal>True
我得到了
Out1= {a+1,{Plus},{a},{1},a+1,1+a,{Plus},{1},{a},1+a}
所有子列表都对应于子评估(如文档中所述)。最后一个表达式1+a可能对应于评估的结果,尽管它在文档中没有明确说明。但是,在列表中间的表达式a+1和1+a到底是什么意思呢?它们对应于标准评价序列的哪些评估步骤?
第二个奇怪之处是TraceScan。请考虑以下几点:
In1:= list={};TraceScan[AppendTo[ list,StyleForm#,"Input"]&,(a+1),_,AppendTolist,#&] Out1= {a+1、 Plus 、Plus、 a 、a、 1 、1、 1+a
E 222、E 123+e 224、Plus、E 1251E 226、1、E 127aE 228/code>、a、1+a、a+1}
您可以看到列表中的最后两个表达式是1+a和a+1。两者都是(子)评估的结果。但是真正的输出是1+a,所以我不明白为什么a+1在评估链的末尾?为什么在评估链的中间没有a+1,就像Trace一样?是虫子吗?
这些结果用Mathematica 7.0.1和5.2转载。
发布于 2011-04-06 13:52:18
fp参数对TraceScan的调用带有两个参数。第一个是原始的未计算表达式。二是评价结果。在您的示例中,第二个AppendTo使用第一个参数,因此您将看到未计算的表达式。将#更改为#2,然后将看到所期望的结果。
还请注意,第二个参数没有包装在HoldForm中(尽管有文档),因此通常必须注意使用一个为fp参数保存参数的函数,以避免生成虚假的计算。
比较跟踪与TraceScan
Trace的行为在Mathematica 8文档中有相当详细的描述。它指出,默认情况下,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提供了更多信息。
发布于 2011-04-06 08:45:08
问题的第一部分很简单。列表中间的表达式a+1和1+a是Plus的Orderless属性激发的地方,术语按默认顺序排列。这是标准评价序列管中的第8点。
TraceScan中的“奇怪”也发生在版本8中。
TraceScanf、expr、form、fp在计算前应用f,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。它直到结束时才会打印,因为需要首先计算子表达式。
https://stackoverflow.com/questions/5562126
复制相似问题