Simplification d'une expression

Nous avons vu, dans le TD précédent, que le calcul formel s'accompagnait de la production d'expressions nécessitant la simplification.

Rappel sur les arbres syntaxiques.

Soit la fonction:
f(x) = ex2 • log(x) + log(x)3

L'interprétation de sa syntaxe donne l'arbre suivant:
+

^
e
^
x
2
log
x
^
log
x
3

On peut donc la représenter sans ambiguité sous la forme de la chaine de caractères suivante:
exp(x^2)*log(x)+log(x)^3
C'est sous cette forme qu'elle sera représentée en Prolog, et l'arbre servira de base aux opérations d'unification.
L'unification se fera donc dans l'ordre de cet arbre.

Exercice 1:

Au départ, le problème de la simplification se pose comme tout problème de calcul formel: décomposer une expression en expressions plus simples. Soient par exemple les règles:
simp(X+Y,U+V) :- simp(X,U), simp(Y,V).
simp(X*Y,U*V) :- simp(X,U), simp(Y,V).
simp((X)/(Y),(U)/(V)) :- simp(X,U), simp(Y,V).

Considérons maintenant les règles exprimant les principaux cas particuliers.
simp(0+X+Y,Z) :- simp(X+Y,Z).
simp(X^1,Y) :- simp(X,Y).
simp(1*X*Y,Z) :- simp(X*Y,Z).
simp(0*Z+X,Y) :- simp(X,Y).

Chargez donc cette base de règles, et essayez de simplifier une expression: que constatez vous?

Exercice 2:

Compléter cette base de règles.