(* Transitions *)

  (* Reachable states form "Sini" with transitions "tr" *)

  Inductive RState (Sini : S) : S -> Prop :=
    | rsIni : RState Sini Sini
    | rsNext :
        forall (s1 s2 : S) (l : Label),
        RState Sini s1 -> tr s1 l s2 -> RState Sini s2.(* Transitions *)

  (* Reachable states form "Sini" with transitions "tr" *)

  Inductive RState (Sini : S) : S -> Prop :=
    | rsIni : RState Sini Sini
    | rsNext :
        forall (s1 s2 : S) (l : Label),
        RState Sini s1 -> tr s1 l s2 -> RState Sini s2.(* Transitions *)

  (* Reachable states form "Sini" with transitions "tr" *)

  Inductive RState (Sini : S) : S -> Prop :=
    | rsIni : RState Sini Sini
    | rsNext :
        forall (s1 s2 : S) (l : Label),
        RState Sini s1 -> tr s1 l s2 -> RState Sini s2.(* Reachable states form "Sini" with transitions "tr" in time units *)

  Inductive RState_T (Sini : S) : S -> Instant -> Prop :=
    | rsIni_T : RState_T Sini Sini time0
    | rsTime_T :
        forall (s1 s2 : S) (t : Instant),
        RState_T Sini s1 t -> tr s1 Tick s2 -> RState_T Sini s2 (Inc t)
    | rsNoTime_T :
        forall (s1 s2 : S) (l : Label) (t : Instant),
        RState_T Sini s1 t -> l <> Tick -> tr s1 l s2 -> RState_T Sini s2 t.(* Reachable states form "Sini" with transitions "tr" in time units *)

  Inductive RState_T (Sini : S) : S -> Instant -> Prop :=
    | rsIni_T : RState_T Sini Sini time0
    | rsTime_T :
        forall (s1 s2 : S) (t : Instant),
        RState_T Sini s1 t -> tr s1 Tick s2 -> RState_T Sini s2 (Inc t)
    | rsNoTime_T :
        forall (s1 s2 : S) (l : Label) (t : Instant),
        RState_T Sini s1 t -> l <> Tick -> tr s1 l s2 -> RState_T Sini s2 t.(* Reachable states form "Sini" with transitions "tr" in time units *)

  Inductive RState_T (Sini : S) : S -> Instant -> Prop :=
    | rsIni_T : RState_T Sini Sini time0
    | rsTime_T :
        forall (s1 s2 : S) (t : Instant),
        RState_T Sini s1 t -> tr s1 Tick s2 -> RState_T Sini s2 (Inc t)
    | rsNoTime_T :
        forall (s1 s2 : S) (l : Label) (t : Instant),
        RState_T Sini s1 t -> l <> Tick -> tr s1 l s2 -> RState_T Sini s2 t.(* Reachable states form "Sini" with transitions "tr" in time units *)

  Inductive RState_T (Sini : S) : S -> Instant -> Prop :=
    | rsIni_T : RState_T Sini Sini time0
    | rsTime_T :
        forall (s1 s2 : S) (t : Instant),
        RState_T Sini s1 t -> tr s1 Tick s2 -> RState_T Sini s2 (Inc t)
    | rsNoTime_T :
        forall (s1 s2 : S) (l : Label) (t : Instant),
        RState_T Sini s1 t -> l <> Tick -> tr s1 l s2 -> RState_T Sini s2 t.(**************************************************************************)
  (*                       Invariants and Reachability                      *)
  (**************************************************************************)  

  (* Init => FA[] P *)

  Definition ForAll (Sini : S) (P : S -> Prop) :=
    forall s : S, RState Sini s -> P s.(* Init => FA[](bound t) P *)

  Definition ForAll_T (Sini : S) (P : S -> Prop) (bound : Instant -> Prop) :=
    forall (s : S) (t : Instant), bound t -> RState_T Sini s t -> P s.(* Init => EX<> P *)

  Inductive Exists (Sini : S) (P : S -> Prop) : Prop :=
      exists_ : forall s : S, RState Sini s -> P s -> Exists Sini P.(* Init => EX<> P *)

  Inductive Exists (Sini : S) (P : S -> Prop) : Prop :=
      exists_ : forall s : S, RState Sini s -> P s -> Exists Sini P.(* Init => EX<>(bound t) P *)

  Inductive Exists_T (Sini : S) (P : S -> Prop) (bound : Instant -> Prop) :
  Prop :=
      exists_T :
        forall (s : S) (t : Instant),
        bound t -> RState_T Sini s t -> P s -> Exists_T Sini P bound.(* Init => EX<>(bound t) P *)

  Inductive Exists_T (Sini : S) (P : S -> Prop) (bound : Instant -> Prop) :
  Prop :=
      exists_T :
        forall (s : S) (t : Instant),
        bound t -> RState_T Sini s t -> P s -> Exists_T Sini P bound.

Theorem Conj : forall (Sini : S) (P1 P2 : S -> Prop), ForAll Sini P1 -> ForAll Sini P2 -> ForAll Sini (fun s : S => P1 s /\ P2 s).