delaLDB;symétriquement, lalistedcontientlesderniersélémentsdelaLDB, enordreinverse,
etlatêtede cetteliste coïncidedoncavec l’extrémitédroitedelaLDB.
On définitletypeldb suivantpour représenterlesLDB:
(* Caml *) {Pascal }
type ldb = {
lg : int ; g : dya list ;
ld : int ; d : dya list } ; ;
type liste_dya = ˆcell_ld ; cell_ld = record
dya : dya ; suite_ld : liste_dya ; end ;
type ldb = record
lg : integer ; g : liste_dya ;
ld : integer ; d : liste_dya ; end ;
Onsedonneune constante entièrec≥2etonimposesurletypeldb lesdeuxinvariants suivants:
Le champlg contientlalongueurdelalisteg,etle champld celledelalisted.(1)
lg ≤c×ld +1etld ≤c×lg +1(2)
Touteslesquestionsde cettepartiegarantirontlesinvariantsausensprécisédansl’introduction du
problème, laquestion16 étantun peu particulière.
Question13 Définirunefonctionldb_est_vide quidéterminesiuneLDBestvide.
(* Caml *) ldb_est_vide : ldb -> bool
{ Pascal } function ldb_est_vide(l : ldb) : boolean
Question14 Définirunefonctionpremier_g quirenvoiel’élémentleplusà gauched’uneLDB,
i.e.tellequepremier_g hx1;x2;...;xni=x1.OnsupposeraquelaLDBcontientaumoinsun
élément.
(* Caml *) premier_g : ldb -> dya
{ Pascal } function premier_g(l : ldb) : dya
Question15 Définirunefonctioninverse_ldb qui inversel’ordredesélémentsd’uneLDB, i.e.
tellequeinverse_ldb hx1;x2;...;xni=hxn;...;x2;x1i.
(* Caml *) inverse_ldb : ldb -> ldb
{ Pascal } function inverse_ldb(l : ldb) : ldb
Question16 Définirunefonctioninvariant_ldb quivérifiesiuneLDBsatisfaitbienl’invariant
(2)etlerétablitsice n’estpasle cas.Plusprécisément, lafonctioninvariant_ldb renvoieson
argumentinchangélorsqu’il vérifiel’invariantet,dansle cascontraire,renvoieuneLDBdemême
contenu vérifiantl’invariant.Attention,dansce derniercas,on demandeun coûtdel’ordredela
tailledelaLDB. Indication:pouruneLDBcontenantℓéléments, larépartitionquirangeles⌊ℓ/2⌋
premiersélémentsdanslalistegsatisfait (2).Enfinlescandidatspourrontutiliser,sanslesdéfinir,
5