On veut évaluer l'expression (5+1)2. Pour
cela on peut la considérer, soit comme
(5+1)×(5+1)
, soit comme la forme
développée 52+2×5+1
.
Comme un carré est un produit, l'arbre syntaxique
a pour racine le symbole *
qui
désigne la multiplication :
Comme on le voit ci-dessus, les expressions déjà évaluées (les nombres) sont en forme de rectangle, les cercles étant réservés aux opérations.
La première somme porte sur deux opérandes (5
et 1
) et on peut la remplacer par la
somme des deux opérandes, ce qui modifie la forme
du sommet (c'est un nombre, pas une opération, donc
on le met en rectangle) :
On fait pareil pour la seconde somme :
On n'a plus qu'un produit à calculer (celui de 6 et 6) donc on effectue ce produit pour finir d'évaluer l'expression :
L'arbre de l'expression développée 52+2×5+1
est a priori un arbre ternaire puisque la
somme comporte trois termes. Mais on peut le ramener
à un arbre binaire avec
(5*5) + (2*5+1)
:
Le produit partiel le plus bas dans l'arbre est 2×5, on peut donc déjà effectuer ce calcul :
Ensuite on peut effectuer l'autre produit :
Puis une des additions :
Finalement en exécutant l'addition 25+11
on obtient
soit le même résultat qu'avec l'autre méthode.
Ceci veut dire que 52+2×5+1 = (5+1)2
.
Le premier arbre de calcul nécessitait une multiplication et deux additions, le second nécessitait deux multiplications et deux additions. Comme il faut en général nettement plus de temps pour effectuer une multiplication qu'une addition, on peut se demander quel est l'intérêt de la seconde méthode.
Si au lieu de 5
on a √5
la première méthode ne peut donner qu'une valeur
approchée et non exacte : le calcul de
√5+1
ne donne rien d'autre qu'une
valeur approchée, et ensuite on élève au carré une valeur
approchée ce qui ne peut donner qu'une valeur
approchée.
La seconde méthode par contre donne pour le premier
produit, √5×√5 = 5
qui est
exact. Le calcul se termine alors par
5+2×√5+1 = 6+2√5
. Les calculatrices
récentes des marques Ti, Casio, hp et Numworks font
cela. On appelle cela le calcul exact.
Citons cet article d'Émilie Feral :
Lorsque l’on tape un calcul, celui-ci est analysé puis stocké sous forme d’arbre.
Or, écrire l'arbre sous forme développée, permet d'obtenir la valeur exacte s'il y a des racines carrées.
Il semble donc que la calculatrice Numworks transforme les expressions en les développant pour ensuite faciliter le calcul s'il y a besoin de la valeur exacte. Mais pas toujours :
Si, au lieu de 5
, on a ∞
,
(∞+1)2=∞2=∞
,∞2+2×∞+1=∞+∞+1=∞+1=∞
.Si, au lieu de 5 on a -∞, par contre,
(-∞+1)2=(-∞)2=∞
,(-∞)2+2×(-∞)+1=∞-2×∞+1=∞-∞+1
qui est indéterminé.La forme développée n'est donc pas toujours la meilleure.
Autrefois, avec la Numworks, lorsque la variable
x
n'était pas affectée, le calcul de
(x+1)2
donnait
x2+2×x+1
. Ceci a été
rétabli sur le firmware tiers omega
puis sur son descendant
khi.
La curryfication consiste à ne pas regarder l'opération
comme portant sur deux opérandes mais comme une
fonction. Par exemple sur l'arbre de la
multiplication 6×6
:
On regarde la partie coloriée comme un tout (une fonction à appliquer au reste de l'arbre) :
La partie coloriée (multiplier par 6 le reste de l'arbre) correspond au mot sextuple et donc la curryfication donne « le sextuple de 6 ». On peut donc dire que la curryfication aplanit les arbres de calcul, en les rendant linéaires.
Cela se voit mieux avec un parcours suffixe de l'arbre, où on peut effectuer des regroupements que la curryfication rend visibles.
Les exemples suivants sont écrits dans le langage
de programmation Postscript
qui est
basé sur la notation polonaise inverse (lecture
suffixe des expressions)
Pour simplifier les notations par la suite, on
définit une fonction carré qui élève un nombre
au carré. Pour cela, on duplique (dup
) le
nombre puis on effectue une multiplication (mul
)
ce qui a bien pour effet de multiplier le nombre par
lui-même, c'est-à-dire de l'élever au carré :
/aucarré { dup mul } def
Alors (5+1)×(5+1) = (5+1)2
s'écrit ainsi en Postscript
5 1 add aucarré
La curryfication isole une partie :
5 1 add aucarré
Il est d'ailleurs possible de nommer la partie surlignée :
/successeur { 1 add } def
Alors l'expression devient plus simple :
5 successeur aucarré
Le carré du successeur de 5 : la structure linéaire (et non arborescente) est devenue flagrante.
Pour la version développée 52+2×5+1
,
c'est plus compliqué, ne serait-ce que parce que le
nombre 5 intervient plusieurs fois (élevé au carré,
puis plus tard multiplié par 2). on doit donc le
dupliquer (dup
), puis après avoir
élevé au carré une des deux copies, échanger
(exch
) celles-ci pour opérer sur celui
des deux 5 qui n'a pas été élevé au carré, et ensuite
multiplier (mul
) cette copie par 2,
puis additionner (add
) 1, et
enfin additionner le tout :
5 dup aucarré exch 2 mul 1 add add
Mail là aussi, la curryfication aide à isoler des fonctions (d'arité 1) :
5 dup aucarré exch 2 mul 1 add add
En fait il n'y avait pas besoin d'aplanir l'arbre par une lecture suffixe, pour isoler ces fonctions :
Et là encore, les nommer permet de mieux décrire l'expression développée :
/double { 2 mul } def
/successeur { 1 add } def
L'expression devient alors
5 dup aucarré exch double successeur add
Le carré de 5, additionné avec le successeur de son double.