我想为DiscreteShift设置一个upvalue,它可以改变被提升为幂的规则:
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]
,然后为其修复权限规则。
答案 0 :(得分:5)
问题是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。