Theory Domain_SF

Up to index of Isabelle/HOL/HOL-Complex/CSP-Prover

theory Domain_SF = Domain_T + Domain_F:

           (*-------------------------------------------*
            |                CSP-Prover                 |
            |               December 2004               |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)

theory Domain_SF = Domain_T + Domain_F:

(*****************************************************************

         1. 
         2. 
         3. 
         4. 

 *****************************************************************)

(*  The following simplification rules are deleted in this theory file *)
(*  because they unexpectly rewrite UnionT and InterT.                 *)
(*                  Union (B ` A) = (UN x:A. B x)                      *)
(*                  Inter (B ` A) = (INT x:A. B x)                     *)

declare Union_image_eq [simp del]
declare Inter_image_eq [simp del]

(*  The following simplification is sometimes unexpected.              *)
(*                                                                     *)
(*             not_None_eq: (x ~= None) = (EX y. x = Some y)           *)

declare not_None_eq [simp del]

(*********************************************************
                      not_None
 *********************************************************)

lemmas not_None = not_None not_None_T not_None_F

(***********************************************************
                 type def (Stable Failure)
 ***********************************************************)

types 'a domTF = "'a domT * 'a domF"       (* synonym *)

consts
  HC_T2    :: "'a domTF => bool"
  HC_T3    :: "'a domTF => bool"
  HC_F3    :: "'a domTF => bool"
  HC_F4    :: "'a domTF => bool"
  HC_T3_F4 :: "'a domTF => bool"

defs
  HC_T2_def : 
    "HC_T2 TF == ALL s X. (s, X) :f (snd TF)
                --> s :t (fst TF)"

  HC_T3_def : 
    "HC_T3 TF == ALL s. s @t [Tick]t :t (fst TF) & notick s
                --> (ALL X. (s @t [Tick]t, X) :f (snd TF))"

  HC_F3_def : 
    "HC_F3 TF == ALL s X Y. (s, X) :f (snd TF) & notick s &
                          (ALL a. a : Y --> s @t [a]t ~:t fst TF)
                --> (s, X Un Y) :f (snd TF)"

  HC_F4_def : 
    "HC_F4 TF == ALL s. s @t [Tick]t :t (fst TF) & notick s
                --> (s, Evset) :f (snd TF)"

  HC_T3_F4_def : 
    "HC_T3_F4 TF == ALL s. s @t [Tick]t :t (fst TF) & notick s
                    --> ((s, Evset) :f (snd TF) &
                         (ALL X. (s @t [Tick]t, X) :f (snd TF)))"

lemma HC_T3_F4_iff : "HC_T3_F4 TF = (HC_T3 TF & HC_F4 TF)"
apply (simp add: HC_T3_F4_def HC_T3_def HC_F4_def)
by (auto)

(*** BOT in SF ***)

lemma BOT_SF: "HC_T2({[]t}t , {}f) & HC_F3({[]t}t , {}f) & 
               HC_T3_F4({[]t}t , {}f)"
by (simp add: HC_T2_def HC_F3_def HC_T3_F4_def)

(*******************************
           Type SF
 *******************************)

typedef 'a domSF = "{SF::('a domTF). HC_T2(SF) & HC_T3(SF) & HC_F3(SF) & HC_F4(SF)}"
apply (rule_tac x ="({[]t}t , {}f)" in exI)
by (simp add: BOT_SF HC_T3_F4_iff[THEN sym])

declare Rep_domSF         [simp]

lemma domSF_iff: "domSF = {SF. HC_T2 SF & HC_F3 SF & HC_T3_F4 SF}"
by (auto simp add: domSF_def HC_T3_F4_iff)

(*********************************************************
          The relation (<=) is defined over domSF
 *********************************************************)

instance domSF :: (type) ord 
by (intro_classes)

defs (overloaded)
  subsetSF_def   :  "SF <= SE  ==  (Rep_domSF SF) <= (Rep_domSF SE)"
  psubsetSF_def  :  "SF <  SE  ==  (Rep_domSF SF) <  (Rep_domSF SE)"

(*********************************************************
          The relation (<=) is a partial order
 *********************************************************)

instance domSF :: (type) order
apply (intro_classes)
apply (unfold subsetSF_def psubsetSF_def)
apply (simp)
apply (erule order_trans, simp)
apply (drule order_antisym, simp)
apply (simp add: Rep_domSF_inject)
apply (simp only: order_less_le Rep_domSF_inject)
done

(***********************************************************
                          lemmas
 ***********************************************************)

(*******************************
              basic
 *******************************)

(*** T2 ***)

lemma domTF_T2:
    "[| TF : domSF ; (s, X) :f snd TF |] ==> s :t fst TF"
by (auto simp add: domSF_def HC_T2_def)

lemma domSF_T2:
    "[| (T,F) : domSF ; (s, X) :f F |] ==> s :t T"
by (auto simp add: domSF_def HC_T2_def)

(*** T3 ***)

lemma domTF_T3:
  "[| TF : domSF ; s @t [Tick]t :t fst TF ; notick s |]
   ==> (s @t [Tick]t, X) :f snd TF"
by (simp add: domSF_def HC_T3_def)

lemma domSF_T3:
  "[| (T,F) : domSF ; s @t [Tick]t :t T ; notick s |]
   ==> (s @t [Tick]t, X) :f F"
by (simp add: domSF_def HC_T3_def)

(*** F3 ***)

lemma domTF_F3:
  "[| TF : domSF ; (s, X) :f snd TF ; notick s ;
      (ALL a. a : Y --> s @t [a]t ~:t fst TF) |]
   ==> (s, X Un Y) :f snd TF"
by (simp add: domSF_def HC_F3_def)

lemma domSF_F3:
  "[| (T,F) : domSF ; (s, X) :f F ; notick s ;
      (ALL a. a : Y --> s @t [a]t ~:t T) |]
   ==> (s, X Un Y) :f F"
by (simp add: domSF_def HC_F3_def)

(*** F4 ***)

lemma domTF_F4:
  "[| TF : domSF ; s @t [Tick]t :t fst TF ; notick s |]
   ==> (s, Evset) :f snd TF"
by (simp add: domSF_def HC_F4_def)

lemma domSF_F4:
  "[| (T,F) : domSF ; s @t [Tick]t :t T ; notick s |]
   ==> (s, Evset) :f F"
by (simp add: domSF_def HC_F4_def)

(*** T3_F4 ***)

lemma domTF_T3_F4:
  "[| TF : domSF ; s @t [Tick]t :t fst TF ; notick s |]
   ==> (s, Evset) :f snd TF & (ALL X. (s @t [Tick]t, X) :f snd TF)"
by (simp add: domSF_iff HC_T3_F4_def)

lemma domSF_T3_F4:
  "[| (T,F) : domSF ; s @t [Tick]t :t T ; notick s |]
   ==> (s, Evset) :f F & (ALL X. (s @t [Tick]t, X) :f F)"
by (simp add: domSF_iff HC_T3_F4_def)

(*** F2_F4 ***)

lemma domTF_F2_F4:
  "[| TF : domSF ; s @t [Tick]t :t fst TF ; notick s ; X <= Evset |]
   ==> (s, X) :f snd TF"
apply (simp add: domSF_def HC_F4_def)
by (auto intro: memF_F2)

lemma domSF_F2_F4:
  "[| (T,F) : domSF ; s @t [Tick]t :t T ; notick s ; X <= Evset |]
   ==> (s, X) :f F"
apply (insert domTF_F2_F4[of "(T,F)" s X])
by (simp)

(*******************************
         check in domSF
 *******************************)

(*** ({[]t}t, {}f) ***)

lemma BOT_in_domSF[simp]: "({[]t}t, {}f) : domSF"
by (simp add: domSF_iff BOT_SF)

(*******************************
       BOT is the bottom
 *******************************)

lemma BOT_is_bottom_domSF[simp]: "({[]t}t , {}f) <= SF"
by (simp add: order_pair_def)

(***********************************************************
                   operators on domSF
 ***********************************************************)

consts
  pairSF :: "'a domT => 'a domF => 'a domSF"  ("(0_ ,,/ _)" [51,52] 0)

  fstSF  :: "'a domSF => 'a domT"
  sndSF  :: "'a domSF => 'a domF"

defs
  pairSF_def : "(S,,F)  == Abs_domSF (S, F)"
  fstSF_def  : "fstSF   == fst o Rep_domSF"
  sndSF_def  : "sndSF   == snd o Rep_domSF"

(***********************************************************
                     pairSF lemmas
 ***********************************************************)

lemma pairSF_fstSF: "(S,F) : domSF ==> fstSF (S,,F) = S"
apply (simp add: pairSF_def fstSF_def)
by (simp add: Abs_domSF_inverse)

lemma pairSF_sndSF: "(S,F) : domSF ==> sndSF (S,,F) = F"
apply (simp add: pairSF_def sndSF_def)
by (simp add: Abs_domSF_inverse)

lemma eqSF_decompo: 
  "(SF = SE) = (fstSF SF = fstSF SE & sndSF SF = sndSF SE)"
apply (simp add: Rep_domSF_inject[THEN sym])
apply (simp add: pair_eq_decompo)
apply (simp add: fstSF_def sndSF_def)
done

lemmas pairSF = pairSF_fstSF pairSF_sndSF eqSF_decompo

(*********************************************************
                      subsetSF
 *********************************************************)

lemma subsetSF_decompo: 
  "(SF <= SE) = (fstSF SF <= fstSF SE & sndSF SF <= sndSF SE)"
apply (simp add: subsetSF_def)
apply (simp add: order_pair_def)
apply (simp add: fstSF_def sndSF_def)
done

(*********************************************************
                       memTF
 *********************************************************)

lemmas memTF_def = memT_def memF_def

(****************** to add them again ******************)

declare Union_image_eq [simp]
declare Inter_image_eq [simp]
declare not_None_eq    [simp]

end

lemmas not_None:

  notick t ==> t ≠ None
  notick s ==> s @t [e]t ≠ None
  notick s ==> None ≠ s @t [e]t
  [| notick s; t ≠ None |] ==> s @t t ≠ None
  s ≠ None ==> [Ev a]t @t s ≠ None
  [| s ≠ None; s ≠ []t |] ==> tlt s ≠ None
  [| s ≠ None; s ≠ []t |] ==> butlastt s ≠ None
  [| tT; T ∈ domT |] ==> t ≠ None
  t :t T ==> t ≠ None
  [| (s, X) ∈ F; F ∈ domF |] ==> s ≠ None
  (s, X) :f F ==> s ≠ None

lemma HC_T3_F4_iff:

  HC_T3_F4 TF = (HC_T3 TF ∧ HC_F4 TF)

lemma BOT_SF:

  HC_T2 ({[]t}t, {}f) ∧ HC_F3 ({[]t}t, {}f) ∧ HC_T3_F4 ({[]t}t, {}f)

lemma domSF_iff:

  domSF = {SF. HC_T2 SF ∧ HC_F3 SF ∧ HC_T3_F4 SF}

lemma domTF_T2:

  [| TF ∈ domSF; (s, X) :f snd TF |] ==> s :t fst TF

lemma domSF_T2:

  [| (T, F) ∈ domSF; (s, X) :f F |] ==> s :t T

lemma domTF_T3:

  [| TF ∈ domSF; s @t [Tick]t :t fst TF; notick s |]
  ==> (s @t [Tick]t, X) :f snd TF

lemma domSF_T3:

  [| (T, F) ∈ domSF; s @t [Tick]t :t T; notick s |] ==> (s @t [Tick]t, X) :f F

lemma domTF_F3:

  [| TF ∈ domSF; (s, X) :f snd TF; notick s; ∀a. aY --> s @t [a]t ~:t fst TF |]
  ==> (s, XY) :f snd TF

lemma domSF_F3:

  [| (T, F) ∈ domSF; (s, X) :f F; notick s; ∀a. aY --> s @t [a]t ~:t T |]
  ==> (s, XY) :f F

lemma domTF_F4:

  [| TF ∈ domSF; s @t [Tick]t :t fst TF; notick s |] ==> (s, Evset) :f snd TF

lemma domSF_F4:

  [| (T, F) ∈ domSF; s @t [Tick]t :t T; notick s |] ==> (s, Evset) :f F

lemma domTF_T3_F4:

  [| TF ∈ domSF; s @t [Tick]t :t fst TF; notick s |]
  ==> (s, Evset) :f snd TF ∧ (∀X. (s @t [Tick]t, X) :f snd TF)

lemma domSF_T3_F4:

  [| (T, F) ∈ domSF; s @t [Tick]t :t T; notick s |]
  ==> (s, Evset) :f F ∧ (∀X. (s @t [Tick]t, X) :f F)

lemma domTF_F2_F4:

  [| TF ∈ domSF; s @t [Tick]t :t fst TF; notick s; X ⊆ Evset |]
  ==> (s, X) :f snd TF

lemma domSF_F2_F4:

  [| (T, F) ∈ domSF; s @t [Tick]t :t T; notick s; X ⊆ Evset |] ==> (s, X) :f F

lemma BOT_in_domSF:

  ({[]t}t, {}f) ∈ domSF

lemma BOT_is_bottom_domSF:

  ({[]t}t, {}f) ≤ SF

lemma pairSF_fstSF:

  (S, F) ∈ domSF ==> fstSF (S ,, F) = S

lemma pairSF_sndSF:

  (S, F) ∈ domSF ==> sndSF (S ,, F) = F

lemma eqSF_decompo:

  (SF = SE) = (fstSF SF = fstSF SE ∧ sndSF SF = sndSF SE)

lemmas pairSF:

  (S, F) ∈ domSF ==> fstSF (S ,, F) = S
  (S, F) ∈ domSF ==> sndSF (S ,, F) = F
  (SF = SE) = (fstSF SF = fstSF SE ∧ sndSF SF = sndSF SE)

lemma subsetSF_decompo:

  (SFSE) = (fstSF SF ≤ fstSF SE ∧ sndSF SF ≤ sndSF SE)

lemmas memTF_def:

  x :t T == x ∈ Rep_domT T
  x :f F == x ∈ Rep_domF F