(* égalité dans bool puis sur les (Map bool) (dans bool) *)
Definition eq_bool (b0 b1 : bool) : bool :=
match b0, b1 with
| false, false => true
| false, true => false
| true, false => false
| true, true => true
end.

(* Specifications: *)
Lemma eq_bool_equal : forall b0 b1 : bool, eq_bool b0 b1 = true -> b0 = b1.
Lemma equal_eq_bool : forall b : bool, eq_bool b b = true.
Fixpoint eqm_bool (x y : Map bool) {struct y} : bool :=
match x, y with
| M0, M0 => true
| M0, M1 _ _ => false
| M0, M2 _ _ => false
| M1 _ _, M0 => false
| M1 a b, M1 c d => Neqb a c && eq_bool b d
| M1 _ _, M2 _ _ => false
| M2 _ _, M0 => false
| M2 _ _, M1 _ _ => false
| M2 a b, M2 c d => eqm_bool a c && eqm_bool b d
end.
Lemma eqm_bool_equal : forall x y : Map bool, eqm_bool x y = true -> x = y.
Lemma equal_eqm_bool : forall x : Map bool, eqm_bool x x = true.
(* lemmes auxilliaires sur les comparaisons *)
Lemma lem_get_leb :
forall (m0 m1 : Map bool) (a : ad) (b0 b1 : bool),
lem m0 m1 ->
MapGet bool m0 a = Some b0 ->
MapGet bool m1 a = Some b1 -> leb b0 b1.
Lemma lem_domain_equal :
forall m0 m1 : Map bool, lem m0 m1 -> domain_equal bool bool m0 m1.