Wolfram mathematica mathematica如何确定在替换中首先使用哪个规则

Wolfram mathematica mathematica如何确定在替换中首先使用哪个规则,wolfram-mathematica,Wolfram Mathematica,我想知道如果给定多个替换规则,mma如何确定在发生冲突时首先应用哪一个。例如: x^3 + x^2*s + x^3*s^2 + s x /. {x -> 0, x^_?OddQ -> 2} 谢谢。Mathematica有一种机制,可以在简单的情况下确定规则的相对通用性,例如,它理解\uuuuuuuu(BlankNullSequence)比\uuuuuuuu(BlankSequence)更通用。因此,如果可以,它会根据它重新排列全局定义。但必须认识到,这种分析必然主要是句法分析。因此

我想知道如果给定多个替换规则,mma如何确定在发生冲突时首先应用哪一个。例如:

x^3 + x^2*s + x^3*s^2 + s x /. {x -> 0, x^_?OddQ -> 2}

谢谢。

Mathematica有一种机制,可以在简单的情况下确定规则的相对通用性,例如,它理解
\uuuuuuuu
(BlankNullSequence)比
\uuuuuuuu
(BlankSequence)更通用。因此,如果可以,它会根据它重新排列全局定义。但必须认识到,这种分析必然主要是句法分析。因此,虽然有时可以分析带有一些简单内置谓词(如
EvenQ
)的
pattertest(?)
Condition(/;)
),但将它们与用户定义的谓词一起使用必然会使类似定义规则的重新排序变得不可能,这样Mathematica就会按照规则输入的顺序来保存这些规则。这是因为,
patternetest
Condition
强制模式匹配器调用求值器来确定匹配的事实,这使得在定义时无法回答规则的相对通用性问题。即使对于纯粹的语法规则,也不总是能够确定它们的相对通用性。所以,当这不能做到,或者Mathematica不能做到时,它会按照规则输入的顺序保留规则

这一切都是关于全局规则的,由
Set
SetDelayed
或其他赋值运算符创建。对于本地规则,就像在您的示例中一样,没有任何重新排序,它们是按照规则列表中的顺序应用的。除了应用于给定(子)表达式的第一个规则之外,对于该子表达式和特定规则应用过程,将忽略规则列表中的所有规则-根据第一个匹配规则重写(子)表达式,然后规则应用过程继续与其他子表达式一起进行。即使重写(子)表达式的新形式与规则列表下的某些规则相匹配,也不会在此规则应用过程中应用这些规则。换句话说,对于单个规则应用过程,对于任何特定(子)表达式,要么不应用规则,要么只应用一个规则。但这里也有一些微妙之处。例如,
ReplaceAll(/)
将规则从较大的表达式应用到子表达式,而
Replace
使用显式级别规范则以相反的方式进行。在这种情况下,这可能很重要:

In[1]:= h[f[x, y]] /. {h[x_f] :> a, f[args__] :> b}

Out[0]= a

In[2]:= Replace[h[f[x, y]], {h[x_f] :> a, f[args__] :> b}, {0, Infinity}]

Out[2]= h[b]
我在书中的几个地方提到了规则重新排序:,和。在少数情况下,当Mathematica以不令人满意的方式重新排列规则时,您可以通过使用
DownValues
(或其他…值)直接操作手动更改顺序,例如
DownValues[f]=Reverse[DownValues[f]]
。这种情况有时确实会发生,但很少发生,如果发生,请确保有充分的理由保留现有设计并进行手动规则重新排序