Fixpoint map_app_list1 (pf : ad -> ad) (l : list ad)
(m : Map A) {struct m} : list ad :=
match m with
| M0 => l
| M1 a y => pf a :: l
| M2 m1 m2 =>
map_app_list1 (fun a0 : ad => pf (Ndouble_plus_one a0))
(map_app_list1 (fun a0 : ad => pf (Ndouble a0)) l m1) m2
end.

(* Specifications: *)
Lemma map_app_list1_lemma_1 :
forall (m : Map A) (pf : ad -> ad) (l : list ad) (a : ad),
In a l -> In a (map_app_list1 pf l m).
Lemma map_app_list1_lemma_2 :
forall (m : Map A) (pf fp : ad -> ad) (l : list ad),
(forall a0 : ad, fp (pf a0) = a0) ->
forall a : ad,
In a (map_app_list1 pf l m) ->
In a l \/ in_dom _ (fp a) m = true /\ pf (fp a) = a.
Lemma map_app_list1_lemma_3 :
forall (m : Map A) (pf fp : ad -> ad) (l : list ad),
(forall a0 : ad, fp (pf a0) = a0) ->
no_dup_list _ l ->
(forall a : ad, in_dom _ a m = true -> ~ In (pf a) l) ->
no_dup_list _ (map_app_list1 pf l m).
Lemma map_app_list1_lemma_4 :
forall (m : Map A) (pf : ad -> ad) (l : list ad) (a : ad),
in_dom _ a m = true -> In (pf a) (map_app_list1 pf l m).