diff -r 11402be6e4b0 -r 06c1998340a8 src/HOL/NanoJava/OpSem.thy --- a/src/HOL/NanoJava/OpSem.thy Tue Aug 07 22:42:22 2001 +0200 +++ b/src/HOL/NanoJava/OpSem.thy Wed Aug 08 12:36:48 2001 +0200 @@ -9,81 +9,116 @@ theory OpSem = State: consts - exec :: "(state \ stmt \ nat \ state) set" + exec :: "(state \ stmt \ nat \ state) set" + eval :: "(state \ expr \ val \ nat \ state) set" syntax (xsymbols) - exec :: "[state, stmt, nat, state] => bool" ("_ -_-_\ _" [98,90,99,98] 89) + exec :: "[state,stmt, nat,state] => bool" ("_ -_-_\ _" [98,90, 99,98] 89) + eval :: "[state,expr,val,nat,state] => bool" ("_ -_\_-_\ _"[98,95,99,99,98] 89) syntax - exec :: "[state, stmt, nat, state] => bool" ("_ -_-_-> _" [98,90,99,98] 89) + exec :: "[state,stmt, nat,state] => bool" ("_ -_-_-> _" [98,90, 99,98]89) + eval :: "[state,expr,val,nat,state] => bool" ("_ -_>_-_-> _"[98,95,99,99,98]89) translations - "s -c-n-> s'" == "(s, c, n, s') \ exec" + "s -c -n-> s'" == "(s, c, n, s') \ exec" + "s -e>v-n-> s'" == "(s, e, v, n, s') \ eval" -inductive exec intros +inductive exec eval intros Skip: " s -Skip-n-> s" Comp: "[| s0 -c1-n-> s1; s1 -c2-n-> s2 |] ==> s0 -c1;; c2-n-> s2" - Cond: "[| s -(if s \ Null then c1 else c2)-n-> s' |] ==> - s -If(e) c1 Else c2-n-> s'" + Cond: "[| s0 -e>v-n-> s1; s1 -(if v\Null then c1 else c2)-n-> s2 |] ==> + s0 -If(e) c1 Else c2-n-> s2" + + LoopF:" s0 = Null ==> + s0 -While(x) c-n-> s0" + LoopT:"[| s0 \ Null; s0 -c-n-> s1; s1 -While(x) c-n-> s2 |] ==> + s0 -While(x) c-n-> s2" - LoopF:" s0 = Null ==> - s0 -While(e) c-n-> s0" - LoopT:"[| s0 \ Null; s0 -c-n-> s1; s1 -While(e) c-n-> s2 |] ==> - s0 -While(e) c-n-> s2" + LAcc: " s -LAcc x>s-n-> s" + + LAss: " s -e>v-n-> s' ==> + s -x:==e-n-> lupd(x\v) s'" + + FAcc: " s -e>Addr a-n-> s' ==> + s -e..f>get_field s' a f-n-> s'" + + FAss: "[| s0 -e1>Addr a-n-> s1; s1 -e2>v-n-> s2 |] ==> + s0 -e1..f:==e2-n-> upd_obj a f v s2" NewC: " new_Addr s = Addr a ==> - s -x:=new C-n-> lupd(x\Addr a)(new_obj a C s)" - - Cast: " (case s of Null => True | Addr a => obj_class s a \C C) ==> - s -x:=(C)y-n-> lupd(x\s) s" + s -new C>Addr a-n-> new_obj a C s" - FAcc: " s = Addr a ==> - s -x:=y..f-n-> lupd(x\get_field s a f) s" + Cast: "[| s -e>v-n-> s'; + case v of Null => True | Addr a => obj_class s' a \C C |] ==> + s -Cast C e>v-n-> s'" - FAss: " s = Addr a ==> - s -y..f:=x-n-> upd_obj a f (s) s" - - Call: "lupd(This\s)(lupd(Param\s

)(init_locs C m s))-Meth C m -n-> s'==> - s -x:={C}y..m(p)-n-> lupd(x\s')(set_locs s s')" + Call: "[| s0 -e1>a-n-> s1; s1 -e2>p-n-> s2; + lupd(This\a)(lupd(Param\p)(init_locs C m s2)) -Meth C m-n-> s3 + |] ==> s0 -{C}e1..m(e2)>s3-n-> set_locs s2 s3" Meth: "[| s = Addr a; obj_class s a\C C; s -Impl (obj_class s a) m-n-> s' |] ==> s -Meth C m-n-> s'" - Impl: " s -body C m- n-> s' ==> + Impl: " s -body C m-n-> s' ==> s -Impl C m-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(e) c -n-> t" - "s -x:=new C -n-> t" - "s -x:=(C)y -n-> t" - "s -x:=y..f -n-> t" - "s -y..f:=x -n-> t" - "s -x:={C}y..m(p) -n-> t" -inductive_cases Meth_elim_cases: "s -Meth C m -n-> t" -inductive_cases Impl_elim_cases: "s -Impl C m -n-> t" + "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 C m-n\ t" +inductive_cases Impl_elim_cases: "s -Impl C m-n\ t" lemmas exec_elim_cases = exec_elim_cases' Meth_elim_cases Impl_elim_cases +inductive_cases eval_elim_cases: + "s -new C \v-n\ t" + "s -Cast C e \v-n\ t" + "s -LAcc x \v-n\ t" + "s -e..f \v-n\ t" + "s -{C}e1..m(e2) \v-n\ t" -lemma exec_mono [rule_format]: "s -c-n\ t \ \m. n \ m \ s -c-m\ t" -apply (erule exec.induct) -prefer 12 (* Impl *) +lemma exec_eval_mono [rule_format]: + "(s -c -n\ t \ (\m. n \ m \ s -c -m\ t)) \ + (s -e\v-n\ t \ (\m. n \ m \ s -e\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.intros)+ +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 exec_max2: "\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\v- n2\ t2\ \ + s1 -c-max n1 n2\ t1 \ s2 -e\v-max n1 n2\ t2" +by (fast intro: eval_mono exec_mono le_maxI1 le_maxI2) + +lemma eval_eval_max: "\s1 -e1\v1- n1 \ t1 ; s2 -e2\v2- n2\ t2\ \ + s1 -e1\v1-max n1 n2\ t1 \ s2 -e2\v2-max n1 n2\ t2" +by (fast intro: eval_mono le_maxI1 le_maxI2) + +lemma eval_eval_exec_max: + "\s1 -e1\v1-n1\ t1; s2 -e2\v2-n2\ t2; s3 -c-n3\ t3\ \ + s1 -e1\v1-max (max n1 n2) n3\ t1 \ + s2 -e2\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 C m-n\ t) = (\t. \n. z -body C m-n\ t)" apply (rule ext) -apply (fast elim: exec_elim_cases intro: exec.Impl) +apply (fast elim: exec_elim_cases intro: exec_eval.Impl) done end \ No newline at end of file