Wolfram mathematica 重写无序函数的默认显示顺序

Wolfram mathematica 重写无序函数的默认显示顺序,wolfram-mathematica,Wolfram Mathematica,在最近的两个问题(,)中,前面的海报试图控制Plus的输出顺序,这是一个无顺序的函数。Michael Pilat指出,在内部,Orderless函数Sort它们的参数造成了困难。然而,他警告不要让Plus无秩序。前面两个问题的解决方案相当于创建一个类似于Plus的函数,但它本身不是无序的。这当然有效,但我的问题是如何更改默认的Sort顺序 我需要做更多的研究,但有两种方法;问题是,您实际上没有使用Orderless属性。Simon在使用模式匹配的技术和您引用的条件方面应该得到一半的分数 与Ord

在最近的两个问题(,)中,前面的海报试图控制
Plus
的输出顺序,这是一个
无顺序的
函数。Michael Pilat指出,在内部,
Orderless
函数
Sort
它们的参数造成了困难。然而,他警告不要让
Plus
无秩序。前面两个问题的解决方案相当于创建一个类似于
Plus
的函数,但它本身不是
无序的。这当然有效,但我的问题是如何更改默认的
Sort
顺序

我需要做更多的研究,但有两种方法;问题是,您实际上没有使用
Orderless
属性。Simon在使用模式匹配的技术和您引用的条件方面应该得到一半的分数

Order
混为一谈,
OrderedQ
Sort
不会有任何效果,因为
Orderless
函数排序与这些方法等价,但实际上并不使用它们进行排序

根据Simon的回答,第一种方法是使用:

如果参数的顺序不是所需的顺序,则会对f[stuff_uuuu]的定义求值,然后将其转换为该顺序

另一种方法是获得一点低级别,并使用或:

这两种方法都存在一些问题,例如,特定的
$Pre
函数不能很好地使用,例如
HoldForm[g[1,2,3]


所以,这是目前可以玩的东西。我希望在对此做了更多的研究之后进行更新。

。。。函数
Order
OrderedQ
Sort
和属性
Orderless
似乎都在分别调用Mma的规范排序函数。我试着用整数重新定义其中的每一个,但没有一个影响到另一个。考虑到文档中说“排序[列表]给出了排序[列表]的每个连续元素在列表中出现的位置”,这很奇怪。但是更改
排序
排序
没有影响。我确定是否有可能更改无序函数所使用的顺序。此外,
Sort
文档说“Sort[list,p]将函数p应用于列表中的元素对,以确定它们是否有序。默认函数p是OrderedQ[{1,{2}]&”但是更改整数的
OrderedQ
排序没有影响。我从未想过使用
$Pre
/
$PreRead
进行排序。但正如您所说,这并不能解决更改无序函数排序顺序的原始问题。请注意,Orderless经过了高度优化,是一个比这里使用的条件排序定义更快的堆。对,但请记住,
Orderless
意味着元素的顺序并不重要,但您希望以非标准方式对它们进行排序这一事实意味着这一点,那么为什么要使用
Orderless
?我认为我们只能找到在有序表达式中透明排序参数的最佳方法。除了排序之外,
Orderless
在各种情况下的表达式中还有其他语义含义,比如模式匹配。你问我们希望有一个特定的排序顺序时为什么选择
Orderless
,我想这没有抓住重点。你是对的,顺序有点重要,但它更符合美学,而不是数学如何理解函数本身。据我所知,对参数进行排序是为了从有序系统创建一个
Orderless
系统。对我来说,这意味着任何排序顺序都是有效的,只要它是一致的。由于函数是无序的,所以排序顺序的选择是任意的,为什么我们不能使用我们指定的排序顺序呢?对此还有其他想法吗?
In[1]:= ClearAll[f, g]

In[2]:= f[stuff__] /; ! OrderedQ[{stuff}, Greater] := 
           f[Sequence@@Sort[{stuff}, Greater]]

In[3]:= f[1, 2, 3]
Out[3]= f[3, 2, 1]

In[4]:= f[3, 2, 1]
Out[4]= f[3, 2, 1]
In[5]:= $Pre = 
 Function[{expr}, 
  expr /. g[stuff__] :> g[Sequence @@ Sort[{stuff}, Greater]]];

In[6]:= g[1, 2, 3]
Out[6]= g[3, 2, 1]

In[7]:= g[3, 2, 1]
Out[7]= g[3, 2, 1]