2010-11-15 4 views
4

sous-expressions sans ordre je dois traiter avec des motifs comme f[{a,b}]=...a et b sont censés être sans ordre modèles avec

Jusqu'à présent, j'ai mis cela en utilisant par défaut Sort[] sur les sous-expressions chaque fois f est défini ou d'une évaluation.

Mes questions sont

  1. Est-ce aussi robuste que Orderless?
  2. Y a-t-il un meilleur moyen?

PS: Un exemple d'application est la décomposition des arbres où vous construisez récursive des quantités comme sous-arbre [bag1-> bag2] où bag1 et bag2 sont des ensembles sans ordre de sommets

réponse mise à jour

Michael La réponse de Pilat montre comment définir une règle pour trier automatiquement les sous-expressions de f. Autre solution est de définir une tête personnalisée comme Bag avec l'attribut sans ordre et utiliser cette tête pour toutes les sous-listes sans ordre

+0

Ce n'est pas clair pour moi pourquoi vous n'utilisez pas Orderless ... –

+0

Appliquer Orderless à quelle tête? J'ai besoin de a et b pour être sans ordre, ce que je représente comme des listes en ce moment. Si j'applique "Orderless" à la liste Head, cela fera * all * des listes sans ordre, pas vraiment ce que je veux –

+0

Désolé, mais je deviens confus car orderless signifie commutativité, et pattern matching utilise ceci pour obtenir des correspondances qu'une entité ordonnée ne pourrait pas rencontre. (http://reference.wolfram.com/mathematica/tutorial/FlatAndOrderlessFunctions.html) Je ne comprends pas comment vous obtenez cela avec Sort []. –

Répondre

4

Après avoir répondu this question je consultais avec quelques collègues qui étaient d'accord que ce qui suit est en effet le meilleur/manière typique de gérer cette problème:

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}}] 

Alternativement, vous pouvez remplacer les List internes têtes avec un symbole de tête personnalisé qui a l'attribut Orderless, et si la mise en forme compte vraiment vous pouvez utiliser les différentes techniques de mise en forme qui ont été récemment discutées ici =)