(* This program is free software; you can redistribute it and/or      *)
(* modify it under the terms of the GNU Lesser General Public License *)
(* as published by the Free Software Foundation; either version 2.1   *)
(* of the License, or (at your option) any later version.             *)
(*                                                                    *)
(* This program is distributed in the hope that it will be useful,    *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of     *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *)
(* GNU General Public License for more details.                       *)
(*                                                                    *)
(* You should have received a copy of the GNU Lesser General Public   *)
(* License along with this program; if not, write to the Free         *)
(* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *)
(* 02110-1301 USA                                                     *)
Set Implicit Arguments.
Unset Strict Implicit.
Section TemporalOperators_Ind.
(*** Temporal operators with inductive types: definition and properties ***)
Variable Label : Set.               (* labels: dicrete transitions *)
Variable S : Set.               (* states                      *)
Variable tr : S -> Label -> S -> Prop. (* transitions                 *)
Variable inv : S -> Prop.         (* location invariants         *)
Variable inc : S -> Instant -> S. (* increase clocks of states   *)
(*  Reachable states from "Sini" with transitions "tr"  *)
Inductive RState (Sini : S) : S -> Prop :=
| rsIni : RState Sini Sini
| rsNextTick :
forall s : S,
RState Sini s -> inv (inc s tick) -> RState Sini (inc s tick)
| rsNextDisc :
forall (s1 s2 : S) (l : Label),
RState Sini s1 -> tr s1 l s2 -> inv s2 -> RState Sini s2.
(*  Reachable states from "Sini" with transitions "tr" in time units  *)
Inductive RState_T (Sini : S) : S -> Instant -> Prop :=
| rsIni_T : RState_T Sini Sini time0
| rsNextTick_T :
forall (s : S) (t : Instant),
RState_T Sini s t ->
inv (inc s tick) -> RState_T Sini (inc s tick) (Inc t)
| rsNextDisc_T :
forall (s1 s2 : S) (l : Label) (t : Instant),
RState_T Sini s1 t -> tr s1 l s2 -> inv 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<>(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.
(**************************************************************************)
(*                            Some Properties                             *)
(**************************************************************************)

Theorem Conj_T :
forall (Sini : S) (P1 P2 : S -> Prop) (bound : Instant -> Prop),
ForAll_T Sini P1 bound ->
ForAll_T Sini P2 bound -> ForAll_T Sini (fun s : S => P1 s /\ P2 s) bound.