gpt4 book ai didi

wolfram-mathematica - 数学 : Overriding `Listable` property of `Plus`

转载 作者:行者123 更新时间:2023-12-05 00:05:22 24 4
gpt4 key购买 nike

我想定义一个符号 pt保存一个点(并最终缓存与该点相关的一些数据):

pt::"usage" = "pt[{x,y}] represents a point at {x,y}";

我希望能够使用这样的 pt以尽可能多的方式将对象作为点,特别是,我希望能够写
{a0,a1}+pt[{b0,b1}]

并让它返回 pt[{a0+b0,a1+b1}]而不是 {a0+pt[{b0,b1}],a1+pt[{b0,b1}]} .
我最初的想法是使用:
pt /: Plus[pt[p0_], p1 : {_, _}] = pt[p0 + p1];

但这不起作用(因为 PlusListable ?)。有没有办法在不取消保护的情况下做到这一点 Plus ?

更新:
正如 Leonid 指出的那样,如果没有全局或本地黑客攻击,这是不可能实现的 Plus , 自 Listable在任何 *values 之前考虑属性。这实际上在 evaluation tutorial 中有非常精确的描述。 .

最佳答案

Mathematica 的评估器似乎不够灵活,无法轻松做到这一点。 pt 的 UpValues 确实在 Plus 的 DownValues 之前应用,但由于 Listability 在列表上线程化甚至在此之前发生。在这种特殊情况下,以下内容可能对您有用:

eval = Function[code,Block[{Plus = Plus, attr = DeleteCases[Attributes[Plus], Listable]},
SetAttributes[Plus, attr]; code], HoldAll]

要使用它,请将它包裹在一段代码中,您希望在其中应用 pt 规则,例如:
eval[{a0, a1} + pt[{b0, b1}]]

您可以使用 $Pre 作为 $Pre = eval避免每次都输入 eval ,尽管通常我不推荐这样做。 Blocking Plus 是一种暂时禁用其部分或全部属性的更柔和的方法。优势 w.r.t.在没有 Block 的情况下清除和设置属性是你不能最终处于永久禁用 Listable 属性的全局状态,即使抛出异常或计算被中止。

由于 Listable 属性直接影响评估而不是模式匹配(如果某些模式必须匹配 Plus 线程在列表上的结果,后者当然可能会受到间接影响),因此在大多数情况下这应该没问题。理论上,在某些情况下,它仍然可能会导致一些不需要的效果,尤其是在涉及模式匹配的情况下。但在实践中,它可能已经足够好了。一个更简洁但更复杂的解决方案是创建一个根据您的需求量身定制的自定义评估器。

关于wolfram-mathematica - 数学 : Overriding `Listable` property of `Plus` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4612167/

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