(*========================================================
                      HMAPS
  ========================================================*)

(* HYPOTHESIS: a hmap could be viewed as a qhmap with
the closed version of A. Hier, it is considered as a completely 
sewn qhmap, which is approximately the same... *)

(* Invariant of the hypermaps: inv_qhmap + completeness *)

Definition inv_hmap(m:fmap):Prop :=
   inv_qhmap m
  /\ forall (x:dart)(k:dim), exd m x ->
       succ m k x /\ pred m k x.(* Definition of the hypermaps: *)

Definition hmap:Set := {m:fmap | inv_hmap m}.(* Surjection, bijection on the fmap darts: *)

Definition surj_dart(Df:dart->Prop)(f:dart->dart):Prop:=
  forall y:dart, Df y ->
     exists x:dart, Df x /\ f x = y.Definition bij_dart(Df:dart->Prop)(f:dart->dart):Prop:=       
  inj_dart Df f /\ surj_dart Df f.

Lemma A_B_1_B_xk : forall(m:fmap)(k:dim)(x0 y0:dart), inv_qhmap m -> exd m x0 -> exd m y0 -> let xk := A m k x0 in let yk := A_1 m k y0 in x0 <> xk -> y0 <> xk -> A (B_1 (B m k x0) k y0) k xk = if eq_dart_dec xk yk then nil else A m k xk.