comme je veux (ne pas demander pourquoi) obtenir l'expression complète commutée pour infixer la notation, J'ai essayé quelque chose comme: p> mais cela a deux problèmes évidents, car p> Y a-t-il un moyen facile d'obtenir infixe [] code> ne fonctionne qu'au premier niveau:
(C a ^ b) ^ d == A ~ POWER ~ B ~ B ~ C ~ POWER ~ D CODE>
Donc, ce que je reçois n'est pas une utilisation efficace de l'infixe. LI>
k = toinfx [A / B + arctan [A / B]] code> li>
OL>
infix [] code> travailler pour tous (feuilles)? P> P>
3 Réponses :
Voici aller simple:
In[963]:= toInfixAlt[a/b+ArcTan[a/b]] Out[963]= (a b ~Power~ (-1)) ~Plus~ ArcTan[a ~Times~ (1/b)]
Merci! Semble que cela échoue également avec A / B + arctan [A / B] code>. Ai-je raison?
@belisarius Je viens de modifier pour inclure ce cas (ajouté _ [_] code> au motif du code).
Un peu dans la tenue de l'expression semble tort. Essayez TOINFIXALT [SOLVE [X ^ 5 + 2 x + 1 == 0, X]] CODE>
@Belisarius J'avais une fuite d'évaluation dans le code (honte sur moi :)). Correction maintenant (ajouté inévalué code> intérieur
atomq code>).
@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 i> différemment, puisque infixe code> est maintenant parti pour cette partie. Vous ne pouvez pas avoir les deux - ni
infixsi code> et plus de parens, ou no
infixsiez code>, 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] code>
@Belisarius C'est ce que je disais. Vous ne pouvez pas faire cela avec infixe code> sans modifier les règles de formatage pour
infixe code>, puisque
infixe code> 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]]]]]]]] code>, 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]] code> par exemple (produit
(A ~ ff ~ b) ~ gg ~ C code>). Je ne vois tout simplement pas comment pouvez-vous produire quelque chose comme
a ~ ff ~ b ~ gg ~ c code> avec
infixe code> (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 code> 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 code> Rendu (règles de syntaxe). S'il vous plaît dites-moi comment construire
a ~ ff ~ b ~ gg ~ c code> (sans parens supplémentaires) en utilisant
infixe code> (l'expression est
gg [FF [A, B ], c] code>), 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 i> 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 code> uniquement. Comment souhaitez-vous alors imprimer / afficher le code - avec
CellPrint code>?
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) code>. Étant donné que
precedence / @ {fois, Power} code> donne
{400., 590.} Code>, je m'attendrais à ce que le résultat soit
a / b code> , mais c'est
1 / (ab) code> 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 i> (à 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 [] Code> 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)]]] CODE>. Profondeur-First Scan donnera
A ~ Power ~ 2 ~ fois ~ ~ B ~ POWER ~ (-1) CODE> (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) code> 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) Code> Interprétation à
(A ~ Power ~ 2) ~ Times ~ ( B ~ Puissance ~ (-1)) Code> 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! :)
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[{##}, "~"] &)
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 code> par exemple. Votre code ne couvre pas cela.
@belisarius d'accord :-) Leonid, je ne prenais vraiment pas cette question au sérieux.
Voici mon approche, très similaire à celle de Leonid:
Ne semble pas fonctionner correctement sur SOLVE [x ^ 5 + 2 x + 1 == 0, x] code>. Utilisation de
inévalué @ ROLVE [...] code> aide quelque peu, mais pas entièrement. De plus, des choses comme
# 1 ^ 2 + # 2 ^ 2 & code> sont problématiques.
@Belisarius Désolé, n'a pas vu votre commentaire.
+1 pour tenter d'automatiser une blague
Je peux totalement voir cela être très i> utile: p
Qu'est-ce qui ne va pas avec
(c ~ fois ~ (a ~ power ~ b)) ~ POWER ~ D CODE>? 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.