Inductive dist_chain (A : Set) : prechain A -> Prop :=
| dist_single : forall x : Map A, dist_chain A (single A x)
| dist_concat_s :
forall x y : Map A, x <> y -> dist_chain A (concat A (single A x) y)
| dist_concat_m :
forall (x y : Map A) (z : prechain A),
x <> y ->
dist_chain A (concat A z x) -> dist_chain A (concat A (concat A z x) y).
Inductive non_dist_chain (A : Set) : prechain A -> Prop :=
| non_dist_concat_s :
forall x : Map A, non_dist_chain A (concat A (single A x) x)
| non_dist_concat_m_hd :
forall (x : Map A) (z : prechain A),
non_dist_chain A (concat A (concat A z x) x)
| non_dist_concat_m_tl :
forall (x y : Map A) (z : prechain A),
non_dist_chain A (concat A z x) ->
non_dist_chain A (concat A (concat A z x) y).
Definition sas_chain (A : Set) (T : mEnsemble A) (r : mRelation A)
(p : prechain A) : Prop := chain A T r p /\ dist_chain A p.
Definition dist_compl_def_0 (A : Set) (p : prechain A) : Prop :=
dist_chain A p \/ non_dist_chain A p.

(* Specifications: *)
Lemma dist_compl_0 :
forall (A : Set) (m : Map A), dist_compl_def_0 A (single A m).