Шаблоны с беспорядочными подвыражениями - PullRequest
4 голосов
/ 16 ноября 2010

Мне нужно иметь дело с такими шаблонами, как f[{a,b}]=..., где a и b должны быть беспорядочными

До сих пор я реализовал это, используя каждый раз по умолчанию Sort[] для подвыражений f определяется или оценивается.

Мои вопросы

  1. Это так же надежно, как Orderless?
  2. Есть ли лучший способ?

PS:Примером приложения является декомпозиция дерева, где вы рекурсивно создаете такие количества, как поддерево [bag1-> bag2], где bag1 и bag2 - упорядоченные наборы вершин

обновление ответа

МайклОтвет Пилата показывает, как определить правило для автоматической сортировки подвыражений f.Альтернативное решение состоит в том, чтобы определить пользовательский заголовок, например Bag, с атрибутом Orderless и использовать этот заголовок для любых неупорядоченных подсписков

.

1 Ответ

4 голосов
/ 17 ноября 2010

После того, как я ответил 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, и если форматирование действительно имеет значение, вы можете использовать различные методы форматирования, которые недавно обсуждались здесь =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...