### 6.14.1 Qu’est-ce qune expression

Il ne faut pas confondre expression et fonction.
Une expression est une combinaison de nombres et de variables reliés par des opérations alors qu’une fonction associe à une variable une expression.
Par exemple :
`a:=x^2+2*x+1` définit une expression et `b(x):=x^2+2*x+1` définit une fonction.
On obtient la valeur de l’expression `a` en 0, avec `subst(a,x=0)` et la valeur de la fonction `b` en 0, avec `b(0)`.
On peut aussi considérer une expression comme un arbre.
Par exemple, si `A:=3+2*x/y` ou si `B:=sin(2x+3)` on a :

- le sommet de l’arbre `A` est l’opérateur `’+’` et le sommet de l’arbre `B` est la fonction `’sin’`.
  On a :
  `sommet(A)` renvoie `’+’`
  `sommet(B)` renvoie `’sin’`
- les feuilles de l’arbre `A` sont `3,2*x/y` (car `’+’` est un opérateur binaire) et la feuille de l’arbre `B` est `2*x+3` (car `’sin’` est une fonction d’une variable).
  On a :
  `feuille(A)` renvoie `3,2*x/y`
  `feuille(B)` renvoie `2*x+3`
- la feuille `2*x/y` est elle-même un arbre de sommet `’*’` etc...
- Les variables `A` et `B` permettent de retrouver la structure d’arbre en effet :
  `A[0],A[1],A[2],A[2,0],A[2,1],A[2,2],A[2,3],A[2,3,0],A[2,3,1]`
  renvoie : `’+’,3,2*x,’*’,2,x,1/y,’inv’,y`
  `B[0],B[1,0],B[1,1],B[1,2],B[1,1,0],B[1,1,1],B[1,1,2]`
  renvoie : `’sin’,’+’,2*x,3,’*’,2,x`

Attention
Si `C:=2*x-y` alors
`sommet(C)` renvoie `’+’` et
`feuille(C)` renvoie `2*x,-y`
car l’expression est `C` s’écrit `2*x+(-y)`
De même si `D:=x/3` alors
`sommet(D)` renvoie `’*’` et
`feuille(C)` renvoie `x,1/3`
car l’expression est `D` s’écrit `x*1/3`
On a alors :
`C[0],C[1],C[1,0],C[1,1],C[1,2],C[2],C[2,0],C[2,1]`
renvoie : `’+’,2*x,’*’,2,x,-y,’-’,y` (`’-’` est le "moins" unaire).
Et :
`D[0],D[1],D[2],D[2,0],D[2,1],B[1,1,2]`
renvoie : `’*’,x,1/3,’inv’,3`
Remarque
Ce qui suit n’est valable que pour des programmeurs confirmés avec les manipulations qui suivent, les erreurs sont faciles !
On peut changer le sommet ou une feuille terminale en affectant l’une des variables `A[0],A[1],A[2],A[2,0],A[2,1],A[2,2],A[2,3],A[2,3,0],A[2,3,1]`
ou `B[0],B[1,0],B[1,1],B[1,2],B[1,1,0],B[1,1,1],B[1,1,2]`
MAIS il faut faire cela avec prudence car le système ne fait pas de vérifications et n’enverra pas de message d’erreurs.
On tape :
`A:=3+2*x/y`
`A[0]:=’*’` Et `A` renvoie `6*x/y` Maintenant :`A[1]` renvoie `6`
On peut taper :
`A[1]:=2+z` Maintenant `A` renvoie `(2+z)*x/y`
On tape :
`B:=sin(2*x+3)`
`B[0]:=cos` Et `B` renvoie `cos(2*x+3)` Puis, on tape :
`B[1,2]:=y` et `B` renvoie `cos(2*x+y)`