type 'a t = Vide | File of int * 'a * 'a t * 'a t;;
let vide = Vide;;
let rec enlève_sommet = function
    Vide -> raise File_vide
  | File(prio, elt, Vide, Vide) -> Vide
  | File(prio, elt, gauche, Vide) -> gauche
  | File(prio, elt, Vide, droite) -> droite
  | File(prio, elt, (File(prio_g, elt_g, _, _) as gauche),
                    (File(prio_d, elt_d, _, _) as droite)) ->
      if prio_g < prio_d
      then File(prio_g, elt_g, enlève_sommet gauche, droite)
      else File(prio_d, elt_d, gauche, enlève_sommet droite);;

let extraire = function
    Vide -> raise File_vide
  | File(prio, elt, _, _) as file -> (prio, elt, enlève_sommet file);;
let rec ajoute file prio elt =
  match file with
    Vide ->
      File(prio, elt, Vide, Vide)
  | File(prio1, elt1, gauche, droite) ->
      if prio <= prio1
      then File(prio, elt, ajoute droite prio1 elt1, gauche)
      else File(prio1, elt1, ajoute droite prio elt, gauche);;
