Wolfram mathematica 嵌套未赋值问题

Wolfram mathematica 嵌套未赋值问题,wolfram-mathematica,Wolfram Mathematica,当模拟RuleDelayed的求值行为时,我遇到了嵌套Unevaluated的意外行为。考虑: In[1]:= f[Verbatim[Unevaluated][expr_]] := f[expr] f[Unevaluated[1 + 1]] f[Unevaluated@Unevaluated[1 + 1]] f[Unevaluated@Unevaluated@Unevaluated[1 + 1]] f[Unevaluated@Unevaluated@Unevaluated@Unevaluated

当模拟
RuleDelayed
的求值行为时,我遇到了嵌套
Unevaluated
的意外行为。考虑:

In[1]:= f[Verbatim[Unevaluated][expr_]] := f[expr]
f[Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated@Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated@Unevaluated@Unevaluated[1 + 1]]

Out[2]= f[Unevaluated[1 + 1]]

Out[3]= f[2]

Out[4]= f[Unevaluated[1 + 1]]

Out[5]= f[2]

可以看到,只有偶数个嵌套的
未赋值的
包装器被完全删除。为什么?

关键在于,在表达式模式匹配之前,有效地删除了一层。从:

f[Unevaluated[expr]]
有效工作 通过临时将属性设置为
f
保持其参数未赋值, 然后计算
f[expr]

因此,在第一种情况下,
f[Unevaluated[1+1]]
被评估为
f[1+1]
,但在模式匹配期间保持未评估状态,即使
f
缺少
Hold*
属性,并且由于没有匹配的
f[1+1]
,原始表达式(预模式匹配)返回未评估状态

在第二种情况下,
f[Unevaluated[1+1]]]
在模式匹配器中计算为
f[Unevaluated[1+1]]
,它与
f
的模式匹配,然后递归计算
f[1+1]
,从而得到
f[2]

在第三种情况下,
f[Unevaluated[Unevaluated[1+1]]]]
计算为
f[Unevaluated[Unevaluated[1+1]]]
,匹配并递归计算为
f[Unevaluated[1+1]]
,我们回到第一种情况

在第四种情况下,
f[Unevaluated[Unevaluated[Unevaluated[1+1]]]]]
f[Unevaluated[Unevaluated[1+1]]]]]
匹配,递归计算
f[Unevaluated[Unevaluated[1+1]]]]
,我们回到第二种情况

使用跟踪查看原因:

In[1]:= f[Verbatim[Unevaluated][expr_]]:=f[expr]

In[2]:= f[Unevaluated[1+1]]//Trace
Out[2]= {f[1+1],f[Unevaluated[1+1]]}
  • 由于定义了
    Unevaluated
    语言构造的特殊属性,
    f[Unevaluated[1+1]]
    的计算方法与
    f[1+1]
    的计算方法相同,只是
    1+1
    没有计算
  • f[1+1]
    与您为
    f
    给出的定义不匹配
  • 因此,
    f[Unevaluated[1+1]]
    保持未评估状态
  • 鉴于:

    In[3]:= f[Unevaluated@Unevaluated[1 + 1]] // Trace
    Out[3]= {f[Unevaluated[1+1]],f[1+1],{1+1,2},f[2]}
    
  • 由于
    Unevaluated
    语言结构的定义特殊属性,
    f[Unevaluated@Unevaluated[1+1]
    的计算方法与
    f[Unevaluated[1+1]]
    类似,只是
    未计算的[1+1]
    未计算
  • f[Unevaluated[1+1]]
    与您为
    f
    给出的定义匹配,并计算为
    f[1+1]
  • 因此
    f[Unevaluated@Unevaluated[1+1]
    计算结果为
    f[2]

  • 哇,我真的比你快了几秒钟(是的!一个小时前的问题真是巧合。总的来说,我更喜欢你的答案。解释得很清楚,谢谢!这两个答案都很好,相互补充,但你的解释以评估者做出的一系列决定的形式更具示意性,更容易记住。所以我接受你的回答。