Wolfram mathematica 关于TraceScan的问题
这个问题的要点是Wolfram mathematica 关于TraceScan的问题,wolfram-mathematica,Wolfram Mathematica,这个问题的要点是TraceScan的第一个参数操作背后的逻辑(以及相关的第四个参数,但这不是问题所需要的):它有时会排除一些评估步骤(使用选项TraceOriginal->True跟踪)但有时也包括它们,如以下示例所示。我感兴趣的是理解这种行为背后的逻辑,以及如何强制TraceScan给出完整的评估步骤。这个问题最初出现在线程中(见我对答案的评论)。FREACH对TraceScan与Trace的行为进行了总体比较,但并未回答以下问题: 1.TraceScan为什么不在这里给出最后的表达式f[a,
TraceScan
的第一个参数操作背后的逻辑(以及相关的第四个参数,但这不是问题所需要的):它有时会排除一些评估步骤(使用选项TraceOriginal->True
跟踪)但有时也包括它们,如以下示例所示。我感兴趣的是理解这种行为背后的逻辑,以及如何强制TraceScan
给出完整的评估步骤。这个问题最初出现在线程中(见我对答案的评论)。FREACH对TraceScan
与Trace
的行为进行了总体比较,但并未回答以下问题:
1.TraceScan
为什么不在这里给出最后的表达式f[a,1]
跟踪时的大小写给出:
In[1]:= SetAttributes[traceScan,HoldAll];
traceScan[expr_]:=(list={};TraceScan[AppendTo[list,#]&,expr];list)
In[3]:= ClearAll[f,a];
Trace[f[a,1],TraceOriginal->True]
Out[4]= {f[a,1],{f},{a},{1},f[a,1]}
In[5]:= ClearAll[f,a];
traceScan[f[a,1]]
Out[6]= {f[a,1],f,a,1}
2.)在以下情况下,为什么Trace
和TraceScan
都给出
最终表达式f[1,a]
wheras onlyTrace
给出中间表达式
f[a,1]
对应于应用f
的Orderless
属性之前的评估步骤:
In[7]:= ClearAll[f,a];
SetAttributes[f,Orderless]
Trace[f[a,1],TraceOriginal->True]
Out[9]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]}
In[12]:= ClearAll[f,a];
SetAttributes[f,Orderless]
traceScan[f[a,1]]
Out[14]= {f[a,1],f,a,1,f[1,a]}
3.)为什么在最后一种情况下,Trace
和TraceScan
都给出了最终结果
表达式ff[1,b]
和中间表达式ff[b,1]
,它对应于应用ff
的Orderless
属性之前的求值步骤:
In[21]:= ClearAll[f,ff,a];
SetAttributes[ff,Orderless];f=ff;a=b;
Trace[f[a,1],TraceOriginal->True]
Out[23]= {f[a,1],{f,ff},{a,b},{1},ff[b,1],ff[1,b]}
In[24]:= ClearAll[f,ff,a];
SetAttributes[ff,Orderless];f=ff;a=b;
traceScan[f[a,1]]
Out[26]= {f[a,1],f,ff,a,b,1,ff[b,1],ff[1,b]}
4.)是否有办法强制TraceScan
始终提供详尽的信息
有关跟踪
所做评估的信息
此外
下面是另一个信息量更大的traceScan
版本,它使用了第四个参数:
SetAttributes[traceScan, HoldAll];
traceScan[expr_] := (list1 = list2 = {};
TraceScan[AppendTo[list1, #] &, expr, _,
AppendTo[list2, {##}]&];
Column[{list1, list2}])
案例1和案例2。引用:
通常<代码>跟踪
仅在函数之后截取表达式
已对参数进行了评估。通过设置TraceOriginal->True
,您可以
还可以获取跟踪
以查看函数之前的表达式
已对参数进行了评估
似乎设置TraceOriginal->True
只会导致在Trace
的默认输出中预先添加附加信息。因此,我们看到了不必要的额外“中间表达式”f[a,1]
,在这两种情况下,它实际上不会出现在计算链中,如TraceScan
和TracePrint
所示:
In[1]:= ClearAll[f, a];
SetAttributes[f, Orderless]
TracePrint[f[a, 1]]
During evaluation of In[1]:= f[a,1]
During evaluation of In[1]:= f
During evaluation of In[1]:= a
During evaluation of In[1]:= 1
During evaluation of In[1]:= f[1,a]
Out[3]= f[1, a]
所以它看起来像是跟踪中的一个bug
案例3。在这种情况下,一切都按预期进行,因为中间表达式ff[b,1]
确实出现在计算链中,这是应用与f
相关的定义的结果。没什么意外
结论。无论是Trace
还是TraceScan
都提供了有关评估链的详尽信息,但是Trace
生成的输出可能还包含误导性的“中间表达式”,实际上只是链的初始表达式