具有无顺序子表达式的模式

时间:2010-11-15 23:32:35

标签: wolfram-mathematica

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

到目前为止,我已经通过在每次定义或评估Sort[]时对子表达式使用默认f来实现此功能。

我的问题是

  1. 这是否与Orderless一样健壮?
  2. 有更好的方法吗?
  3. PS:一个示例应用程序是树分解,你递归地建立像子树[bag1-> bag2]这样的数量,其中bag1和bag2是无序的顶点集

    回复更新

    Michael Pilat的回答显示了如何定义规则以自动排序f的子表达式。替代解决方案是使用Orderless属性定义类似Bag的自定义头部,并将该头部用于任何无顺序子列表

1 个答案:

答案 0 :(得分:4)

在我回答this question之后,我咨询了一些同事,他们同意以下内容确实是处理此问题的最佳/典型方式:

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}}]

或者,您可以使用具有List属性的自定义头部符号替换内部Orderless头部,如果格式非常重要,您可以使用此处讨论的各种格式化技术= )