wolfram-mathematica - 将特定规则应用于 Mathematica 中的持有(或未评估)函数
问题描述
我是一个非常新手的 Mathematica 用户,仍然无法理解它的评估控制、与其相关的所有可能的构造(例如Hold
、Unevaluated
等)以及它们如何工作,尽管有详尽的文档以及讨论的大量 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]
.
谢谢您的帮助!
解决方案
正如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]
推荐阅读
- sdk - how to add http header for authentication to Chromecast request
- django - Django Rest Framework Reverse() 方法失败
- wpf - WPF/PowerShell,从没有标题的数据网格中复制单个单元格
- javascript - 已解决 - 未捕获的 TypeError: $(...).datetimepicker is not a function at app.js:61
- java - Flink Unit Test over ProcessWindowFunction
- javascript - JavaScript Second Largest Element in array Error in code
- f# - 使用 Elmish.WPF (F#) 管理 WPF 选项卡控件?
- actions-on-google - 正在开发中为 Google Smart Home Action 定制徽标
- python - Ceph 与 Django
- apache-nifi - 使用 RouteOnAttribute 时出现问题(无法读取 json 属性并且总是将流发送到不匹配)