type zbarre = Relatif of int | MoinsInf | PlusInf ;;type intervalle = {g : zbarre ; d : zbarre} ;;(* Q5 *)let intervalle_of_bornes p q = if p > q then raise (Invalid_argument "intervalle_of_bornes") else {g = Relatif p ; d = Relatif q} ;;(* Q6 *)let dd_g q = {g = MoinsInf ; d = Relatif q} ;;let dd_d p = {g = Relatif p ; d = PlusInf} ;;(* Q7 *)let z_prŽc�de_strict x y = match (x,y) with | (MoinsInf,PlusInf) -> true | (MoinsInf,Relatif _ ) -> true | (Relatif _,PlusInf) -> true | (Relatif p,Relatif q) -> p < q | (_,_) -> false ;; let prefix << = z_prŽc�de_strict ;;let z_prŽc�de_large x y = (x = y) or (x << y) ;;(* Q8 *)let z_consŽcutifs x y = match (x,y) with | (Relatif p,Relatif q) when q = p + 1 -> true | (_,_) -> false ;;(* Q9 *)let consŽcutifs u v = z_consŽcutifs u.d v.g ;;let est_avant u v = u.g << v.g or (u.g = v.g & u.d << v.d);; (* Q10 *)let est_ˆ_gauche_de u v = u.d << v.g ;;(* let contient u v = (z_prŽc�de_large u.g v.g) & (z_prŽc�de_large v.d u.d) ;; *)let rec compacter l = match l with | [] -> [] | [i] -> [i] | u::v::q when consŽcutifs u v -> let t = {g = u.g ; d = v.d} in compacter (t::q) | u::v::q when est_ˆ_gauche_de u v -> let q' = compacter (v::q) in u::q' | u::v::q when z_prŽc�de_large u.d v.d -> let t = {g = u.g ; d = v.d} in compacter (t::q) | u::v::q -> let t = {g = u.g ; d = u.d} in compacter (t::q) ;;(* Q11 *)let rŽduire l = let l1 = sort__sort est_avant l in compacter l1 ;;(* Q12, mŽthode bestiale *)let union l1 l2 = rŽduire (l1 @ l2) ;;let i1 = intervalle_of_bornes 13 17 and i2 = intervalle_of_bornes 15 22 and i3 = intervalle_of_bornes 0 5 and i4 = dd_g 2 and i5 = dd_d 19 ;;(* Q13 *)let successeur = function | Relatif p -> Relatif (p+1) | _ -> raise (Invalid_argument "successeur") ;; let prŽdŽcesseur = function | Relatif p -> Relatif (p-1) | _ -> raise (Invalid_argument "prŽdŽcesseur") ;; let fin_complŽmentaire = function | {g = _ ; d = PlusInf} -> [] | {g = _ ; d = Relatif p} -> [dd_d (p+1)] | {g = _ ; d = MoinsInf} -> raise (Invalid_argument "fin_complŽmentaire") ;; let rec suite_complŽmentaire = function | [u] -> fin_complŽmentaire u | u::v::q -> let t' = {g = successeur u.d ; d = prŽdŽcesseur v.g} in t'::(suite_complŽmentaire (v::q)) | [] -> raise (Invalid_argument "suite_complŽmentaire") ;; let complŽmentaire_bis = function | [] -> [{g = MoinsInf ; d = PlusInf}] | {g = MoinsInf ; d = _} as t::q -> suite_complŽmentaire (t::q) | {g = Relatif p ; d = _} as t::q -> let t' = {g = MoinsInf ; d = Relatif (p-1)} in t'::(suite_complŽmentaire (t::q)) | {g = PlusInf ; d = _}::_ -> raise (Invalid_argument "complŽmentaire") ;; let complŽmentaire l = complŽmentaire_bis(rŽduire l) ;;(* Q14 *)let intersection l1 l2 = let l1' = complŽmentaire(rŽduire l1) and l2' = complŽmentaire(rŽduire l2) in complŽmentaire (union l1' l2') ;;let j1 = intervalle_of_bornes 1 4 and j2 = dd_g 20 ;;let l1 = [i1;i5;i3;i4;i2] and l2 = [j1;j2];;