src/HOL/HOLCF/IOA/meta_theory/TLS.thy
author huffman
Sat, 27 Nov 2010 16:08:10 -0800
changeset 41022 0437dbc127b3
parent 37598 src/HOLCF/IOA/meta_theory/TLS.thy@893dcabf0c04
child 41193 b8703f63bfb2
permissions -rw-r--r--
moved directory src/HOLCF to src/HOL/HOLCF;
added HOLCF theories to src/HOL/IsaMakefile;
     1 (*  Title:      HOLCF/IOA/meta_theory/TLS.thy
     2     Author:     Olaf Müller
     3 *)
     4 
     5 header {* Temporal Logic of Steps -- tailored for I/O automata *}
     6 
     7 theory TLS
     8 imports IOA TL
     9 begin
    10 
    11 default_sort type
    12 
    13 types
    14   ('a, 's) ioa_temp  = "('a option,'s)transition temporal"
    15   ('a, 's) step_pred = "('a option,'s)transition predicate"
    16   's state_pred      = "'s predicate"
    17 
    18 consts
    19 
    20 option_lift :: "('a => 'b) => 'b => ('a option => 'b)"
    21 plift       :: "('a => bool) => ('a option => bool)"
    22 
    23 temp_sat   :: "('a,'s)execution => ('a,'s)ioa_temp => bool"    (infixr "|==" 22)
    24 xt1        :: "'s predicate => ('a,'s)step_pred"
    25 xt2        :: "'a option predicate => ('a,'s)step_pred"
    26 
    27 validTE    :: "('a,'s)ioa_temp => bool"
    28 validIOA   :: "('a,'s)ioa => ('a,'s)ioa_temp => bool"
    29 
    30 mkfin      :: "'a Seq => 'a Seq"
    31 
    32 ex2seq     :: "('a,'s)execution => ('a option,'s)transition Seq"
    33 ex2seqC    :: "('a,'s)pairs -> ('s => ('a option,'s)transition Seq)"
    34 
    35 
    36 defs
    37 
    38 mkfin_def:
    39   "mkfin s == if Partial s then @t. Finite t & s = t @@ UU
    40                            else s"
    41 
    42 option_lift_def:
    43   "option_lift f s y == case y of None => s | Some x => (f x)"
    44 
    45 (* plift is used to determine that None action is always false in
    46    transition predicates *)
    47 plift_def:
    48   "plift P == option_lift P False"
    49 
    50 temp_sat_def:
    51   "ex |== P == ((ex2seq ex) |= P)"
    52 
    53 xt1_def:
    54   "xt1 P tr == P (fst tr)"
    55 
    56 xt2_def:
    57   "xt2 P tr == P (fst (snd tr))"
    58 
    59 ex2seq_def:
    60   "ex2seq ex == ((ex2seqC $(mkfin (snd ex))) (fst ex))"
    61 
    62 ex2seqC_def:
    63   "ex2seqC == (fix$(LAM h ex. (%s. case ex of
    64       nil =>  (s,None,s)>>nil
    65     | x##xs => (flift1 (%pr.
    66                 (s,Some (fst pr), snd pr)>> (h$xs) (snd pr))
    67                 $x)
    68       )))"
    69 
    70 validTE_def:
    71   "validTE P == ! ex. (ex |== P)"
    72 
    73 validIOA_def:
    74   "validIOA A P == ! ex : executions A . (ex |== P)"
    75 
    76 
    77 axioms
    78 
    79 mkfin_UU:
    80   "mkfin UU = nil"
    81 
    82 mkfin_nil:
    83   "mkfin nil =nil"
    84 
    85 mkfin_cons:
    86   "(mkfin (a>>s)) = (a>>(mkfin s))"
    87 
    88 
    89 lemmas [simp del] = HOL.ex_simps HOL.all_simps split_paired_Ex
    90 
    91 declaration {* fn _ => Classical.map_cs (fn cs => cs delSWrapper "split_all_tac") *}
    92 
    93 
    94 subsection {* ex2seqC *}
    95 
    96 lemma ex2seqC_unfold: "ex2seqC  = (LAM ex. (%s. case ex of  
    97        nil =>  (s,None,s)>>nil    
    98      | x##xs => (flift1 (%pr.  
    99                  (s,Some (fst pr), snd pr)>> (ex2seqC$xs) (snd pr))   
   100                  $x)   
   101        ))"
   102 apply (rule trans)
   103 apply (rule fix_eq2)
   104 apply (rule ex2seqC_def)
   105 apply (rule beta_cfun)
   106 apply (simp add: flift1_def)
   107 done
   108 
   109 lemma ex2seqC_UU: "(ex2seqC $UU) s=UU"
   110 apply (subst ex2seqC_unfold)
   111 apply simp
   112 done
   113 
   114 lemma ex2seqC_nil: "(ex2seqC $nil) s = (s,None,s)>>nil"
   115 apply (subst ex2seqC_unfold)
   116 apply simp
   117 done
   118 
   119 lemma ex2seqC_cons: "(ex2seqC $((a,t)>>xs)) s =  
   120            (s,Some a,t)>> ((ex2seqC$xs) t)"
   121 apply (rule trans)
   122 apply (subst ex2seqC_unfold)
   123 apply (simp add: Consq_def flift1_def)
   124 apply (simp add: Consq_def flift1_def)
   125 done
   126 
   127 declare ex2seqC_UU [simp] ex2seqC_nil [simp] ex2seqC_cons [simp]
   128 
   129 
   130 
   131 declare mkfin_UU [simp] mkfin_nil [simp] mkfin_cons [simp]
   132 
   133 lemma ex2seq_UU: "ex2seq (s, UU) = (s,None,s)>>nil"
   134 apply (simp add: ex2seq_def)
   135 done
   136 
   137 lemma ex2seq_nil: "ex2seq (s, nil) = (s,None,s)>>nil"
   138 apply (simp add: ex2seq_def)
   139 done
   140 
   141 lemma ex2seq_cons: "ex2seq (s, (a,t)>>ex) = (s,Some a,t) >> ex2seq (t, ex)"
   142 apply (simp add: ex2seq_def)
   143 done
   144 
   145 declare ex2seqC_UU [simp del] ex2seqC_nil [simp del] ex2seqC_cons [simp del]
   146 declare ex2seq_UU [simp] ex2seq_nil [simp] ex2seq_cons [simp]
   147 
   148 
   149 lemma ex2seq_nUUnnil: "ex2seq exec ~= UU & ex2seq exec ~= nil"
   150 apply (tactic {* pair_tac @{context} "exec" 1 *})
   151 apply (tactic {* Seq_case_simp_tac @{context} "y" 1 *})
   152 apply (tactic {* pair_tac @{context} "a" 1 *})
   153 done
   154 
   155 
   156 subsection {* Interface TL -- TLS *}
   157 
   158 (* uses the fact that in executions states overlap, which is lost in 
   159    after the translation via ex2seq !! *)
   160 
   161 lemma TL_TLS: 
   162  "[| ! s a t. (P s) & s-a--A-> t --> (Q t) |] 
   163    ==> ex |== (Init (%(s,a,t). P s) .& Init (%(s,a,t). s -a--A-> t)  
   164               .--> (Next (Init (%(s,a,t).Q s))))"
   165 apply (unfold Init_def Next_def temp_sat_def satisfies_def IMPLIES_def AND_def)
   166 
   167 apply clarify
   168 apply (simp split add: split_if)
   169 (* TL = UU *)
   170 apply (rule conjI)
   171 apply (tactic {* pair_tac @{context} "ex" 1 *})
   172 apply (tactic {* Seq_case_simp_tac @{context} "y" 1 *})
   173 apply (tactic {* pair_tac @{context} "a" 1 *})
   174 apply (tactic {* Seq_case_simp_tac @{context} "s" 1 *})
   175 apply (tactic {* pair_tac @{context} "a" 1 *})
   176 (* TL = nil *)
   177 apply (rule conjI)
   178 apply (tactic {* pair_tac @{context} "ex" 1 *})
   179 apply (tactic {* Seq_case_tac @{context} "y" 1 *})
   180 apply (simp add: unlift_def)
   181 apply fast
   182 apply (simp add: unlift_def)
   183 apply fast
   184 apply (simp add: unlift_def)
   185 apply (tactic {* pair_tac @{context} "a" 1 *})
   186 apply (tactic {* Seq_case_simp_tac @{context} "s" 1 *})
   187 apply (tactic {* pair_tac @{context} "a" 1 *})
   188 (* TL =cons *)
   189 apply (simp add: unlift_def)
   190 
   191 apply (tactic {* pair_tac @{context} "ex" 1 *})
   192 apply (tactic {* Seq_case_simp_tac @{context} "y" 1 *})
   193 apply (tactic {* pair_tac @{context} "a" 1 *})
   194 apply (tactic {* Seq_case_simp_tac @{context} "s" 1 *})
   195 apply blast
   196 apply fastsimp
   197 apply (tactic {* pair_tac @{context} "a" 1 *})
   198  apply fastsimp
   199 done
   200 
   201 end