具有无序子表达式的模式
我需要处理像 f[{a,b}]=...
这样的模式,其中 a
和 b
应该是无序的
所以到目前为止,我已经通过在每次定义或计算 f
时对子表达式使用默认的 Sort[]
来实现这一点。
我的问题是
- 这是否与
无序
一样强大? - 有更好的办法吗?
PS:一个示例应用程序是树分解,您可以递归地建立像 subtree[bag1->bag2] 这样的数量,其中 bag1 和 bag2 是无序的顶点集
答案更新
Michael Pilat 的答案显示了如何定义规则自动对 f 的子表达式进行排序。替代解决方案是定义一个自定义头,例如具有无序属性的 Bag
,并将该头用于任何无序子列表
I need to deal with patterns like f[{a,b}]=...
where a
and b
are supposed to be orderless
So far I've implemented this by using default Sort[]
on subexpressions every time f
is defined or evaluated.
My questions are
- Is this as robust as
Orderless
? - Is there a better way?
PS: An example application is tree decomposition where you recursively build up quantities like subtree[bag1->bag2] where bag1 and bag2 are orderless sets of vertices
answer update
Michael Pilat's answer shows how to define a rule to automatically sort f's subexpressions. Alternative solution is to define a custom head like Bag
with Orderless attribute and use that head for any orderless sublists
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在我回答
这个问题
后,我咨询了一些同事,他们同意以下确实是处理此问题的最佳/典型方法:或者,您可以将内部
List
头替换为具有Orderless
属性的自定义头符号,如果格式确实很重要,您可以使用最近在这里讨论的各种格式化技术 =)After I answered
this question
I consulted with a few colleagues who agreed that the following is indeed the best / typical way to handle this problem:Alternately, you could replace the inner
List
heads with a custom head symbol that has theOrderless
attribute, and if formatting really matters you could use the various formatting techniques that have recently been discussed here =)