let declarations ids =
  let section = function
    | TYPE _ | RECORD _ -> 0
    | FUNCTION _ -> 1
    | PREDICATE _ -> 2
    | AXIOM _ -> 3
  in
  let sort d1 d2 = section d1.d_item - section d2.d_item in
  let acc = ref [] in
  List.iter
    (fun f ->
       try acc := get_declaration f :: !acc
       with Not_found -> ())
    ids ;
  List.sort sort !acc