Permis de conduire et cartes grises: solution
#type catégorie_permis = A | B | C | D | E;;
Le type catégorie_permis est défini.
#type ville = { nom_ville: string; code_postal: int };;
Le type ville est défini.
#type catégorie_voie = Rue | Avenue | Boulevard | Allée | Impasse;;
Le type catégorie_voie est défini.
#type voie = { cat: catégorie_voie; nom_voie: string };;
Le type voie est défini.
#type adresse = { numéro_adresse: int; rue: voie; commune: ville };;
Le type adresse est défini.
#type identité = { nom: string; prénom: string; domicile: adresse };;
Le type identité est défini.
#type permis =
{ personne: identité; catégories: catégorie_permis list };;
Le type permis est défini.
#type date = { jour: int; mois: int; année: int };;
Le type date est défini.
#type immatriculation = { chiffres: int; lettres: string; département: int };;
Le type immatriculation est défini.
#type carte_grise =
{ département_carte_grise: int;
date_première_mise_en_circulation: date;
numéro_immatriculation: immatriculation;
date_immatriculation: date
propriétaire: identité };;
Le type carte_grise est défini.
#type vignette =
{ département_vignette: int;
année_vignette: int;
immatriculation_vignette: immatriculation };;
Le type vignette est défini.
#let permis_voiture p = mem B p.catégories;;
permis_voiture : permis -> bool = <fun>
#let nouveau_permis p c =
{ personne = p.personne; catégories = c::p.catégories };;
nouveau_permis : permis -> catégorie_permis -> permis = <fun>
#let département_of_adresse adr = adr.commune.code_postal / 1000;;
département_of_adresse : adresse -> int = <fun>
#let achat_véhicule_occasion cg d ident =
{ département_carte_grise = département_of_adresse ident.domicile;
date_première_mise_en_circulation = cg.date_première_mise_en_circulation;
numéro_immatriculation = cg.numéro_immatriculation;
date_immatriculation = d;
propriétaire = ident };;
achat_véhicule_occasion : carte_grise -> date -> identité -> carte_grise = <fun>
#let changement_adresse ident nv_adr =
{ nom = ident.nom; prénom = ident.prénom; domicile = nv_adr };;
changement_adresse : identité -> adresse -> identité = <fun>
#let changement_domicile cg d nv_adr nv_imm =
{ département_carte_grise =
département_of_adresse nv_adr;
date_première_mise_en_circulation =
cg.date_première_mise_en_circulation;
numéro_immatriculation = nv_imm;
date_immatriculation = d;
propriétaire = changement_adresse cg.propriétaire nv_adr };;
changement_domicile : carte_grise -> date -> adresse -> immatriculation ->
carte_grise = <fun>
#let cohérence_département_carte_grise cg =
cg.département_carte_grise = cg.numéro_immatriculation.département &&
cg.département_carte_grise = département_of_adresse cg.propriétaire.domicile;;
cohérence_département_carte_grise : carte_grise -> bool = <fun>
#let avant d1 d2 =
d1.année < d2.année ||
d1.année = d2.année && d1.mois < d2.mois ||
d1.année = d2.année && d1.mois = d2.mois && d1.jour <= d2.jour;;
avant : date -> date -> bool = <fun>
#let cohérence_dates_carte_grise cg =
avant cg.date_première_mise_en_circulation cg.date_immatriculation;;
cohérence_dates_carte_grise : carte_grise -> bool = <fun>
#let rec identification imm cgl = match cgl with
| [] -> failwith "identification: immatriculation inconnue"
| cg::cgl' -> if cg.numéro_immatriculation = imm then cg.propriétaire
else identification imm cgl';;
identification : immatriculation -> carte_grise list -> identité = <fun>
#let achat_vignette cg a =
{ département_vignette = cg.département_carte_grise;
année_vignette = a;
immatriculation_vignette = cg.numéro_immatriculation };;
achat_vignette : carte_grise -> int -> vignette = <fun>
#let rec achat_vignettes_location cgl a = match cgl with
| [] -> []
| cg::cgl' -> (achat_vignette cg a)::(achat_vignettes_location cgl' a);;
achat_vignettes_location : carte_grise list -> int -> vignette list = <fun>
(* ou *)
#let achat_vignettes_location cgl a =
map (function cg -> achat_vignette cg a) cgl;;
achat_vignettes_location : carte_grise list -> int -> vignette list = <fun>
#let rec examen_permis c reçus pl = match pl with
| [] -> []
| p::pl' ->
(if mem p.personne reçus then (nouveau_permis p c) else p)::
(examen_permis c reçus pl');;
examen_permis : catégorie_permis -> identité list -> permis list -> permis list
= <fun>
Ce document a été traduit de LATEX par
HEVEA.