我想为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运算符,它充当离散移位,并且我们在重载乘法的含义以使其对函数进行运算。我曾希望通过使用N f(n)表示DiscreteShift[f[n],n],然后为其修正功率规则。

最佳答案

问题在于,DiscreteShift[f[n], n]中的Power[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 *)



belisarious提供了a link to a method,您可以通过它截取对内置函数的评估以插入您自己的代码。但是,我认为将它与TagSet组合到DiscreteShift会很困难。

09-26 20:12