Definition all_disjoint (l : list (A -> option B)) := forall i j, 0 <= i < Zlength l -> 0 <= j < Zlength l ->
  i <> j -> disjoint (Znth i l) (Znth j l).

(* Specifications: *)
Lemma all_disjoint_compatible : forall l, all_disjoint l -> all_compatible l.
Lemma all_disjoint_cons : forall (m : A -> option B) l, all_disjoint (m :: l) <-> disjoint m (maps_add l) /\ all_disjoint l.
Lemma all_disjoint_rev1 : forall l, all_disjoint l -> all_disjoint (rev l).
Lemma all_disjoint_rev : forall l, all_disjoint l <-> all_disjoint (rev l).
Lemma maps_add_rev : forall l, all_compatible l -> maps_add (rev l) = maps_add l.
Lemma empty_map_disjoint : forall m, disjoint empty_map m.