Exercice 1


1.

#type quantité =
     Pièce of int
   | Kilo of float;;
Le type quantité est défini.
#type légume =
     { nom : string;         
       prix : float;         
       quantité : quantité;  
       seuil : quantité };;  
Le type légume est défini.
#type rayon == légume list;;
Le type rayon est défini.
#type panier == (string * quantité) list;;
Le type panier est défini.

2.

#let vérifie_quantités q1 q2 =
   match q1, q2 with
   | Pièce _, Pièce _ -> true
   | Kilo _, Kilo _ -> true
   | _ -> false;;
vérifie_quantités : quantité -> quantité -> bool = <fun>
#let différence_entre_quantités q1 q2 =
   match q1, q2 with
   | Pièce p1, Pièce p2 -> Pièce (p1 - p2)
   | Kilo l1, Kilo l2 -> Kilo (l1 -. l2)
   | _ -> failwith "différence_entre_quantités: quantités de nature différentes";;
différence_entre_quantités : quantité -> quantité -> quantité = <fun>
#let inférieur_quantités q1 q2 =
   match q1, q2 with
   | Pièce p1, Pièce p2 -> p1 < p2
   | Kilo l1, Kilo l2 -> l1 < l2
   | _ -> failwith "inférieur_quantités: quantités de nature différentes";;
inférieur_quantités : quantité -> quantité -> bool = <fun>

3.

#type panier == (string * quantité) list;;
Le type panier est défini.

4.

#let rec info_légume nom rayon = 
   match rayon with
   | [] -> failwith "Ce n'est pas la saison !"
   | leg'::rayon' -> if leg'.nom=nom then leg' else info_légume nom rayon';;
info_légume : string -> légume list -> légume = <fun>
#let prix_légume nom rayon = (info_légume nom rayon).prix;;
prix_légume : string -> légume list -> float = <fun>
#let rec prix_panier panier rayon =
   match panier with
   | [] -> 0.0
   | (nom, Pièce i) :: panier ->
       (float_of_int i) *. (prix_légume nom rayon) +. prix_panier panier rayon
   | (nom, Kilo l) :: panier ->
       l *. (prix_légume nom rayon) +. prix_panier panier rayon;;
prix_panier : (string * quantité) list -> légume list -> float = <fun>

5.

#let rec mise_à_jour_légume nom quantité rayon =
   match rayon with
   | [] -> failwith "Ce n'est pas la saison !"
   | leg::rayon' ->
       if leg.nom = nom then
         { quantité = différence_entre_quantités leg.quantité quantité; 
           nom = leg.nom; prix = leg.prix; seuil = leg.seuil } :: rayon'
       else
         leg::(mise_à_jour_légume nom quantité rayon);;
mise_à_jour_légume : string -> quantité -> légume list -> légume list = 
<fun>
#let rec mise_à_jour_panier panier rayon =
   match panier with
   | [] -> []
   | (nom, quantité)::panier' -> 
       mise_à_jour_panier panier' (mise_à_jour_légume nom quantité rayon);;
mise_à_jour_panier : (string * quantité) list -> légume list -> 'a list 
=
 <fun>

6.

#let rec légumes_à_commander rayon =
   match rayon with
   | [] -> []
   | {nom = n; quantité = q; seuil = s} :: rayon' ->
       if inférieur_quantités q s
       then (n, s)::(légumes_à_commander rayon')
       else légumes_à_commander rayon';;
légumes_à_commander : légume list -> (string * quantité) list = <fun>

Ce document a été traduit de LATEX par HEVEA.