代码之家  ›  专栏  ›  技术社区  ›  Yaroslav Bulatov

具有无序子表达式的模式

  •  4
  • Yaroslav Bulatov  · 技术社区  · 14 年前

    我需要处理像 f[{a,b}]=... 哪里 a b 应该是无秩序的

    到目前为止,我使用默认值实现了这个 Sort[] 每次在子表达式上 f 定义或计算。

    我的问题是

    1. 这和 Orderless ?
    2. 有更好的办法吗?

    PS:一个示例应用程序是树分解,在树分解中递归地建立数量,如子树[bag1->bag2],其中bag1和bag2是无序顶点集

    答案更新

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

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

    在我回答之后 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 属性,如果格式化真的很重要,您可以使用最近在这里讨论过的各种格式化技术=)