Wolfram mathematica 具有无序子表达式的模式

Wolfram mathematica 具有无序子表达式的模式,wolfram-mathematica,Wolfram Mathematica,我需要处理像f[{a,b}]=…这样的模式,其中a和b应该是无序的 到目前为止,我已经通过在每次定义或计算f时对子表达式使用默认的Sort[]实现了这一点 我的问题是 这是否和无序的一样健壮 有更好的办法吗 PS:一个示例应用程序是树分解,其中递归地建立数量,如子树[bag1->bag2],其中bag1和bag2是无序的顶点集 答案更新 Michael Pilat的回答展示了如何定义一个规则来自动排序f的子表达式。另一种解决方案是定义一个自定义头部,如带有Orderless属性的Bag,并将该头

我需要处理像
f[{a,b}]=…
这样的模式,其中
a
b
应该是无序的

到目前为止,我已经通过在每次定义或计算
f
时对子表达式使用默认的
Sort[]
实现了这一点

我的问题是

  • 这是否和无序的一样健壮
  • 有更好的办法吗
  • PS:一个示例应用程序是树分解,其中递归地建立数量,如子树[bag1->bag2],其中bag1和bag2是无序的顶点集

    答案更新

    Michael Pilat的回答展示了如何定义一个规则来自动排序f的子表达式。另一种解决方案是定义一个自定义头部,如带有Orderless属性的
    Bag
    ,并将该头部用于任何Orderless子列表

    ,在回答问题后,我咨询了几位同事,他们同意以下方法确实是处理此问题的最佳/典型方法:

    f[{a_, b_}] := 
     f[{Sort[a], Sort[b]}] /; Not[OrderedQ[a]] || Not[OrderedQ[b]]
    
    In[99]:= f[{{1, 2, 3}, {5, 4, 3}}]
    
    Out[99]= f[{{1, 2, 3}, {3, 4, 5}}]
    

    或者,您可以将内部的
    列表
    头部替换为具有
    无序
    属性的自定义头部符号,如果格式化真的很重要,你可以使用这里最近讨论过的各种格式化技术=)

    我不清楚你为什么不使用无序…将无序应用到哪个头部?我需要a和b是无序的,我现在用列表表示。如果我将“无序”应用于头列表,这将使所有列表无序,这并不是我真正想要的,但我感到困惑,因为无序意味着可交换性,模式匹配使用它来获得有序实体无法匹配的匹配。()我不明白你是怎么用Sort[]得到这个结果的。我只是试着一直把“a”和“b”排序。例如,如果我需要修改f[{1,2,3},{5,4,3}],我会首先将{5,4,3}排序为{3,4,5},然后修改f[{{1,2,3},{3,4,5}]