你如何解释Mathematica中的负面水平?

Tod*_*len 14 wolfram-mathematica

我试图更深入地了解Mathematica表达式如何在内部表示,并且对LevelMathematica 中的命令逻辑感到困惑.如果我们有以下输入:

In[1]:= a = z*Sin[x + y] + z1*Cos[x1 + y1]

Out[1]= z1 Cos[x1 + y1] + z Sin[x + y]

In[2]:= FullForm[a]

Out[2]= Plus[Times[z1,Cos[Plus[x1,y1]]],Times[z,Sin[Plus[x,y]]]]

In[3]:= TreeForm[a]
Run Code Online (Sandbox Code Playgroud)

我们得到以下树:

树形式的表达式a,上面

如果我们要求Mathematica仅返回4级,我们会得到:

In[4]:= Level[a,{4}]
Out[4]= {x1,y1,x,y}
Run Code Online (Sandbox Code Playgroud)

据我所知,我们比"词干"(0级的Plus运算符)低4级.事实上,我认为我理解正面索引始终与树的茎位置有关.(我希望我这是正确的??)

相反,当你要求负水平时,没有共同的参考点(如上面的干),因为树的不同分支具有不同的长度.所以,如果你要求Mathematica只提供Level -1,我们得到:

In[6]:= Level[a,{-1}]
Out[6]= {z1,x1,y1,z,x,y}
Run Code Online (Sandbox Code Playgroud)

当我猜到我应该回来{x1, y1, x, y}(没有z1&z)时,我对这个输出感到惊讶.但好吧,如果我试着理解这一点,我会把-1代表"每个分支的结尾".如果是这样,那么我期望Level[a,{-2}]返回:

{z1*Cos[x1+y1],z*Sin[x+y],x1+y1,x+y}
Run Code Online (Sandbox Code Playgroud)

但是,这不是我得到的,Mathematica收益:

In[8]:= Level[a,{-2}]
Out[8]= {x1+y1,x+y}
Run Code Online (Sandbox Code Playgroud)

所以,现在我很困惑,并没有看到一致的方式来理解负面水平的输出.

是否有一致,简单的方式来理解这个主题?是否有某种"正确"的方式我应该阅读树的结构?

对于"冗长的问题"感到抱歉,但我希望你明白我在问什么.

Sza*_*lcs 14

如果你查看文档,他们会说:

负级别-n由expr的所有部分组成,深度为n.

所以负面水平不是从参考点计算的,而是根据子表达的深度来定义的. z1*Cos[x1+y1]深度为4,所以当你要求它时它不会被返回Level[..., {-2}].

  • 简洁明了 - +1.我补充一点,那个没有花括号的级别规范(比如`Level [expr,-d]`描述深度*至少*`d`的所有子表达式,相当于`Level [expr,{1 ,-d}]`.这允许我们以非平凡的方式组合正面和负面的水平.例如,这个:"Level [a,{2,-2}]`将仅在下面的级别上返回子表达式包括级别"2",*和*,深度*至少为*`2`. (7认同)