Wolfram mathematica 替换规则子表达式

Wolfram mathematica 替换规则子表达式,wolfram-mathematica,rules,replace,Wolfram Mathematica,Rules,Replace,我已使用替换规则: 首先,我使用SetDelayed定义了一些简单的公式 a:=b+c d:=a/e 对以下方程式进行评估,得出预期结果: In[20]:= (d^2 + something)/(d - 1) Out[20]= ((b+c)^2/e^2+something)/((b+c)/e-1) 但是,如果我想用另一个术语来代替“d”,比如说“tmp”,我会得到以下结果: In[26]:= (d^2+something)/(d-1)//.d->tmp Out[26]= ((b+c)^

我已使用替换规则:

首先,我使用SetDelayed定义了一些简单的公式

a:=b+c
d:=a/e
对以下方程式进行评估,得出预期结果:

In[20]:= (d^2 + something)/(d - 1)
Out[20]= ((b+c)^2/e^2+something)/((b+c)/e-1)
但是,如果我想用另一个术语来代替“d”,比如说“tmp”,我会得到以下结果:

In[26]:= (d^2+something)/(d-1)//.d->tmp
Out[26]= ((b+c)^2/e^2+something)/(tmp-1)
似乎只有当变量“d”没有被类似于“Power”的函数包围时,它才会被替换。因此术语
d^2
不会被
tmp
取代


那么,如果我希望每次在评估步骤中发生
d
时都将其替换,那么我做错了什么呢?

在[26]中的
中,在
替换重复之前(您编写为
/.
),评估者已经根据您为其建立的规则重写了
d

Mathematica的求值器非常贪婪,
/.
的优先级相当低,因此[26]
/.
左侧的表达式已重写为

((b+c)^2/e^2+something)/(tmp-1)
在替换规则有机会运行之前。由于此表达式不包含
d
,因此替换规则
d->tmp
未启用

你有很多选择

a) 您可以为
d
编写一个新表达式,例如
d:=tmp
d=tmp
,在这种情况下

(d^2+something)/(d-1)
将产生

(something + tmp^2)/(-1 + tmp)
b) 您可以通过计算
d:=a/e
来删除
d
的定义,并且只要在需要转换包含
d
的表达式时使用替换规则即可

c) 您可以学习函数的定义和使用,如
Hold[]
HoldFirst[]
以及文档中涵盖Mathematica常用评估过程和如何修改的部分

d) 与Mathematica一样,会有其他方法来实现您想要的,最佳选择将取决于您正试图做什么

要回答您的特定问题,如果我希望在每次求值步骤中发生d时都替换它,那么我做错了什么?您正在定义重写规则
d:=a/e
,并将其放入规则集中,以便在以后会话中求值的任何表达式求值期间进行尝试

编辑以回应评论

d:=a/e
不是临时替换,它是一个定义,在移除或替换或关闭会话之前一直存在。通常,使用规则(比如你的
d->tmp

rule1 = d->a/e
并以显而易见的方式使用它们

expression /. rule1
您可以定义规则列表

rule_list = {d->tmp, e->tmp2, f-> tmp3}

等等。

我对Hold[]函数进行了一些操作,得到了一个适合我的解决方案

首先,每学期我都会坚持

a:=Hold[b+c]
d:=Hold[a/e]
构造完整的方程时,我使用以下命令在计算前替换几个变量。因此,我使用Nest[]函数在不同级别替换它们:

In[338]:= expression=Hold[(d^2+something)/(d-1)];
Nest[ReleaseHold[#//.HoldPattern[d]->tmp]&,expression,10]

Out[339]= (something+tmp^2)/(tmp-1)

这使我得到了我想要的结果,并在更深层次上进行了替换。

首先非常感谢您的快速回复。背景是我有许多不同的公式,这些公式被合并到最终方程中。为了对这个方程进行一些实验,我尝试临时设置一些部分公式(如d:=a/e)在不覆盖d项的情况下将其转换为常量变量。这就是为什么我尝试使用规则作为临时替换。使用Hold函数也是一个想法,但对我没有帮助。你知道如何处理这个问题吗?