Caml Light
Caml Light était une implémentation légÚre du langage de programmation Caml développé par l'INRIA. Elle est aujourd'hui obsolÚte[1]. Cette version de Caml permettait une programmation fonctionnelle et impérative, mais pas la programmation orientée objet proposée par OCaml, son successeur.
Ce langage a été utilisé en classe préparatoires scientifiques françaises (MPSI puis MP option informatique) pour initier les élÚves à l'algorithmique entre 1995[2] et 2017[3]. Il est désormais remplacé par OCaml.
Exemples
Fonction factorielle
Pour des entiers naturels, la fonction factorielle est définie par :
et sa définition récursive est :
En Caml Light, cela donne :
let rec fact = function
| 0 -> 1
| n -> n * fact (n - 1);;
Algorithme d'Euclide
L'algorithme d'Euclide, pour calculer le pgcd de deux entiers naturels u, v, s'Ă©crit en Caml Light
let rec pgcd u v =
if u = 0 then v
else pgcd (v mod u) u;;
Suite de Fibonacci
La suite de Fibonacci est définie par :
.
En Caml Light on a la version récursive naïve, qui s'exécute en temps exponentiel :
let rec fibonacci n =
match n with
| 0 -> 0
| 1 -> 1
| _ -> fibonacci (n - 1) + fibonacci (n - 2) ;;
let f = fibonacci 9 ;;
ou encore, en version récursive terminale prenant en argument les deux premiers termes et et s'exécutant en temps linéaire :
let rec fibonacci n a b =
match n with
| 0 -> a
| 1 -> b
| _ -> fibonacci (n - 1) b (a + b) ;;
let f = fibonacci 9 0 1 ;;
On combine couramment les deux, pour disposer Ă lâextĂ©rieur dâune fonction simple, et Ă lâintĂ©rieur de la rĂ©cursion terminale :
let fibonacci n =
(* Définir la version récursive avec récursion terminale⊠*)
let rec fib_2termes n a b =
match n with
| 0 -> a
| 1 -> b
| _ -> fib_2termes (n - 1) b (a + b)
(* ⊠et lâutiliser. *)
in fib_2termes n 0 1 ;;
let f = fibonacci 9 ;;
On dispose aussi de deux versions itératives s'exécutant en temps linéaire (), la premiÚre en espace linéaire et la seconde en espace constant :
let fibonacci n =
(* Un vecteur (tableau) de n+1 éléments entiers initialisés à 1. *)
let t = make_vect (n + 1) 1 in
(* Calculer ce vecteur pour les éléments n° 2 à n. *)
for k = 2 to n do
t.(k) <- t.(k - 1) + t.(k - 2)
done;
(* Le résultat est dans le dernier élément du vecteur. *)
t.(n);;
let f = fibonacci 9 ;;
let fibonacci n =
(* 3 variables modifiables (refs) n1, n2, aux. *)
let n1 = ref 1 in
let n2 = ref 1 in
let aux = ref 1 in
(* Recalculer itĂ©rativement ces variables jusquâĂ n. *)
(* Syntaxe: !x dĂ©note lâaccĂšs Ă la valeur actuelle de x. *)
for k = 2 to n do
aux := !n1;
n1 := !n2;
n2 := !n2 + !aux;
done;
(* Le résultat est dans n2. *)
!y;;
let f = fibonacci 9 ;;
Notes et références
- Cette implémentation est techniquement dépassée, ne fait plus l'objet d'aucune maintenance, et sera bientÎt supprimée., Site officiel de Caml à l'INRIA
- [PDF] Programme d'informatique en MPSI et MP, B.O. Hors série no 3 du 29 avril 2004, annexe VII.
- Note de service ESRS1732186N du 27 novembre 2017
Annexes
Bibliographie
- [PDF] Pierre Weis, Xavier Leroy, LE LANGAGE CAML. DeuxiĂšme Ă©dition.
- Michel Demazure, Cours d'algÚbre. Primalité, divisibilité, codes Cassini 1997. De nombreux algorithmes en Caml Light.