Wolfram mathematica 用于设置离散换档的上升值的模式

Wolfram mathematica 用于设置离散换档的上升值的模式,wolfram-mathematica,design-patterns,Wolfram Mathematica,Design Patterns,我想为DiscreteShift设置一个向上的值,该值将更改提升为幂的规则: Unprotect[DiscreteShift]; DiscreteShift /: Power[DiscreteShift[f_, i_], r_] := DiscreteShift[f, {i, r}]; Protect[DiscreteShift]; Power[DiscreteShift[f[n], n], 2] === DiscreteShift[f[n], {n, 2}] 但我收到了这些错误信息: Rul

我想为DiscreteShift设置一个向上的值,该值将更改提升为幂的规则:

Unprotect[DiscreteShift];
DiscreteShift /: Power[DiscreteShift[f_, i_], r_] := DiscreteShift[f, {i, r}];
Protect[DiscreteShift];
Power[DiscreteShift[f[n], n], 2] === DiscreteShift[f[n], {n, 2}]
但我收到了这些错误信息:

Rule::rhs: "Pattern i_ appears on the right-hand side of rule i_->1+i_. "
TagSetDelayed::tagnf: "Tag DiscreteShift not found in (1+Pattern[f_,_])^r_."
它似乎不喜欢DiscreteShift的论点的模式,但我也找不到任何其他的方法。写这个的正确方法是什么

编辑: 我会努力澄清我的目标。以下是我想做的数学计算:

(N + n) f(n) = N f(n) + n f(n)
             = f(n+1) + n f(n)

(N + n)^2 f(n) = (N^2 + Nn + nN + n^2) f(n)
               = N^2 f(n) + Nn f(n) + nN f(n) + n^2 f(n)
               = f(n+2) + (n+1) f(n+1) + n f(n+1) + n^2 f(n)
               = f(n+2) + (2n+1) f(n+1) + n^2 f(n)

我有一个有趣的N运算符,它充当离散移位,我们有点重载了乘法的含义,让它对一个函数进行运算。我曾希望通过使用
DiscreteShift[f[N],N]
来表示
nf(N)
,然后修正它的幂律。

问题是
DiscreteShift[f[N],N]
幂[DiscreteShift[f[N],N]中,2]
在任何其他情况发生之前计算为
f[1+N]
。这会影响您创建规则的尝试,以及实际执行
Power[DiscreteShift[f[n],n],2]

与您的结果进行比较:

Unprotect[DiscreteShift];
DiscreteShift /: Power[HoldPattern[DiscreteShift[f_, i_]], r_] := 
  DiscreteShift[f, {i, r}];

Power[Unevaluated@DiscreteShift[f[n], n], 2] === DiscreteShift[f[n], {n, 2}]
(*Out[]=True*)

Belisarius提供的,您可以通过它截取对内置函数的求值以插入自己的代码。但是,我认为很难将它与标记集结合起来进行离散移位。

这有帮助吗?我相信你更新的问题需要一些时间才能正确回答,我现在没有时间。如果到时还没有答复的话,我会在以后再谈。帕特里克,对不起,我没有再谈这个问题。我将很快花些时间在这件事上。我很惊讶没有人回复您的更新。@Mr.Wizard我感谢您的帮助,但不要觉得有压力重新开始。@Patrick,我终于又看到了这个。这看起来像一个多项式展开式,但我希望
(N+N)^2f(N)
会产生
N^2f(N)+2nf(N+1)+f(N+2)
。请告诉我为什么不是这样。对不起,我不理解你的例子;也许几分钟后它会“咔嗒”一声。问题是,大多数人不愿意一直使用
未评估的
,据我所知,没有它,就没有可靠的方法可以做到这一点(不要贬低你的答案)。我在这里详细讨论了这个问题:莱昂尼德,我想链接到这个答案,但我没能及时找到它。非常感谢。我将不得不花更多的时间来研究发布的链接,但在我看来,DiscreteShift的评估首先是可取的。我希望像f[n+1]^2这样的东西计算成f[n+2]。@Patrick,如果你想
f[n+1]^2
计算成
f[n+2]
然后
DiscreteShift
不在图片中,您需要在
Power
或更好的
f
@Patrick上附加一条规则,因为嵌套太深,用
HoldPattern
Unevaluated
简单替换
将失败。此外,通常不建议像
Power
那样重载基本符号。如果您愿意更详细地描述您的申请,我可能会有一个合适的建议(如果您觉得合适,您可以对您的问题进行编辑)。 (* Out[] = True *)