# Maple

Maple est un logiciel propriétaire de calcul formel développé depuis les années 1980 et aujourd'hui édité par la société canadienne Maplesoft. La version la plus récente est sortie en mars 2023.
Les objets de base du calcul sont les expressions mathématiques, représentées sous forme de graphes orientés acycliques. Maple fournit un langage de programmation spécifique, inspiré d'Algol, qui est à la fois le langage d'utilisation interactive et celui dans lequel est écrite la plus grande partie de la bibliothèque mathématique du logiciel.

## Histoire

Maple a été initialement développé au sein du Symbolic Computation Group de l'université de Waterloo en Ontario (Canada) à partir de décembre 1980. La première version publique date de 1985 (version 3.3).
Maple a été utilisé dans un nombre remarquable d'applications des sciences et des mathématiques allant de la démonstration du dernier théorème de Fermat en théorie des nombres, à des problèmes de la relativité générale et de la mécanique quantique. Ces applications sont présentées dans un numéro spécial d'un bulletin d'information créé par les développeurs de Maple appelé MapleTech.

## Fonctionnalités

Le logiciel permet aussi bien de travailler sur des quantités numériques (entières, réelles, complexes) qu'avec des polynômes, des fonctions, ou des séries. Maple réalise des dérivations, des intégrations, des résolutions de systèmes d'équations linéaires, des inversions de matrices, des développements asymptotiques ou encore des résolutions d'équations différentielles sous forme symbolique, c'est-à-dire en gardant des inconnues dans la résolution. Le système Maple offre aussi de nombreuses fonctionnalités en théorie des nombres et en combinatoire.
Maple est un système interprété. Dans son utilisation la plus courante, l'utilisateur entre une ligne de commande écrite dans un langage spécifique, et le système retourne un résultat. Par exemple, la commande suivante calcule la solution de l'équation différentielle du second ordre $y''-3y=x$ vérifiant les conditions initiales $y(0)=1$ et $y'(0)=2$ :
    dsolve({diff(y(x),x,x)-3*y(x)=x,y(0)=1,D(y)(0)=2},y(x));
Il est également possible d'écrire, dans le même langage, des programmes qui ne seront pas compilés, mais interprétés à leur appel, et d'enrichir ainsi le système avec de nouvelles commandes.
Au-delà des fonctionnalités de calcul formel et de programmation à proprement parler, Maple permet par exemple de copier et coller dans un traitement de texte les formules mathématiques issues des calculs, de tracer des courbes et surfaces, ou encore de générer des programmes numériques en langage C. Il offre un mode console et un mode graphique. Il est disponible sur la majorité des systèmes d'exploitation (GNU/Linux, macOS, Windows).

## Modèle de calcul et langage
### Expressions

La structure de donnée fondamentale manipulée par Maple est l'expression.
Dans la pratique courante, lorsque l’on utilise une expression mathématique telle que $\sin(\pi /3+x)$, on a en tête une fonction ($\sin$) et un réel $\pi$ dont on connaît de nombreuses propriétés, ainsi qu’une variable $x$. Du point de vue du système, en revanche, il s’agit d’une expression, formée en l'occurrence d'une fonction nommée $\sin$ appliquée à une somme de deux termes, à savoir une variable nommée $x$ et le quotient d’une autre variable $\pi$ par l’entier $3$. Pour toutes les opérations mathématiques que l’utilisateur souhaite réaliser sur cette expression, le système ne dispose que de cette information syntaxique. Ainsi, $0$ et $1-\exp(1)\exp(-1)$ sont deux objets identiques d'un point de vue mathématique, mais très différents comme expressions Maple. Des questions centrales comme celle de la simplification, sont liées à cette distinction entre la vision syntaxique du système et la vision mathématique de l'utilisateur.
Une expression comme le produit
    $x^{2}\exp \left({\frac {3}{2}}\right)\sin \left({\frac {\pi }{3}}-{\frac {1}{x}}\right)$
est vue comme un arbre. Ici, la racine de l'arbre est étiquetée par l'opérateur de multiplication *. Ses trois fils sont les (étiquettes des) racines des arbres qui représentent les trois facteurs $x^{2}$, $\exp(3/2)$ et $\sin(\pi /3-1/x)$, à savoir ^, exp et sin. Les nœuds de l'arbre, comme la racine, représentent des opérations ou des fonctions, et les feuilles représentent soit des rationnels, soit des constantes symboliques ou des indéterminées (comme π ou x).
Les objets Maple sont (sauf exception) représentés avec partage maximal, c'est-à-dire que deux objets identiques sont représentées par le même objet en mémoire. En particulier, les arbres d'expressions sont stockés comme des graphes orientés acycliques. Concrètement, tous les objets (ou presque) construits au cours d'une session Maple sont stockés dans une table de hachage globale. Ceci s'applique non seulement aux objets nommés, mais aussi aux expressions et sous-expressions qui interviennent durant le calcul. Chaque sous-objet nouvellement créé est comparé aux éléments déjà présents dans la table. Si l'objet est nouveau, il est conservé et ajouté à la table. Si au contraire un objet identique a déjà été utilisé, l'ancien objet est immédiatement utilisé à la place. Ceci garantit l'existence d'une seule copie de chaque expression en mémoire.
Les procédures Maple travaillent sur des expressions représentées par de tels arbres et les opérations de base consistent à analyser ces arbres pour en déterminer les composants, à extraire ces composants et à les utiliser pour construire de nouveaux arbres. Les arbres qui se trouvent sous la racine sont les opérandes de l'expression et peuvent être isolés par la procédure op, leur nombre étant renvoyé par la commande nops. L'ordre des opérandes d'un opérateur commutatif peut changer d'une session à l'autre. La procédure has détermine si une expression apparaît comme sous-expression d'une autre. Elle permet par exemple de déterminer qu'une expression est indépendante d'une variable donnée.
Parmi les procédures de base qui construisent de nouveaux objets à partir d'expressions existantes, citons eval, subs, convert, select et remove. Notamment, la façon naturelle de calculer la valeur d'une fonction pour une valeur donnée de ses variables consiste à évaluer l'expression qui représente la fonction à l'aide de eval. Une procédure de plus bas niveau que eval est subs, qui effectue une simple substitution. Le logiciel applique les règles de simplification automatique, mais n'évalue pas le résultat de la substitution.
Ces procédures ne modifient pas leur argument — la plupart des objets Maple ne peuvent pas être modifiés — mais en créent des copies altérées. Grâce au partage maximal, cette copie n'entraîne pas une trop grande consommation de mémoire.

### Variables et indéterminées

Une différence notable entre le langage Maple et les langages de programmation traditionnels réside dans l'évaluation des variables non affectées. Dans la plupart des langages, cette évaluation est une erreur, alors que Maple renvoie le nom de la variable, qui peut être utilisé comme nom de variable dans une expression. Ce mécanisme permet de traiter les indéterminées mathématiques comme des variables informatiques.
L'affectation se visualise comme la création d'une flèche de la variable vers la valeur. Par exemple, la suite d'affectations x:=y; y:=z; crée une structure de la forme x → y → z. L'évaluation consiste alors à suivre ces flèches pour obtenir une valeur. Ainsi, après les affectations précédentes, x et y s'évaluent toutes deux en z.