Salut, voila je suis entrain de faire une fonction qui permet la simplification d'expressions mathematiques (de base pour le moment), un espece de calculette à la noix quoi (du style celle de PowerTools sous Windows).
L'utilisateur rentre une expression : "f(x)=1+x", ca enregistre la fonction dans un environnement. Il peut lancer une evaluation : "f(1)", obtenir la derivée ou simplifier le corps de la fonction (du style "f(x)=1+2+x" => "f(x)=3+x" ) mais il y a un hic.
Le parseur construit (grace a des operations semantiques) un arbre prefixé de l'expression :
1+2-3 => (- (+ 1 2) 3) On obtient donc un arbre. (pas forcement binaire dans certains cas)
J'ai fait donc un simplificateur (ou évaluateur partiels) assez "bidon" qui se balade dans l'arbre recursivement et des qu'il croise une racine "+" verifie que ses deux fils sont des nombres pour cree une feuille (qui est le resultat de l'addition des deux fils) à la place de la racine, le probleme c'est qu'evidement il ne gere pas la simplification d'une expression comme "1+x-1" car en prefixé ca donne "(- (+ x 1) 1)" ou le sous arbre "(+ x 1)" n'est pas simplifiable.
J'ai pensé d'abord à faire un tri qui regroupe toutes les constantes dans un sous arbre et les variables dans l'autre ... c'est tres couteux et ca ne donne pas forcement de resultat satisfaisant. Ensuite, on pourrais faire de la simplification pendant le parsage , mais c'est tres light car se limite à des choses comme x*0=0 ou x*1=x etc ...
J'ai pas vraiment trouvé de choses interresantes (comme les algos utilisé dans les progs comme Mapple ou Mathematica
dans le dernier un expression comme x²+x est équivalente, si ce n'est égale à x(x+1)), tout conseil ou avis serai fort agréable
Merci.
---------------
Scheme is a programmable programming language ! I heard it through the grapevine !