首页 > 解决方案 > 将特定规则应用于 Mathematica 中的持有(或未评估)函数

问题描述

我是一个非常新手的 Mathematica 用户,仍然无法理解它的评估控制、与其相关的所有可能的构造(例如HoldUnevaluated等)以及它们如何工作,尽管有详尽的文档以及讨论的大量 StackExchange 和 StackOverflow 问题这个话题。因此,对于任何可能的重复,我们深表歉意。

我的用例如下:我有一个f由数千个规则和模式()定义的函数(比如说DownValues)。我想从f[expr](for some expr) 的展开表示开始,并获得将单个特定规则应用于f[expr]. 我希望结果也保持展开。

作为一个特定的示例,假设我们有以下内容:

 In[1]: nat[0] := 0
 In[2]: nat[n_] := 1 + nat[n - 1]
 In[3]: DownValues[nat]
Out[3]: {HoldPattern[nat[0]] :> 0, HoldPattern[nat[n_]] :> 1 + nat[n - 1]}
 In[4]: nat[10]
Out[4]: 10

现在,我想从表示为nat[10](未评估!)的表达式开始,并希望专门应用第二条规则(HoldPattern[nat[n_]] :> 1 + nat[n - 1])来获得形式为 的表达式1 + nat[9]。类似地,如果我希望应用第一条规则 ( HoldPattern[nat[0]] :> 0),我希望结果保持其原始形式不变,即nat[10].

谢谢您的帮助!

标签: wolfram-mathematica

解决方案


正如Mathematica 的 StackExchange中的平行讨论中的回复所发布的那样,我发现了一种相对更直接和直接的方法来处理该问题:

 In[6] rules = DownValues[nat]                                                 
Out[6] {HoldPattern[nat[0]] :> 0, HoldPattern[nat[n_]] :> 1 + nat[n - 1]}

 In[7] DownValues[nat] = {}                                                    
Out[7] {}

 In[8] nat[10]                                                                 
Out[8] nat[10]

 In[9] nat[10] /. rules[[1]]                                                   
Out[9] nat[10]

 In[10] nat[10] /. rules[[2]]                                                  
Out[10] 1 + nat[9]

推荐阅读