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 only
Trace
给出中间表达式
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
生成的输出可能还包含误导性的“中间表达式”,实际上只是链的初始表达式