11
votes

Infix pour tous (feuilles)

infixe [] ne fonctionne qu'au premier niveau: xxx

comme je veux (ne pas demander pourquoi) obtenir l'expression complète commutée pour infixer la notation, J'ai essayé quelque chose comme: xxx

mais cela a deux problèmes évidents, car

  1. (C a ^ b) ^ d == A ~ POWER ~ B ~ B ~ C ~ POWER ~ D
    Donc, ce que je reçois n'est pas une utilisation efficace de l'infixe.
  2. Il n'est pas robuste et échoue à des expressions faciles telles que k = toinfx [A / B + arctan [A / B]]

    Y a-t-il un moyen facile d'obtenir infix [] travailler pour tous (feuilles)?


7 commentaires

+1 pour tenter d'automatiser une blague


Je peux totalement voir cela être très utile: p


Qu'est-ce qui ne va pas avec (c ~ fois ~ (a ~ power ~ b)) ~ POWER ~ D ? Vous n'aimez pas la parenthèse? Pourriez-vous fournir un exemple d'expression où il échoue?


@Sjoerd Voir Modifier. Fonctionne aussi légèrement modifiée


@Sjoerd ouais. Je n'aime pas la parenthèse inutile (SP)


@ACL l'histoire de la blague qui ne mourrait pas ...


Étant donné que cette question n'était pas la blague, je pensais que c'était, j'ajouterai que moi aussi je suis intéressé par un algorithme pour trouver la forme d'infixe minimalement parenthèse.


3 Réponses :


6
votes

Voici aller simple:

In[963]:= toInfixAlt[a/b+ArcTan[a/b]]
Out[963]= (a b ~Power~ (-1)) ~Plus~ ArcTan[a ~Times~ (1/b)]


26 commentaires

Merci! Semble que cela échoue également avec A / B + arctan [A / B] . Ai-je raison?


@belisarius Je viens de modifier pour inclure ce cas (ajouté _ [_] au motif du code).


Un peu dans la tenue de l'expression semble tort. Essayez TOINFIXALT [SOLVE [X ^ 5 + 2 x + 1 == 0, X]]


@Belisarius J'avais une fuite d'évaluation dans le code (honte sur moi :)). Correction maintenant (ajouté inévalué intérieur atomq ).


@Belisarius Voir mon édition, bien que cela ne soit pas sûr que vous aimeriez les résultats :)


Merci! J'aime ça autant que tu fais :). Je suppose que rien ne le fera parfaitement. BTW: Avez-vous noté les différents résultats pour A / B?


@Belisarius Oui je l'ai fait. Le résultat n'est pas vraiment différent, mais regarde différemment, puisque infixe est maintenant parti pour cette partie. Vous ne pouvez pas avoir les deux - ni infixsi et plus de parens, ou no infixsiez , puis le formulaire habituel de l'expression correspondante (opérateur).


J'espérais que B ~ puissance ~ (-1) ~ fois ~ a ~ plus ~ arctan [b ~ puissance ~ (-1) ~ fois ~ a]


@Belisarius C'est ce que je disais. Vous ne pouvez pas faire cela avec infixe sans modifier les règles de formatage pour infixe , puisque infixe met la parens autour d'une expression à l'intérieur. Votre résultat souhaité correspondrait à HoldForm [Infix [Plus [Infix [Times [POWIX [POWIX [POWER [B, -1]], A]], arctan [infixe [fois [POWIX [POWIX [B, -1]] , a]]]]]]]] , mais cela se traduit par la sortie que nous avions avant d'ajouter les règles liées à la préséance - c'est-à-dire une expression avec des parenthèses supplémentaires.


@belisarius ne va pas aider. C'est un problème syntaxique pur: regarder infixe [gg [gg [FF [A, B]], c]] par exemple (produit (A ~ ff ~ b) ~ gg ~ C ). Je ne vois tout simplement pas comment pouvez-vous produire quelque chose comme a ~ ff ~ b ~ gg ~ c avec infixe (peut être je suis juste stupide).


Obtenez le graphique de Treeform [], trier (greffing) chaque niveau de chaque branche par precedence, puis faire rasebran ~ f ~ raidebran partout


@Belisarius Désolé, vous semblez ne pas avoir ce que je dis. Ce n'est pas un problème de construire un arbre, c'est un problème de Infix Rendu (règles de syntaxe). S'il vous plaît dites-moi comment construire a ~ ff ~ b ~ gg ~ c (sans parens supplémentaires) en utilisant infixe (l'expression est gg [FF [A, B ], c] ), je pourrais peut-être faire ce que vous décrivez.


Ce que je suis après la forme de l'infixe, pas le résultat de la commande infixe []. Quand j'ai écrit mon commentaire précédent, je pensais à construire une chaîne avec le contenu de la forme de la forme []


@belisarius oh, je l'ai eu maintenant. Désolé, il était difficile de comprendre de vos commentaires - je pensais que vous vouliez utiliser infixe uniquement. Comment souhaitez-vous alors imprimer / afficher le code - avec CellPrint ?


Comme tout ce que je veux, c'est un textelle, je suppose que CellPrint [] est OK, oui. Et désolé pour la confusion :(


@Belisarius Je examinais cette nouvelle formulation depuis un peu et obtenu une fonction qui devrait le faire, mais il semble qu'il y ait des bugs d'analyses pour une notation d'infixe. Considérez ceci par exemple: a ~ fois ~ b ~ b ~ puissance ~ (-1) . Étant donné que precedence / @ {fois, Power} donne {400., 590.} , je m'attendrais à ce que le résultat soit a / b , mais c'est 1 / (ab) et de nombreux cas similaires. C'est un arrêt complet. J'abandonne ce problème et ma suggestion est - N'utilisez pas de formulaire d'infixe du tout (à moins que je ne manque quelque chose).


Si je comprends bien, dans la notation d'infixe, la priorité n'est pas comptabilisée. Vous devez organiser l'arbre de sorte que, lorsqu'il soit exécuté de gauche à droite, le résultat est attendu. BTW Je viens de découvrir BreadthfirstScan [] Cela fait de la tournée autour de la syntaxe un morceau de gâteau.


@Belisarius Je ne comprends pas pourquoi la largeur - premier et pas profondeur - premier. À mon esprit, l'exécution de gauche à droite correspond à la profondeur - premier. Mais, si j'ai raison, ce n'est pas très utile. Considérez fois [POWER [A, 2], POWER [B, (-1)]]] . Profondeur-First Scan donnera A ~ Power ~ 2 ~ fois ~ ~ B ~ POWER ~ (-1) (Droite?). L'exécution des deux donne des résultats différents cependant.


@Belisarius Désolé, je dois partir maintenant, il est temps d'avoir un peu de sommeil :).


Leonid, votre "bogue d'analyseur" est en fait une fonctionnalité que j'ai une valeur assez importante, c'est que ~ Infix ~ PRÉCÉDENCE est pareil, vous pouvez simplement lire l'expression de gauche à droite, comme si je dis du jour de l'un de tout le monde case.


@Monsieur. Magicien, je suis sur le point de partir, mais puisque vous valorisez cette fonctionnalité, dites-moi, que a ~ ~ 2 ~ ~ fois ~ b ~ puissance ~ (-1) correspond à, si je le lisez de De gauche à droite comme vous le suggérez (je ne pourrai que la lire demain, je suis libre d'aujourd'hui). En d'autres termes, pourquoi devrais-je préférer le (A ~ puissance ~ 2 ~ fois ~ b) ~ Puissance ~ (-1) Interprétation à (A ~ Power ~ 2) ~ Times ~ ( B ~ Puissance ~ (-1)) Un?


@Monsieur. J'ai écrit un commentaire disant la même chose ... et j'ai oublié d'appuyer sur "Ajouter un commentaire" :)


@Belisarius vous semble que vous l'avez fait, mais je suppose que je ne pouvais plus laisser la chance de battre mon vieux tambour. ;-p


@Monsieur. Ohhh en effet, je l'ai fait :) Je le vois maintenant :)


@Belisarius Je dois dire, je n'ai jamais pensé que Infix était ce déroutant! Mon cerveau doit être câblé différemment. MDR


@Monsieur. Et vous pensiez que celui-ci était une question maquette! :)



2
votes

Je ne sais pas pourquoi je vous aide à vous moquer de moi, mais ...

(c a^b)^d //. h_[a_, b_] :> ix[a, h, b] /. ix :> (Infix[{##}, "~"] &)


3 commentaires

Je ne me moque pas de toi. Votre petit amusement a tiré beaucoup de pensée ici. Je me sens plus comme s'amuser avec vous et apprendre un peu.


Infix peut également fonctionner sur des expressions avec plus de 2 termes, tels que A + B + C par exemple. Votre code ne couvre pas cela.


@belisarius d'accord :-) Leonid, je ne prenais vraiment pas cette question au sérieux.



3
votes

Voici mon approche, très similaire à celle de Leonid: xxx


2 commentaires

Ne semble pas fonctionner correctement sur SOLVE [x ^ 5 + 2 x + 1 == 0, x] . Utilisation de inévalué @ ROLVE [...] aide quelque peu, mais pas entièrement. De plus, des choses comme # 1 ^ 2 + # 2 ^ 2 & sont problématiques.


@Belisarius Désolé, n'a pas vu votre commentaire.