lemma [simp]: "fvs(es @ es') = fvs es ∪ fvs es'" by(induct es) auto
lemma [simp]: "fvs(map Val vs) = {}" by (induct vs) auto
subsection‹Locks and addresses›
primrec expr_locks :: "('a,'b,'addr) exp ==> 'addr ==> nat" and expr_lockss :: "('a,'b,'addr) exp list ==> 'addr ==> nat" where "expr_locks (new C) = (λad. 0)"
| "expr_locks (newA T⌊e⌉) = expr_locks e"
| "expr_locks (Cast T e) = expr_locks e"
| "expr_locks (e instanceof T) = expr_locks e"
| "expr_locks (Val v) = (λad. 0)"
| "expr_locks (Var v) = (λad. 0)"
| "expr_locks (e «bop¬ e') = (λad. expr_locks e ad + expr_locks e' ad)"
| "expr_locks (V := e) = expr_locks e"
| "expr_locks (a⌊i⌉) = (λad. expr_locks a ad + expr_locks i ad)"
| "expr_locks (AAss a i e) = (λad. expr_locks a ad + expr_locks i ad + expr_locks e ad)"
| "expr_locks (a∙length) = expr_locks a"
| "expr_locks (e∙F{D}) = expr_locks e"
| "expr_locks (FAss e F D e') = (λad. expr_locks e ad + expr_locks e' ad)"
| "expr_locks (e∙compareAndSwap(D∙F, e', e'')) = (λad. expr_locks e ad + expr_locks e' ad + expr_locks e'' ad)"
| "expr_locks (e∙m(ps)) = (λad. expr_locks e ad + expr_lockss ps ad)"
| "expr_locks ({V : T=vo; e}) = expr_locks e"
| "expr_locks (sync (o') e) = (λad. expr_locks o' ad + expr_locks e ad)"
| "expr_locks (insync (a) e) = (λad. if (a = ad) then Suc (expr_locks e ad) else expr_locks e ad)"
| "expr_locks (e;;e') = (λad. expr_locks e ad + expr_locks e' ad)"
| "expr_locks (if (b) e else e') = (λad. expr_locks b ad + expr_locks e ad + expr_locks e' ad)"
| "expr_locks (while (b) e) = (λad. expr_locks b ad + expr_locks e ad)"
| "expr_locks (throw e) = expr_locks e"
| "expr_locks (try e catch(C v) e') = (λad. expr_locks e ad + expr_locks e' ad)"
| "expr_lockss [] = (λa. 0)"
| "expr_lockss (x#xs) = (λad. expr_locks x ad + expr_lockss xs ad)"
lemma expr_lockss_append [simp]: "expr_lockss (es @ es') = (λad. expr_lockss es ad + expr_lockss es' ad)" by(induct es) auto
lemma expr_lockss_map_Val [simp]: "expr_lockss (map Val vs) = (λad. 0)" by(induct vs) auto
primrec contains_insync :: "('a,'b,'addr) exp ==> bool" and contains_insyncs :: "('a,'b,'addr) exp list ==> bool" where "contains_insync (new C) = False"
| "contains_insync (newA T⌊i⌉) = contains_insync i"
| "contains_insync (Cast T e) = contains_insync e"
| "contains_insync (e instanceof T) = contains_insync e"
| "contains_insync (Val v) = False"
| "contains_insync (Var v) = False"
| "contains_insync (e «bop¬ e') = (contains_insync e ∨ contains_insync e')"
| "contains_insync (V := e) = contains_insync e"
| "contains_insync (a⌊i⌉) = (contains_insync a ∨ contains_insync i)"
| "contains_insync (AAss a i e) = (contains_insync a ∨ contains_insync i ∨ contains_insync e)"
| "contains_insync (a∙length) = contains_insync a"
| "contains_insync (e∙F{D}) = contains_insync e"
| "contains_insync (FAss e F D e') = (contains_insync e ∨ contains_insync e')"
| "contains_insync (e∙compareAndSwap(D∙F, e', e'')) = (contains_insync e ∨ contains_insync e' ∨ contains_insync e'')"
| "contains_insync (e∙m(pns)) = (contains_insync e ∨ contains_insyncs pns)"
| "contains_insync ({V : T=vo; e}) = contains_insync e"
| "contains_insync (sync (o') e) = (contains_insync o' ∨ contains_insync e)"
| "contains_insync (insync (a) e) = True"
| "contains_insync (e;;e') = (contains_insync e ∨ contains_insync e')"
| "contains_insync (if (b) e else e') = (contains_insync b ∨ contains_insync e ∨contains_insync e')"
| "contains_insync (while (b) e) = (contains_insync b ∨ contains_insync e)"
| "contains_insync (throw e) = contains_insync e"
| "contains_insync (try e catch(C v) e') = (contains_insync e ∨ contains_insync e')"
lemmafixes e :: "('a, 'b, 'addr) exp" and es :: "('a, 'b, 'addr) exp list" shows contains_insync_conv: "(contains_insync e ⟷ (∃ad. expr_locks e ad > 0))" and contains_insyncs_conv: "(contains_insyncs es ⟷ (∃ad. expr_lockss es ad > 0))" by(induct e and es rule: expr_locks.induct expr_lockss.induct)(auto)
lemma contains_insyncs_map_Val [simp]: "¬ contains_insyncs (map Val vs)" by(induct vs) auto
inductive is_Throws :: "('a, 'b, 'addr) exp list ==> bool" where "is_Throws (Throw a # es)"
| "is_Throws es ==> is_Throws (Val v # es)"
inductive_simps is_Throws_simps: "is_Throws []" "is_Throws (e # es)"
code_pred is_Throws .
lemma is_Throws_conv: "is_Throws es ⟷ (∃vs a es'. es = map Val vs @ Throw a # es')"
(is"?lhs ⟷ ?rhs") proof assume ?lhs thus ?rhs by(induct)(fastforce simp add: Cons_eq_append_conv Cons_eq_map_conv)+ next assume ?rhs thus ?lhs by(induct es)(auto simp add: is_Throws_simps Cons_eq_map_conv Cons_eq_append_conv) qed
subsection‹‹blocks››
fun blocks :: "'a list ==> ty list ==> 'addr val list ==> ('a,'b,'addr) exp ==> ('a,'b,'addr) exp" where "blocks (V # Vs) (T # Ts) (v # vs) e = {V:T=⌊v⌋; blocks Vs Ts vs e}"
| "blocks [] [] [] e = e"
lemma [simp]: "[ size vs = size Vs; size Ts = size Vs ]==> fv (blocks Vs Ts vs e) = fv e - set Vs" by(induct rule:blocks.induct)(simp_all, blast)
lemma expr_locks_blocks: "[ length vs = length pns; length Ts = length pns ] ==> expr_locks (blocks pns Ts vs e) = expr_locks e" by(induct pns Ts vs e rule: blocks.induct)(auto)
subsection‹Final expressions›
inductive final :: "('a,'b,'addr) exp ==> bool"where "final (Val v)"
| "final (Throw a)"
lemma finals_app_map [iff]: "finals (map Val vs @ es) = finals es" by(induct vs) simp_all
lemma [iff]: "finals (throw e # es) = (∃a. e = addr a)" by(simp add: finals_simps)
lemma not_finals_ConsI: "¬ final e ==>¬ finals (e # es)" by(simp add: finals_simps final_iff)
lemma finals_iff: "finals es ⟷ (∃vs. es = map Val vs) ∨ (∃vs a es'. es = map Val vs @ Throw a # es')"
(is"?lhs ⟷ ?rhs") proof assume ?lhs thus ?rhs by induct(auto simp add: Cons_eq_append_conv Cons_eq_map_conv, metis) next assume ?rhs thus ?lhs by(induct es) auto qed
code_pred final .
subsection‹converting results from external calls›
primrec extRet2J :: "('a, 'b, 'addr) exp ==> 'addr extCallRet ==> ('a, 'b, 'addr) exp" where "extRet2J e (RetVal v) = Val v"
| "extRet2J e (RetExc a) = Throw a"
| "extRet2J e RetStaySame = e"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.