我需要处理像 f[{a,b}]=...
这样的模式哪里a
和 b
应该是无序的
到目前为止,我已经通过使用默认值 Sort[]
实现了这一点。每次都在子表达式上 f
被定义或评估。
我的问题是
Orderless
一样强大? ? PS:一个示例应用程序是树分解,您可以递归地构建像 subtree[bag1->bag2] 这样的数量,其中 bag1 和 bag2 是无序的顶点集
答案更新
Michael Pilat 的回答显示了如何定义规则来自动对 f 的子表达式进行排序。另一种解决方案是定义一个自定义头,如
Bag
具有无序属性并将该头用于任何无序子列表
最佳答案
我回答后 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
的自定义头部符号的头部属性,如果格式真的很重要,你可以使用最近在这里讨论的各种格式技术 =)
关于wolfram-mathematica - 具有无序子表达式的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189895/