Poly
Poly
Poly
Philippe Muller
septembre 2004
Le langage de programmation :
permet de donner des instructions ;
constitue un cadre d’organisation des processus de
calcul.
Pour la programmation on distingue souvent deux sortes ”d’objets”:
les données (par ex. les nombres)
les procédures (par ex. l’addition de nombres)
# 10 + (3*4);;
- : int = 22
+, /, * sont des opérateurs décrivant des procédures primitives, les
nombres sont des expressions primitives.
Une expression composée est formée à partir d’expressions (primitives ou
non) et d’opérateurs, terminée par ; ;
operateur
z}|{
3
|{z} + (5 ∗ 4) ; ;
| {z }
expression expression
# "toujours" + 29 ;;
Entrée interactive:
> "toujours" + 29 ;;
> ^^^^^^^^^^
Cette expression est de type string,
mais est utilisée avec le type int.
# let j = 20 ;;
j : int = 20
# 30 - j ;;
- : int = 10
# let k = 3* j + 27;;
k : int = 87
La définition est le moyen de base de l’abstraction.
Elle permet :
de représenter le résultat d’opérations composées ;
de construire des objets complexes par étapes
⇒ développement et test incrémental des programmes.
Pour cela il faut pouvoir définir des procédures, moyen d’abstraction plus
puissant que le nommage d’un objet, en nommant des opérations
composées à partir de paramètres.
fact(n) = n ∗ (n − 1) ∗ · · · ∗ 3 ∗ 2 ∗ 1 = n ∗ fact(n − 1)
2 Ecrire une procédure qui calcule la suite de Fibonacci:
u(0) = 1
u(1) = 1
u(n) = u(n − 1) + u(n − 2)
rec. sémantique :
(fact 5) rec. syntaxique seulement :
→ 5*(fact 4) (racine1 2.0 1.0)
→→ 5*4*(fact 3) (racine1 2.0 1.5)
→→→ 5*4*3*(fact 2) (racine1 2.0 1.4167)
...→ 5*4*3*2*(fact 1) (racine1 2.0 1.41412)
...→ 5*4*3*2*1*(fact 0) 1.41412
puis “remontée” des appels
let max3 a b c =
let m=(max a b)
in (if m>c then m
else c);;
On peut définir plusieurs liaisons (évaluées indépendamment) :
let max3 a b c =
let m1=(max a b)
and m2=(max b c)
in (max m1 m2);;
si plusieurs définitions successives sont nécessaires, il faut imbriquer:
let a = 3.2/.53.5 in let b = a *. a in ...
let racine x =
let rec ameliore estimation x =
(moyenne estimation (x /. estimation))
and assez_bon estimation x =
(abs_float ((carre estimation) -. x)) < 0.0001
in let rec racine1 estimation x =
if (assez_bon estimation x)
then estimation
else (racine1 (ameliore estimation x) x)
in racine1 1.0 x ;;
on veut faire une procédure qui donne le min et en même temps le max
de deux entiers. Mais une fonction ne renvoie qu’une valeur.
→ on peut utiliser un type composé de deux valeurs: un doublet.
Notation : (2,3)
let minmax x y = if x < y then (x,y) else (y,x);;
let minmax x y = (min x y), (max x y);;
De même on peut utiliser des triplets, des n-uplets... (tuples).
let zorgbl x y =
let m = minmax x y
in (2 * (fst m) + (snd m));;
let zorgbl x y =
let (m1,m2) = minmax x y
in (2* m1 + m2);;
hd [ 23 ; 45 ; 78 ] ; ; retourne 23
tl [ 23 ; 45 ; 78 ] ; ; retourne [ 45 ; 78 ]
On peut construire une liste avec les opérateurs suivants :
1 dernier l
2 enlever 1 x l
3 enlever tous x l
4 append → concaténation (la refaire!)
5 reverse (inversion)
décomposer le problème
isoler les parties
⇒ facile à modifier + facile à réutiliser
encore un exemple :
modifier “ensemble” avec arbre binaire
ens vide / est vide / ajoute elem / un elem / autre elem /
appartient
comparaison performances ?