gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:04:53 39 4
gpt4 key购买 nike

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

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

谢谢。

最佳答案

Mathematica 有一种机制可以在简单的情况下确定规则的相对通用性,例如它理解 ___ (BlankNullSequence) 比 __ 更通用(空白序列)。因此,如果可以,它会根据它重新排序全局定义。重要的是要认识到,这种分析必然主要是句法。因此,虽然 PatternTest (?)Condition (/;)带有一些简单的内置谓词,如 EvenQ有时可以分析,将它们与用户定义的谓词一起使用将必然使这种重新排序对于类似定义的规则变得不可能,因此 Mathematica 将按照它们输入的顺序保留这些规则。这是因为,PatternTestCondition强制模式匹配器调用评估器来确定匹配的事实,这使得无法回答定义时规则的相对通用性问题。即使对于纯粹的句法规则,也不总是能够确定它们的相对普遍性。所以,当这不能做,或者 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]

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

关于wolfram-mathematica - mathematica 如何确定在替换中首先使用哪个规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823838/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com