Fixpoint MapPut1 (a:ad) (y:A) (a':ad) (y':A) (p:positive) {struct p} :
Map :=
match p with
| xO p' =>
let m := MapPut1 (Ndiv2 a) y (Ndiv2 a') y' p' in
match Nbit0 a with
| false => M2 m M0
| true => M2 M0 m
end
| _ =>
match Nbit0 a with
| false => M2 (M1 (Ndiv2 a) y) (M1 (Ndiv2 a') y')
| true => M2 (M1 (Ndiv2 a') y') (M1 (Ndiv2 a) y)
end
end.

(* Specifications: *)
Lemma MapGet_if_commute :
forall (b:bool) (m m':Map) (a:ad),
MapGet (if b then m else m') a = (if b then MapGet m a else MapGet m' a).