gpt4 book ai didi

wolfram-mathematica - 在Mathematica的Hold中评估超过一个级别

转载 作者:行者123 更新时间:2023-12-04 07:12:44 26 4
gpt4 key购买 nike

关于评估可能出现的问题的mathematica文档说:

Evaluate works only on the first level, directly inside a held function



为什么Mathematica有此限制?因此,如果我的表达式具有多个层次,请使用以下简化示例:

按住[加号[加号[加号[2,2],2]]]

现在,假设我想看看第二个Plus的答案是什么,而无需评估低于它的水平上的任何东西。我尝试了不同的方法,例如:
In[290]:= Hold[Plus[Evaluate[Plus[2, 2]], 2]]
Out[290]= Hold[Evaluate[2+2]+2]

In[287]:= Hold[Plus[ReleaseHold[Hold[Plus[2, 2]]], 2]]
Out[287]= Hold[ReleaseHold[Hold[2+2]]+2]

在这种情况下,首次保留会使所有内容均处于和超出第一级的状态。
目标是使用连续的Hold,ReleaseHold和Evaluate函数来控制从最内部的嵌套函数到外部的每个阶段的表达式评估。我知道我可以使用trace来查看表达式中超出第一级的情况,但这是不同的,有时使用较长的表达式读取有时会很复杂。

似乎唯一的方法是使用“提取”,“部分”或“级别”将表达式提取并完全分解为列表。评估我想要的表达的一部分;然后针对每个阶段重新构建并重新映射表达式。我是否可以考虑采用其他方法或功能来实现这一目标?

编辑:这可能是一个更好的示例,以查看释放第一个保留的方法。带有表达式:
Hold[Plus[Plus[2, Plus[2,2]], 2]]]

如果释放第一个保留并在第三个Plus的表达式中将保留置于较高的级别,则如下所示:
in = Plus[Plus[2, Hold[Plus[2,2]]], 2]]]
out = Hold[2+2]+4

您发现当您真正希望Mathematica等待时,它将在后台评估较低的级别。

最佳答案

我无法给出Evaluate“仅在第一个级别上直接在保留函数内工作”的确切原因,但我怀疑这部分有效,因为如果评估者必须扫描保留参数的完整表达式树,它将很慢传递给具有Hold*属性的任何函数用于嵌套Evaluate表达式并对其求值,然后递归并在其刚刚求值的表达式中查找Evaluate子表达式,同时保持表达式的其余部分不求值,尤其是当这不一定总是您想要的表达式时反正发生。

但是,结合使用ExtractReplacePart,可以轻松完成您想要的操作:

In[51]:= expr = Hold[Plus[Plus[2, 2], 2]];

In[52]:= ReleaseHoldAt[expr_, partspec_] :=
ReplacePart[expr, partspec -> Extract[expr, partspec]]

In[53]:= ReleaseHoldAt[expr, {1, 1}]

Out[53]= Hold[4 + 2]

这让我们说明了另一个原因,考虑到以下涉及 Evaluate的表达式,为什么 Hold*在作为参数传递给具有 i属性的函数的表达式中的任何级别上都无法正常工作:
In[82]:= i = 1;

In[83]:= ReleaseHoldAt[Hold[i = 2; j = Plus[i, i]], {1, 2}]

Out[83]= Hold[i = 2; 2]

请注意,如果我们在 j之前评估了表达式的第一部分,则 4的值将为 Plus,但结果有所不同,因为我们仅进行部分评估,而在评估子表达式设置 i=2时未评估 j。 。有时,这可能就是您想要发生的情况,但通常却并非如此。

请记住,即使是第一级的 Evaluate,也可以通过具有 HoldAllComplete属性的函数或使用 HoldComplete来打败:
In[62]:= Hold[Evaluate[Plus[2,2]]]
Out[62]= Hold[4]

...相对:
In[63]:= HoldComplete[Evaluate[Plus[2,2]]]
Out[63]= HoldComplete[Evaluate[2+2]]

最后, Trace的输出可能有点密集,但是您可以通过在第二个参数中使用感兴趣的模式或符号来过滤出所需的内容:
In[88]:= Trace[Plus[Plus[Plus[1,2],3],4],Plus]
Out[88]= {{{1+2,3},3+3,6},6+4,10}

In[93]:= Trace[Plus[Subtract[Plus[1,2],4],8],_Plus]
Out[93]= {{{1+2}},-1+8}

HTH!

关于wolfram-mathematica - 在Mathematica的Hold中评估超过一个级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3136604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com