Calcul formel : Mode d'emploi - Exemples en Maple

Claude Gomez, Bruno Salvy, Paul Zimmermann

Masson, 1995

Chapitre II, section 2.5, exercice 1, page 55.

Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/

Page du Projet Algorithmes | Page de Philippe Dumas | Page Maple de Philippe Dumas

Retour en page principale
Table des matières
Index
Maple V.4 worksheet
Maple V.5 worksheet


1 | 2 | 3 | 4 | 5

Jusqu'en Maple V.3, le typage emploie les deux-points. À partir de Maple V.4, il emploie les doubles deux-points.

1. Voici une première version propre et sans mystère, où l'on passe en argument la liste des listes à concaténer.

> append1:=proc(L::list(list))
local i;
[seq(op(i),i=L)]
end:

> L1:=[a,b,c]:
L2:=[]:
L3:=[u,v,w,x,y,z,0,1,2]:

> append1([L1,L2,L3]);

[Maple Math]

> append1([]);

[Maple Math]

En fait, il n'est guère utile d'écrire une procédure pour effectuer la transformation. La simple instruction suivante suffit.

> map(op,[L1,L2,L3]);

[Maple Math]

D'autre part l'esprit de Maple est plus mou. Il est plus dans le style des programmeurs Maple de passer en argument la séquence des listes à concaténer. Le nombre d'arguments est contenu dans la variable nargs et la variable args fournit la séquence des arguments à l'intérieur d'une procédure. On peut donc écrire la procédure suivante.

> append2:=proc()
local i;
for i to nargs do
if not(type(args[i],list)) then
ERROR(`arguments must be of type list`)
fi
od;
map(op,[args])
end:

> append2(L1,L2,L3);

[Maple Math]

> append2();

[Maple Math]

2.

> cons:=proc(x,l::list)
[x,op(l)]
end:

> cons(0,[1,2,3]);

[Maple Math]

> endcons:=proc(l::list,x)
[op(l),x]
end:

> endcons([1,2,3],0);

[Maple Math]

> endcons([],0);

[Maple Math]

2. Le texte ne dit pas comment est traité le cas où la liste est vide. En bonne logique ce cas provoque une erreur.

> first1:=proc(l::list)
op(1,l)
end:

> first1(L1);

[Maple Math]

> first1([]);

Error, (in first1) improper op or subscript selector

La solution précédente n'est pas satisfaisante car l'utilisateur aura bien du mal à trouver l'origine de l'erreur. Il faut un message plus explicite.

> first2:=proc(l::list)
if nops(l)>0 then op(1,l)
else ERROR(`first2 expects its argument to be a non void list`)
fi
end:

> first2([]);

Error, (in first2) first2 expects its argument to be a non void list

> last1:=proc(l::list)
local n;
n:=nops(l);
if n>0 then op(n,l)
else ERROR(`last1 expects its argument to be a non void list`)
fi
end:

> last1([a,b,c]);

[Maple Math]

À partir de V.4, on peut obtenir le dernier élément d'une liste en employant l'indice -1. On pourrait donc récrire la procédure comme suit.

> last2:=proc(l::list)
local n;
n:=nops(l);
if n>0 then op(-1,l)
else ERROR(`last2 expects its argument to be a non void list`)
fi
end:

> last2([a,b,c]);

[Maple Math]

4.

> reverse:=proc(l::list)
local n,i;
n:=nops(l);
[seq(l[n-i+1],i=1..n)]
end:

> reverse([a,b,c]);

[Maple Math]

> reverse([]);

[Maple Math]

5. Ici encore l'énoncé ne dit pas ce que se passe si la liste est trop courte. Il faut renvoyer un message d'erreur dans ce cas.

> rest:=proc(i::posint,l::list)
local n,j;
n:=nops(l);
if n<i then
ERROR(`rest expects its second argument to be a list
of length >`,i,`but received`,l)
else [seq(l[j],j=i..n)]
fi
end:

> rest(3,[a,b,c,d,e,f,g,h]);

[Maple Math]

> rest(3,[a,b]);

Error, (in rest) rest expects its second argument to be a list of length >, 3, but received, [a, b]

Retour en page principale