1 (* Title: HOLCF/IOA/meta_theory/TLS.thy
5 header {* Temporal Logic of Steps -- tailored for I/O automata *}
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"
20 option_lift :: "('a => 'b) => 'b => ('a option => 'b)"
21 plift :: "('a => bool) => ('a option => bool)"
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"
27 validTE :: "('a,'s)ioa_temp => bool"
28 validIOA :: "('a,'s)ioa => ('a,'s)ioa_temp => bool"
30 mkfin :: "'a Seq => 'a Seq"
32 ex2seq :: "('a,'s)execution => ('a option,'s)transition Seq"
33 ex2seqC :: "('a,'s)pairs -> ('s => ('a option,'s)transition Seq)"
39 "mkfin s == if Partial s then @t. Finite t & s = t @@ UU
43 "option_lift f s y == case y of None => s | Some x => (f x)"
45 (* plift is used to determine that None action is always false in
46 transition predicates *)
48 "plift P == option_lift P False"
51 "ex |== P == ((ex2seq ex) |= P)"
54 "xt1 P tr == P (fst tr)"
57 "xt2 P tr == P (fst (snd tr))"
60 "ex2seq ex == ((ex2seqC $(mkfin (snd ex))) (fst ex))"
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))
71 "validTE P == ! ex. (ex |== P)"
74 "validIOA A P == ! ex : executions A . (ex |== P)"
86 "(mkfin (a>>s)) = (a>>(mkfin s))"
89 lemmas [simp del] = HOL.ex_simps HOL.all_simps split_paired_Ex
91 declaration {* fn _ => Classical.map_cs (fn cs => cs delSWrapper "split_all_tac") *}
94 subsection {* ex2seqC *}
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))
104 apply (rule ex2seqC_def)
105 apply (rule beta_cfun)
106 apply (simp add: flift1_def)
109 lemma ex2seqC_UU: "(ex2seqC $UU) s=UU"
110 apply (subst ex2seqC_unfold)
114 lemma ex2seqC_nil: "(ex2seqC $nil) s = (s,None,s)>>nil"
115 apply (subst ex2seqC_unfold)
119 lemma ex2seqC_cons: "(ex2seqC $((a,t)>>xs)) s =
120 (s,Some a,t)>> ((ex2seqC$xs) t)"
122 apply (subst ex2seqC_unfold)
123 apply (simp add: Consq_def flift1_def)
124 apply (simp add: Consq_def flift1_def)
127 declare ex2seqC_UU [simp] ex2seqC_nil [simp] ex2seqC_cons [simp]
131 declare mkfin_UU [simp] mkfin_nil [simp] mkfin_cons [simp]
133 lemma ex2seq_UU: "ex2seq (s, UU) = (s,None,s)>>nil"
134 apply (simp add: ex2seq_def)
137 lemma ex2seq_nil: "ex2seq (s, nil) = (s,None,s)>>nil"
138 apply (simp add: ex2seq_def)
141 lemma ex2seq_cons: "ex2seq (s, (a,t)>>ex) = (s,Some a,t) >> ex2seq (t, ex)"
142 apply (simp add: ex2seq_def)
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]
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 *})
156 subsection {* Interface TL -- TLS *}
158 (* uses the fact that in executions states overlap, which is lost in
159 after the translation via ex2seq !! *)
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)
168 apply (simp split add: split_if)
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 *})
178 apply (tactic {* pair_tac @{context} "ex" 1 *})
179 apply (tactic {* Seq_case_tac @{context} "y" 1 *})
180 apply (simp add: unlift_def)
182 apply (simp add: unlift_def)
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 *})
189 apply (simp add: unlift_def)
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 *})
197 apply (tactic {* pair_tac @{context} "a" 1 *})