Wolfram mathematica 表达式中变量的控制顺序

Wolfram mathematica 表达式中变量的控制顺序,wolfram-mathematica,Wolfram Mathematica,在Mathematica中,如何改变变量的重要性顺序?例如:如果我输入b+c+a+d,我得到a+b+c+d,但我希望b和d在其他变量之前。所以我得到了b+d+a+c 注意,我想在+不可交换的地方使用它,所以不要使用“+”,因为+[]是可交换的 定义您自己的myPlus[x,y]:=。。。。不管怎样 如果您对新的Plus[]应该做什么有想法,请发布它,我们可能会尝试帮助您定义它/ 嗯 PS>您可以更改Plus[]的定义。。。但是:)首先需要定义一个排序函数,如: In[1]:= CPOrderin

在Mathematica中,如何改变变量的重要性顺序?例如:如果我输入b+c+a+d,我得到a+b+c+d,但我希望b和d在其他变量之前。所以我得到了b+d+a+c

注意,我想在+不可交换的地方使用它,所以不要使用“+”,因为+[]是可交换的

定义您自己的myPlus[x,y]:=。。。。不管怎样

如果您对新的Plus[]应该做什么有想法,请发布它,我们可能会尝试帮助您定义它/


PS>您可以更改Plus[]的定义。。。但是:)

首先需要定义一个排序函数,如:

In[1]:= CPOrdering[a]=3;
CPOrdering[b]=1;
CPOrdering[d]=2;
CPOrdering[c]=4;
不过,对于更复杂的示例,您可能应该比这更聪明—即使用模式匹配

然后可以使用

In[5]:= CirclePlus[a,b,c,d]
SortBy[%,CPOrdering]
Out[5]= a\[CirclePlus]b\[CirclePlus]c\[CirclePlus]d
Out[6]= b\[CirclePlus]d\[CirclePlus]a\[CirclePlus]c
然后,可以使用类似于

CPOrdering[a_, b_] := CPOrdering[a] < CPOrdering[b]
CirclePlus[a__] /; (!OrderedQ[{a}, CPOrdering]) := CirclePlus@@SortBy[{a}, CPOrdering]
CPOrdering[a,b]:=CPOrdering[a]
在Mathematica中,
b+c+a+d
变为
a+b+c+d
的根本原因是
Plus
具有
无序的属性。一般来说,具有属性的符号
f
无序
意味着在expression
f[e1,e2,e3]
f
的元素应按规范顺序排序,尤其是,Mathematica的规范序等价于
OrderedQ
Ordering
的规范序

在模式匹配过程中,甚至会考虑到无序:

In[47]:= a+b+c+d /. a+c -> e
Out[47]= b+d+e
强烈建议不要从
Plus
中删除
Orderless
属性,因为这可能会给Mathematica中的许多功能带来可怕的后果

正如其他海报所指出的,最好的办法是简单地定义自己的函数,而不是无序的,因此将保留参数顺序。您还可能发现
HoldForm
在非常有限的情况下非常有用


还要注意的是,没有任何东西可以阻止您在笔记本中按照您想要的顺序排版表达式中的符号,只要您不进行适当的计算,等等。

最好使用CirclePlus之类的工具,因为它已经指定了很好的中缀符号。