(* THERE EXISTS j <= n S.T. zj = t: INDUCTIVE DEF. *)

Fixpoint ex_j
 (m:fmap)(z t:dart)(n:nat){struct n}:Prop:=
match n with
   0%nat => z = t
 | S n0 => Iter (f m) n z = t \/ ex_j m z t n0
end.

(* Specifications: *)
Lemma ex_j_dec: forall(m:fmap)(z t:dart)(n:nat), {ex_j m z t n} + {~ex_j m z t n}.
Lemma ex_j_exist_j:forall(m:fmap)(z t:dart)(n:nat), ex_j m z t n <-> exists j :nat, (j <= n)%nat /\ Iter (f m) j z = t.
Lemma expo1_ex_j: forall(m:fmap)(z t:dart), inv_hmap m -> exd m z -> let p:= Iter_upb m z in (ex_j m z t (p - 1)%nat <-> expo1 m z t).
Lemma expo1_dec : forall (m:fmap)(z t:dart), inv_hmap m -> exd m z -> {expo1 m z t} + {~expo1 m z t}.
Lemma expo_dec: forall(m:fmap)(z t:dart), inv_hmap m -> {expo m z t} + {~expo m z t}.
Theorem period_expo : forall(m:fmap)(z t:dart), inv_hmap m -> expo m z t -> Iter_upb m z = Iter_upb m t.
Theorem period_lub : forall(m:fmap)(z:dart), inv_hmap m -> exd m z -> let nr:= Iter_upb m z in 0 < nr /\ Iter (f m) nr z = z /\ forall i:nat, 0 < i < nr -> Iter (f m) i z <> z.
Lemma ndN_pos:forall(m:fmap)(z:dart), exd m z -> 0 < ndN m.