(* Title: HOL/NanoJava/OpSem.thy ID: $Id: OpSem.thy,v 1.11 2007/07/11 09:32:55 berghofe Exp $ Author: David von Oheimb Copyright 2001 Technische Universitaet Muenchen *) header "Operational Evaluation Semantics" theory OpSem imports State begin inductive exec :: "[state,stmt, nat,state] => bool" ("_ -_-_-> _" [98,90, 65,98] 89) and eval :: "[state,expr,val,nat,state] => bool" ("_ -_\<succ>_-_-> _"[98,95,99,65,98] 89) where Skip: " s -Skip-n-> s" | Comp: "[| s0 -c1-n-> s1; s1 -c2-n-> s2 |] ==> s0 -c1;; c2-n-> s2" | Cond: "[| s0 -e\<succ>v-n-> s1; s1 -(if v≠Null then c1 else c2)-n-> s2 |] ==> s0 -If(e) c1 Else c2-n-> s2" | LoopF:" s0<x> = Null ==> s0 -While(x) c-n-> s0" | LoopT:"[| s0<x> ≠ Null; s0 -c-n-> s1; s1 -While(x) c-n-> s2 |] ==> s0 -While(x) c-n-> s2" | LAcc: " s -LAcc x\<succ>s<x>-n-> s" | LAss: " s -e\<succ>v-n-> s' ==> s -x:==e-n-> lupd(x\<mapsto>v) s'" | FAcc: " s -e\<succ>Addr a-n-> s' ==> s -e..f\<succ>get_field s' a f-n-> s'" | FAss: "[| s0 -e1\<succ>Addr a-n-> s1; s1 -e2\<succ>v-n-> s2 |] ==> s0 -e1..f:==e2-n-> upd_obj a f v s2" | NewC: " new_Addr s = Addr a ==> s -new C\<succ>Addr a-n-> new_obj a C s" | Cast: "[| s -e\<succ>v-n-> s'; case v of Null => True | Addr a => obj_class s' a \<preceq>C C |] ==> s -Cast C e\<succ>v-n-> s'" | Call: "[| s0 -e1\<succ>a-n-> s1; s1 -e2\<succ>p-n-> s2; lupd(This\<mapsto>a)(lupd(Par\<mapsto>p)(del_locs s2)) -Meth (C,m)-n-> s3 |] ==> s0 -{C}e1..m(e2)\<succ>s3<Res>-n-> set_locs s2 s3" | Meth: "[| s<This> = Addr a; D = obj_class s a; D\<preceq>C C; init_locs D m s -Impl (D,m)-n-> s' |] ==> s -Meth (C,m)-n-> s'" | Impl: " s -body Cm- n-> s' ==> s -Impl Cm-Suc n-> s'" inductive_cases exec_elim_cases': "s -Skip -n-> t" "s -c1;; c2 -n-> t" "s -If(e) c1 Else c2-n-> t" "s -While(x) c -n-> t" "s -x:==e -n-> t" "s -e1..f:==e2 -n-> t" inductive_cases Meth_elim_cases: "s -Meth Cm -n-> t" inductive_cases Impl_elim_cases: "s -Impl Cm -n-> t" lemmas exec_elim_cases = exec_elim_cases' Meth_elim_cases Impl_elim_cases inductive_cases eval_elim_cases: "s -new C \<succ>v-n-> t" "s -Cast C e \<succ>v-n-> t" "s -LAcc x \<succ>v-n-> t" "s -e..f \<succ>v-n-> t" "s -{C}e1..m(e2) \<succ>v-n-> t" lemma exec_eval_mono [rule_format]: "(s -c -n-> t --> (∀m. n ≤ m --> s -c -m-> t)) ∧ (s -e\<succ>v-n-> t --> (∀m. n ≤ m --> s -e\<succ>v-m-> t))" apply (rule exec_eval.induct) prefer 14 (* Impl *) apply clarify apply (rename_tac n) apply (case_tac n) apply (blast intro:exec_eval.intros)+ done lemmas exec_mono = exec_eval_mono [THEN conjunct1, rule_format] lemmas eval_mono = exec_eval_mono [THEN conjunct2, rule_format] lemma exec_exec_max: "[|s1 -c1- n1 -> t1 ; s2 -c2- n2-> t2|] ==> s1 -c1-max n1 n2-> t1 ∧ s2 -c2-max n1 n2-> t2" by (fast intro: exec_mono le_maxI1 le_maxI2) lemma eval_exec_max: "[|s1 -c- n1 -> t1 ; s2 -e\<succ>v- n2-> t2|] ==> s1 -c-max n1 n2-> t1 ∧ s2 -e\<succ>v-max n1 n2-> t2" by (fast intro: eval_mono exec_mono le_maxI1 le_maxI2) lemma eval_eval_max: "[|s1 -e1\<succ>v1- n1 -> t1 ; s2 -e2\<succ>v2- n2-> t2|] ==> s1 -e1\<succ>v1-max n1 n2-> t1 ∧ s2 -e2\<succ>v2-max n1 n2-> t2" by (fast intro: eval_mono le_maxI1 le_maxI2) lemma eval_eval_exec_max: "[|s1 -e1\<succ>v1-n1-> t1; s2 -e2\<succ>v2-n2-> t2; s3 -c-n3-> t3|] ==> s1 -e1\<succ>v1-max (max n1 n2) n3-> t1 ∧ s2 -e2\<succ>v2-max (max n1 n2) n3-> t2 ∧ s3 -c -max (max n1 n2) n3-> t3" apply (drule (1) eval_eval_max, erule thin_rl) by (fast intro: exec_mono eval_mono le_maxI1 le_maxI2) lemma Impl_body_eq: "(λt. ∃n. Z -Impl M-n-> t) = (λt. ∃n. Z -body M-n-> t)" apply (rule ext) apply (fast elim: exec_elim_cases intro: exec_eval.Impl) done end
lemma exec_elim_cases:
[| s -Skip-n-> t; t = s ==> P |] ==> P
[| s -c1.0;; c2.0-n-> t; !!s1. [| s -c1.0-n-> s1; s1 -c2.0-n-> t |] ==> P |]
==> P
[| s -If (e) c1.0 Else c2.0-n-> t;
!!v s1.
[| s -e\<succ>v-n-> s1; s1 -(if v ≠ Null then c1.0 else c2.0)-n-> t |]
==> P |]
==> P
[| s -While (x) c-n-> t; [| t = s; s<x> = Null |] ==> P;
!!s1. [| s<x> ≠ Null; s -c-n-> s1; s1 -While (x) c-n-> t |] ==> P |]
==> P
[| s -x :== e-n-> t;
!!v s'. [| t = lupd(x|->v) s'; s -e\<succ>v-n-> s' |] ==> P |]
==> P
[| s -e1.0..f:==e2.0-n-> t;
!!a s1 v s2.
[| t = upd_obj a f v s2; s -e1.0\<succ>Addr a-n-> s1;
s1 -e2.0\<succ>v-n-> s2 |]
==> P |]
==> P
[| s -Meth Cm-n-> t;
!!a C m.
[| Cm = (C, m); s<This> = Addr a; obj_class s a <=C C;
init_locs (obj_class s a) m s -Impl (obj_class s a, m)-n-> t |]
==> P |]
==> P
[| s -Impl Cm-n-> t; !!n. [| n = Suc n; s -body Cm-n-> t |] ==> P |] ==> P
lemma exec_eval_mono:
(s -c-n-> t --> (∀m≥n. s -c-m-> t)) ∧
(s -e\<succ>v-n-> t --> (∀m≥n. s -e\<succ>v-m-> t))
lemma exec_mono:
[| s -c-n-> t; n ≤ m |] ==> s -c-m-> t
lemma eval_mono:
[| s -e\<succ>v-n-> t; n ≤ m |] ==> s -e\<succ>v-m-> t
lemma exec_exec_max:
[| s1.0 -c1.0-n1.0-> t1.0; s2.0 -c2.0-n2.0-> t2.0 |]
==> s1.0 -c1.0-max n1.0 n2.0-> t1.0 ∧ s2.0 -c2.0-max n1.0 n2.0-> t2.0
lemma eval_exec_max:
[| s1.0 -c-n1.0-> t1.0; s2.0 -e\<succ>v-n2.0-> t2.0 |]
==> s1.0 -c-max n1.0 n2.0-> t1.0 ∧ s2.0 -e\<succ>v-max n1.0 n2.0-> t2.0
lemma eval_eval_max:
[| s1.0 -e1.0\<succ>v1.0-n1.0-> t1.0; s2.0 -e2.0\<succ>v2.0-n2.0-> t2.0 |]
==> s1.0 -e1.0\<succ>v1.0-max n1.0 n2.0-> t1.0 ∧
s2.0 -e2.0\<succ>v2.0-max n1.0 n2.0-> t2.0
lemma eval_eval_exec_max:
[| s1.0 -e1.0\<succ>v1.0-n1.0-> t1.0; s2.0 -e2.0\<succ>v2.0-n2.0-> t2.0;
s3.0 -c-n3.0-> t3.0 |]
==> s1.0 -e1.0\<succ>v1.0-max (max n1.0 n2.0) n3.0-> t1.0 ∧
s2.0 -e2.0\<succ>v2.0-max (max n1.0 n2.0) n3.0-> t2.0 ∧
s3.0 -c-max (max n1.0 n2.0) n3.0-> t3.0
lemma Impl_body_eq:
(λt. ∃n. Z -Impl M-n-> t) = (λt. ∃n. Z -body M-n-> t)