(*========================================================== I- AND L-PRECONDITIONS, QUASI-HMAPS ==========================================================*)
(* For a unique insertion of a non nil dart in a (future) qhmap: *)
Definition prec_I (m:fmap)(x:dart):=
x <> nil /\ ~ exd m x .
(* For correctness of functional link insertion, maybe incomplete, in a (future) qhmap: *)
Definition prec_Lq (m:fmap)(k:dim)(x y:dart) :=
exd m x /\ exd m y /\ ~ succ m k x /\ ~ pred m k y.
(* Quasi-map's topological invariant: in 2 parts *)
Fixpoint inv_qhmap(m:fmap){struct m}:Prop:=
match m with
V => True
| I m0 x0 => inv_qhmap m0
/\ prec_I m0 x0
| L m0 k0 x0 y0 => inv_qhmap m0
/\ prec_Lq m0 k0 x0 y0
end.
(* Definition of the qhmap type: (not used) *)
Definition qhmap:Set := {m:fmap | inv_qhmap m}.
(* Projection of a qhmap to its fmap support: *)
Definition qhmap_to_fmap(q:qhmap):fmap:=
match q with exist m _=> m end.
(* The projection is declared as a coercion: *)
Coercion qhmap_to_fmap: qhmap >-> fmap.
(*========================================================= A LOT OF PROPERTIES NEEDING inv_qhmap ONLY ==========================================================*)
(* nil isn't in a qhmap: *)

Lemma not_exd_nil :
forall m:fmap, inv_qhmap m -> ~ exd m nil.