我有以下问题。

f[1]=1;
f[2]=2;
f[_]:=0;

dvs = DownValues[f];

这给
dvs =
   {
      HoldPattern[f[1]] :> 1,
      HoldPattern[f[2]] :> 2,
      HoldPattern[f[_]] :> 0
   }

我的问题是我只想提取f [1]和f [2]等的定义,而不提取一般定义f [_],因此我不知道该怎么做。

我试过,
Cases[dvs, HoldPattern[ f[_Integer] :> _ ]] (*)

但它什么也没给我,即空的 list 。

有趣的是,将HoldPattern更改为临时^脚注
dvs1 = {temporary[1] :> 1, temporary[2] :> 2, temporary[_] :> 0}

并发行
Cases[dvs1, HoldPattern[temporary[_Integer] :> _]]


{temporary[1] :> 1, temporary[2] :> 2}

它的工作原理。这意味着(*)几乎是一个解决方案。

我不明白为什么它在临时模式下而不是在HoldPattern模式下工作?如何使它直接与HoldPattern一起使用?

当然,问题是要评估哪些内容而不是什么。等等。在Mathematica中进行编码时出现的以太坊问题。真正的大师的东西...

最诚挚的问候
佐兰

脚注=我手动键入它作为替换“/。HoldPattern->临时”实际上执行了f [_]:= 0规则并给出了一些奇怪的信息,我当然希望避免这种执行。

最佳答案

原因是您必须使用Verbatim逃避HoldPattern:

In[11]:= Cases[dvs,
            Verbatim[RuleDelayed][
               Verbatim[HoldPattern][HoldPattern[f[_Integer]]], _]]

Out[11]= {HoldPattern[f[1]] :> 1, HoldPattern[f[2]] :> 2}

仅有少数几个是必需的,而HoldPattern是其中之一,正是因为它通常对模式匹配器“不可见”。对于您的temporary或其他头来说,这不是必需的。请注意,将f[_Integer]模式包装在HoldPattern中-这次HoldPattern直接用于其目的-保护该模式免于评估。请注意,RuleDelayed也包装在Verbatim中-这实际上是Verbatim的另一种常见情况-这是必需的-因为Cases具有涉及规则的语法,我们不希望Cases在此使用此解释。因此,这是IMO一个很好的整体示例,可以说明HoldPatternVerbatim
还请注意,可以使用HoldPattern完全实现目标,如下所示:
In[14]:= Cases[dvs,HoldPattern[HoldPattern[HoldPattern][f[_Integer]]:>_]]

Out[14]= {HoldPattern[f[1]]:>1,HoldPattern[f[2]]:>2}

但是,从概念上讲,使用HoldPattern进行转义(代替Verbatim)在IMO上是错误的。

编辑

为了使用Cases稍微校正一下这种情况,这是一个简单的示例,其中我们使用了涉及转换规则的Cases语法。这种扩展的语法指示Cases不仅查找和收集匹配的片段,而且还在找到之后立即根据规则对它们进行转换,因此结果列表中包含转换后的片段。
In[29]:= ClearAll[a, b, c, d, e, f];
Cases[{a, b, c, d, e, f}, s_Symbol :> s^2]

Out[30]= {a^2, b^2, c^2, d^2, e^2, f^2}

但是,如果我们需要找到本身就是规则的元素怎么办?如果我们只是尝试这样做:
In[33]:= Cases[{a:>b,c:>d,e:>f},s_Symbol:>_]
Out[33]= {}

它不起作用,因为Cases将第二个参数中的规则解释为使用扩展语法,查找符号并将其替换为_的指令。由于默认情况下它是在1级上搜索的,而符号在此处是2级的,因此它什么也找不到。观察:
In[34]:= Cases[{a:>b,c:>d,e:>f},s_Symbol:>_,{2}]
Out[34]= {_,_,_,_,_,_}

无论如何,这不是我们想要的。因此,我们必须强制Cases将第二个参数视为简单模式(简单而不是扩展语法)。有几种方法可以做到这一点,但所有方法都以某种方式“逃避”了RuleDelayed(或Rule):
In[37]:= Cases[{a:>b,c:>d,e:>f},(s_Symbol:>_):>s]
Out[37]= {a,c,e}

In[38]:= Cases[{a:>b,c:>d,e:>f},Verbatim[RuleDelayed][s_Symbol,_]:>s]
Out[38]= {a,c,e}

In[39]:= Cases[{a:>b,c:>d,e:>f},(Rule|RuleDelayed)[s_Symbol,_]:>s]
Out[39]= {a,c,e}

在所有情况下,我们要么避免扩展Cases的语法(最后两个示例),要么设法利用它来发挥我们的优势(第一种情况)。

09-15 13:39