首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解痕迹*

理解痕迹*
EN

Stack Overflow用户
提问于 2011-04-06 06:08:42
回答 2查看 550关注 0票数 5

日安,

当我试图用标准的TraceTraceScan命令来理解数学的计算序列时,以及它们在最近的线程中开发的良好的可视化表示,我在它们的行为上遇到了一些不明确的地方。

首先,当我评估

In1:= Tracea+1,TraceOriginal>True

我得到了

Out1= {a+1,{Plus},{a},{1},a+1,1+a,{Plus},{1},{a},1+a}

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

第二个奇怪之处是TraceScan。请考虑以下几点:

In1:= list={};TraceScan[AppendTo[ list,StyleForm#,"Input"]&,(a+1),_,AppendTolist,#&] Out1= {a+1 Plus 、Plus、 a 、a、 1 、1、 1+a E 222E 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转载。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-06 13:52:18

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

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

比较跟踪与TraceScan

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

代码语言:javascript
复制
In[28]:= SetAttributes[f, Orderless]
         Trace[f[a, 1]]
Out[29]= {f[a,1],f[1,a]}

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

代码语言:javascript
复制
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表达式查看全面的评估集:

代码语言:javascript
复制
TraceScan[Print, f[a,1], _, Print[{##}]&]

下表与Trace与不带TraceOriginal的输出以及TraceScan表达式的输出相匹配:

代码语言:javascript
复制
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提供了更多信息。

票数 3
EN

Stack Overflow用户

发布于 2011-04-06 08:45:08

问题的第一部分很简单。列表中间的表达式a+11+aPlusOrderless属性激发的地方,术语按默认顺序排列。这是标准评价序列管中的第8点。

TraceScan中的“奇怪”也发生在版本8中。

TraceScanf、expr、form、fp在计算前应用f,fp后应用于计算表达式。

请注意,如果将其应用于表达式a + 1 + b,则会得到

代码语言:javascript
复制
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。它直到结束时才会打印,因为需要首先计算子表达式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5562126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档