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[]
实现了这一点
我的问题是
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}]