diff -r 23a8345f89f5 -r 50c5b0912a0c src/HOL/Bali/DefiniteAssignment.thy --- a/src/HOL/Bali/DefiniteAssignment.thy Wed Jun 13 00:01:38 2007 +0200 +++ b/src/HOL/Bali/DefiniteAssignment.thy Wed Jun 13 00:01:41 2007 +0200 @@ -349,10 +349,10 @@ by (cases binop) (simp_all) next case (Cond c e1 e2 b) - have hyp_c: "\ b. ?Const b c \ ?Ass b c" . - have hyp_e1: "\ b. ?Const b e1 \ ?Ass b e1" . - have hyp_e2: "\ b. ?Const b e2 \ ?Ass b e2" . - have const: "constVal (c ? e1 : e2) = Some (Bool b)" . + note hyp_c = `\ b. ?Const b c \ ?Ass b c` + note hyp_e1 = `\ b. ?Const b e1 \ ?Ass b e1` + note hyp_e2 = `\ b. ?Const b e2 \ ?Ass b e2` + note const = `constVal (c ? e1 : e2) = Some (Bool b)` then obtain bv where bv: "constVal c = Some bv" by simp hence emptyC: "assignsE c = {}" by (rule assignsE_const_simp) @@ -397,10 +397,10 @@ by (cases binop) (simp_all) next case (Cond c e1 e2 b) - have hyp_c: "\ b. ?Const b c \ ?Ass b c" . - have hyp_e1: "\ b. ?Const b e1 \ ?Ass b e1" . - have hyp_e2: "\ b. ?Const b e2 \ ?Ass b e2" . - have const: "constVal (c ? e1 : e2) = Some (Bool b)" . + note hyp_c = `\ b. ?Const b c \ ?Ass b c` + note hyp_e1 = `\ b. ?Const b e1 \ ?Ass b e1` + note hyp_e2 = `\ b. ?Const b e2 \ ?Ass b e2` + note const = `constVal (c ? e1 : e2) = Some (Bool b)` then obtain bv where bv: "constVal c = Some bv" by simp show ?case @@ -958,8 +958,8 @@ case (Cast T e) have "E\e\- (PrimT Boolean)" proof - - have "E\(Cast T e)\- (PrimT Boolean)" . - then obtain Te where "E\e\-Te" + from `E\(Cast T e)\- (PrimT Boolean)` + obtain Te where "E\e\-Te" "prg E\Te\? PrimT Boolean" by cases simp thus ?thesis @@ -988,10 +988,10 @@ by - (cases binop, auto simp add: assignsE_const_simp) next case (Cond c e1 e2) - have hyp_c: "?Boolean c \ ?Incl c" . - have hyp_e1: "?Boolean e1 \ ?Incl e1" . - have hyp_e2: "?Boolean e2 \ ?Incl e2" . - have wt: "E\(c ? e1 : e2)\-PrimT Boolean" . + note hyp_c = `?Boolean c \ ?Incl c` + note hyp_e1 = `?Boolean e1 \ ?Incl e1` + note hyp_e2 = `?Boolean e2 \ ?Incl e2` + note wt = `E\(c ? e1 : e2)\-PrimT Boolean` then obtain boolean_c: "E\c\-PrimT Boolean" and boolean_e1: "E\e1\-PrimT Boolean" and @@ -1049,9 +1049,9 @@ by (auto simp add: range_inter_ts_def) lemma da_monotone: - assumes da: "Env\ B \t\ A" and - subseteq_B_B': "B \ B'" and - da': "Env\ B' \t\ A'" + assumes da: "Env\ B \t\ A" and + "B \ B'" and + da': "Env\ B' \t\ A'" shows "(nrm A \ nrm A') \ (\ l. (brk A l \ brk A' l))" proof - from da @@ -1068,10 +1068,10 @@ show ?case by cases simp next case (Lab Env B c C A l B' A') - have A: "nrm A = nrm C \ brk C l" "brk A = rmlab l (brk C)" . - have "PROP ?Hyp Env B \c\ C" . + note A = `nrm A = nrm C \ brk C l` `brk A = rmlab l (brk C)` + note `PROP ?Hyp Env B \c\ C` moreover - have "B \ B'" . + note `B \ B'` moreover obtain C' where "Env\ B' \\c\\ C'" @@ -1094,40 +1094,40 @@ by simp next case (Comp Env B c1 C1 c2 C2 A B' A') - have A: "nrm A = nrm C2" "brk A = brk C1 \\ brk C2" . - have "Env\ B' \\c1;; c2\\ A'" . - then obtain C1' C2' + note A = `nrm A = nrm C2` `brk A = brk C1 \\ brk C2` + from `Env\ B' \\c1;; c2\\ A'` + obtain C1' C2' where da_c1: "Env\ B' \\c1\\ C1'" and da_c2: "Env\ nrm C1' \\c2\\ C2'" and A': "nrm A' = nrm C2'" "brk A' = brk C1' \\ brk C2'" by (rule da_elim_cases) auto - have "PROP ?Hyp Env B \c1\ C1" . - moreover have "B \ B'" . + note `PROP ?Hyp Env B \c1\ C1` + moreover note `B \ B'` moreover note da_c1 ultimately have C1': "nrm C1 \ nrm C1'" "(\l. brk C1 l \ brk C1' l)" - by (auto) - have "PROP ?Hyp Env (nrm C1) \c2\ C2" . + by auto + note `PROP ?Hyp Env (nrm C1) \c2\ C2` with da_c2 C1' have C2': "nrm C2 \ nrm C2'" "(\l. brk C2 l \ brk C2' l)" - by (auto) + by auto with A A' C1' show ?case by auto next case (If Env B e E c1 C1 c2 C2 A B' A') - have A: "nrm A = nrm C1 \ nrm C2" "brk A = brk C1 \\ brk C2" . - have "Env\ B' \\If(e) c1 Else c2\\ A'" . - then obtain C1' C2' + note A = `nrm A = nrm C1 \ nrm C2` `brk A = brk C1 \\ brk C2` + from `Env\ B' \\If(e) c1 Else c2\\ A'` + obtain C1' C2' where da_c1: "Env\ B' \ assigns_if True e \\c1\\ C1'" and da_c2: "Env\ B' \ assigns_if False e \\c2\\ C2'" and A': "nrm A' = nrm C1' \ nrm C2'" "brk A' = brk C1' \\ brk C2'" by (rule da_elim_cases) auto - have "PROP ?Hyp Env (B \ assigns_if True e) \c1\ C1" . - moreover have B': "B \ B'" . + note `PROP ?Hyp Env (B \ assigns_if True e) \c1\ C1` + moreover note B' = `B \ B'` moreover note da_c1 ultimately obtain C1': "nrm C1 \ nrm C1'" "(\l. brk C1 l \ brk C1' l)" by blast - have "PROP ?Hyp Env (B \ assigns_if False e) \c2\ C2" . + note `PROP ?Hyp Env (B \ assigns_if False e) \c2\ C2` with da_c2 B' obtain C2': "nrm C2 \ nrm C2'" "(\l. brk C2 l \ brk C2' l)" by blast @@ -1136,17 +1136,16 @@ by auto next case (Loop Env B e E c C A l B' A') - have A: "nrm A = nrm C \ (B \ assigns_if False e)" - "brk A = brk C" . - have "Env\ B' \\l\ While(e) c\\ A'" . - then obtain C' + note A = `nrm A = nrm C \ (B \ assigns_if False e)` `brk A = brk C` + from `Env\ B' \\l\ While(e) c\\ A'` + obtain C' where da_c': "Env\ B' \ assigns_if True e \\c\\ C'" and A': "nrm A' = nrm C' \ (B' \ assigns_if False e)" "brk A' = brk C'" by (rule da_elim_cases) auto - have "PROP ?Hyp Env (B \ assigns_if True e) \c\ C" . - moreover have B': "B \ B'" . + note `PROP ?Hyp Env (B \ assigns_if True e) \c\ C` + moreover note B' = `B \ B'` moreover note da_c' ultimately obtain C': "nrm C \ nrm C'" "(\l. brk C l \ brk C' l)" by blast @@ -1177,23 +1176,22 @@ case Throw thus ?case by - (erule da_elim_cases, auto) next case (Try Env B c1 C1 vn C c2 C2 A B' A') - have A: "nrm A = nrm C1 \ nrm C2" - "brk A = brk C1 \\ brk C2" . - have "Env\ B' \\Try c1 Catch(C vn) c2\\ A'" . - then obtain C1' C2' + note A = `nrm A = nrm C1 \ nrm C2` `brk A = brk C1 \\ brk C2` + from `Env\ B' \\Try c1 Catch(C vn) c2\\ A'` + obtain C1' C2' where da_c1': "Env\ B' \\c1\\ C1'" and da_c2': "Env\lcl := lcl Env(VName vn\Class C)\\ B' \ {VName vn} \\c2\\ C2'" and A': "nrm A' = nrm C1' \ nrm C2'" "brk A' = brk C1' \\ brk C2'" by (rule da_elim_cases) auto - have "PROP ?Hyp Env B \c1\ C1" . - moreover have B': "B \ B'" . + note `PROP ?Hyp Env B \c1\ C1` + moreover note B' = `B \ B'` moreover note da_c1' ultimately obtain C1': "nrm C1 \ nrm C1'" "(\l. brk C1 l \ brk C1' l)" by blast - have "PROP ?Hyp (Env\lcl := lcl Env(VName vn\Class C)\) - (B \ {VName vn}) \c2\ C2" . + note `PROP ?Hyp (Env\lcl := lcl Env(VName vn\Class C)\) + (B \ {VName vn}) \c2\ C2` with B' da_c2' obtain "nrm C2 \ nrm C2'" "(\l. brk C2 l \ brk C2' l)" by blast @@ -1202,21 +1200,21 @@ by auto next case (Fin Env B c1 C1 c2 C2 A B' A') - have A: "nrm A = nrm C1 \ nrm C2" - "brk A = (brk C1 \\\<^sub>\ nrm C2) \\ (brk C2)" . - have "Env\ B' \\c1 Finally c2\\ A'" . - then obtain C1' C2' + note A = `nrm A = nrm C1 \ nrm C2` + `brk A = (brk C1 \\\<^sub>\ nrm C2) \\ (brk C2)` + from `Env\ B' \\c1 Finally c2\\ A'` + obtain C1' C2' where da_c1': "Env\ B' \\c1\\ C1'" and da_c2': "Env\ B' \\c2\\ C2'" and A': "nrm A' = nrm C1' \ nrm C2'" "brk A' = (brk C1' \\\<^sub>\ nrm C2') \\ (brk C2')" by (rule da_elim_cases) auto - have "PROP ?Hyp Env B \c1\ C1" . - moreover have B': "B \ B'" . + note `PROP ?Hyp Env B \c1\ C1` + moreover note B' = `B \ B'` moreover note da_c1' ultimately obtain C1': "nrm C1 \ nrm C1'" "(\l. brk C1 l \ brk C1' l)" by blast - have hyp_c2: "PROP ?Hyp Env B \c2\ C2" . + note hyp_c2 = `PROP ?Hyp Env B \c2\ C2` from da_c2' B' obtain "nrm C2 \ nrm C2'" "(\l. brk C2 l \ brk C2' l)" by - (drule hyp_c2,auto) @@ -1239,17 +1237,17 @@ case UnOp thus ?case by - (erule da_elim_cases, auto) next case (CondAnd Env B e1 E1 e2 E2 A B' A') - have A: "nrm A = B \ + note A = `nrm A = B \ assigns_if True (BinOp CondAnd e1 e2) \ - assigns_if False (BinOp CondAnd e1 e2)" - "brk A = (\l. UNIV)" . - have "Env\ B' \\BinOp CondAnd e1 e2\\ A'" . - then obtain A': "nrm A' = B' \ + assigns_if False (BinOp CondAnd e1 e2)` + `brk A = (\l. UNIV)` + from `Env\ B' \\BinOp CondAnd e1 e2\\ A'` + obtain A': "nrm A' = B' \ assigns_if True (BinOp CondAnd e1 e2) \ assigns_if False (BinOp CondAnd e1 e2)" "brk A' = (\l. UNIV)" by (rule da_elim_cases) auto - have B': "B \ B'" . + note B' = `B \ B'` with A A' show ?case by auto next @@ -1268,13 +1266,13 @@ case Ass thus ?case by - (erule da_elim_cases, auto) next case (CondBool Env c e1 e2 B C E1 E2 A B' A') - have A: "nrm A = B \ + note A = `nrm A = B \ assigns_if True (c ? e1 : e2) \ - assigns_if False (c ? e1 : e2)" - "brk A = (\l. UNIV)" . - have "Env\ (c ? e1 : e2)\- (PrimT Boolean)" . + assigns_if False (c ? e1 : e2)` + `brk A = (\l. UNIV)` + note `Env\ (c ? e1 : e2)\- (PrimT Boolean)` moreover - have "Env\ B' \\c ? e1 : e2\\ A'" . + note `Env\ B' \\c ? e1 : e2\\ A'` ultimately obtain A': "nrm A' = B' \ assigns_if True (c ? e1 : e2) \ @@ -1282,16 +1280,15 @@ "brk A' = (\l. UNIV)" by - (erule da_elim_cases,auto simp add: inj_term_simps) (* inj_term_simps needed to handle wt (defined without \\) *) - have B': "B \ B'" . + note B' = `B \ B'` with A A' show ?case by auto next case (Cond Env c e1 e2 B C E1 E2 A B' A') - have A: "nrm A = nrm E1 \ nrm E2" - "brk A = (\l. UNIV)" . - have not_bool: "\ Env\ (c ? e1 : e2)\- (PrimT Boolean)" . - have "Env\ B' \\c ? e1 : e2\\ A'" . - then obtain E1' E2' + note A = `nrm A = nrm E1 \ nrm E2` `brk A = (\l. UNIV)` + note not_bool = `\ Env\ (c ? e1 : e2)\- (PrimT Boolean)` + from `Env\ B' \\c ? e1 : e2\\ A'` + obtain E1' E2' where da_e1': "Env\ B' \ assigns_if True c \\e1\\ E1'" and da_e2': "Env\ B' \ assigns_if False c \\e2\\ E2'" and A': "nrm A' = nrm E1' \ nrm E2'" @@ -1299,12 +1296,12 @@ using not_bool by - (erule da_elim_cases, auto simp add: inj_term_simps) (* inj_term_simps needed to handle wt (defined without \\) *) - have "PROP ?Hyp Env (B \ assigns_if True c) \e1\ E1" . - moreover have B': "B \ B'" . + note `PROP ?Hyp Env (B \ assigns_if True c) \e1\ E1` + moreover note B' = `B \ B'` moreover note da_e1' ultimately obtain E1': "nrm E1 \ nrm E1'" "(\l. brk E1 l \ brk E1' l)" - by blast - have "PROP ?Hyp Env (B \ assigns_if False c) \e2\ E2" . + by blast + note `PROP ?Hyp Env (B \ assigns_if False c) \e2\ E2` with B' da_e2' obtain "nrm E2 \ nrm E2'" "(\l. brk E2 l \ brk E2' l)" by blast @@ -1330,12 +1327,11 @@ next case Cons thus ?case by - (erule da_elim_cases, auto) qed -qed +qed (rule da', rule `B \ B'`) lemma da_weaken: - assumes da: "Env\ B \t\ A" and - subseteq_B_B': "B \ B'" - shows "\ A'. Env \ B' \t\ A'" + assumes da: "Env\ B \t\ A" and "B \ B'" + shows "\ A'. Env \ B' \t\ A'" proof - note assigned.select_convs [Pure.intro] from da @@ -1346,9 +1342,9 @@ case Expr thus ?case by (iprover intro: da.Expr) next case (Lab Env B c C A l B') - have "PROP ?Hyp Env B \c\" . + note `PROP ?Hyp Env B \c\` moreover - have B': "B \ B'" . + note B' = `B \ B'` ultimately obtain C' where "Env\ B' \\c\\ C'" by iprover then obtain A' where "Env\ B' \\Break l\ c\\ A'" @@ -1356,10 +1352,10 @@ thus ?case .. next case (Comp Env B c1 C1 c2 C2 A B') - have da_c1: "Env\ B \\c1\\ C1" . - have "PROP ?Hyp Env B \c1\" . + note da_c1 = `Env\ B \\c1\\ C1` + note `PROP ?Hyp Env B \c1\` moreover - have B': "B \ B'" . + note B' = `B \ B'` ultimately obtain C1' where da_c1': "Env\ B' \\c1\\ C1'" by iprover with da_c1 B' @@ -1367,7 +1363,7 @@ "nrm C1 \ nrm C1'" by (rule da_monotone [elim_format]) simp moreover - have "PROP ?Hyp Env (nrm C1) \c2\" . + note `PROP ?Hyp Env (nrm C1) \c2\` ultimately obtain C2' where "Env\ nrm C1' \\c2\\ C2'" by iprover with da_c1' obtain A' where "Env\ B' \\c1;; c2\\ A'" @@ -1375,7 +1371,7 @@ thus ?case .. next case (If Env B e E c1 C1 c2 C2 A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E' where "Env\ B' \\e\\ E'" proof - have "PROP ?Hyp Env B \e\" by (rule If.hyps) @@ -1409,8 +1405,8 @@ thus ?case .. next case (Loop Env B e E c C A l B') - have B': "B \ B'" . - obtain E' where "Env\ B' \\e\\ E'" + note B' = `B \ B'` + obtain E' where "Env\ B' \\e\\ E'" proof - have "PROP ?Hyp Env B \e\" by (rule Loop.hyps) with B' @@ -1433,7 +1429,7 @@ thus ?case .. next case (Jmp jump B A Env B') - have B': "B \ B'" . + note B' = `B \ B'` with Jmp.hyps have "jump = Ret \ Result \ B' " by auto moreover @@ -1452,7 +1448,7 @@ case Throw thus ?case by (iprover intro: da.Throw ) next case (Try Env B c1 C1 vn C c2 C2 A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain C1' where "Env\ B' \\c1\\ C1'" proof - have "PROP ?Hyp Env B \c1\" by (rule Try.hyps) @@ -1477,7 +1473,7 @@ thus ?case .. next case (Fin Env B c1 C1 c2 C2 A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain C1' where C1': "Env\ B' \\c1\\ C1'" proof - have "PROP ?Hyp Env B \c1\" by (rule Fin.hyps) @@ -1511,11 +1507,11 @@ case UnOp thus ?case by (iprover intro: da.UnOp) next case (CondAnd Env B e1 E1 e2 E2 A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E1' where "Env\ B' \\e1\\ E1'" proof - have "PROP ?Hyp Env B \e1\" by (rule CondAnd.hyps) - with B' + with B' show ?thesis using that by iprover qed moreover @@ -1533,7 +1529,7 @@ thus ?case .. next case (CondOr Env B e1 E1 e2 E2 A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E1' where "Env\ B' \\e1\\ E1'" proof - have "PROP ?Hyp Env B \e1\" by (rule CondOr.hyps) @@ -1555,11 +1551,11 @@ thus ?case .. next case (BinOp Env B e1 E1 e2 A binop B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E1' where E1': "Env\ B' \\e1\\ E1'" proof - have "PROP ?Hyp Env B \e1\" by (rule BinOp.hyps) - with B' + with B' show ?thesis using that by iprover qed moreover @@ -1579,22 +1575,22 @@ thus ?case .. next case (Super B Env B') - have B': "B \ B'" . - with Super.hyps have "This \ B' " + note B' = `B \ B'` + with Super.hyps have "This \ B'" by auto thus ?case by (iprover intro: da.Super) next case (AccLVar vn B A Env B') - have "vn \ B" . + note `vn \ B` moreover - have "B \ B'" . + note `B \ B'` ultimately have "vn \ B'" by auto thus ?case by (iprover intro: da.AccLVar) next case Acc thus ?case by (iprover intro: da.Acc) next case (AssLVar Env B e E A vn B') - have B': "B \ B'" . + note B' = `B \ B'` then obtain E' where "Env\ B' \\e\\ E'" by (rule AssLVar.hyps [elim_format]) iprover then obtain A' where @@ -1603,8 +1599,8 @@ thus ?case .. next case (Ass v Env B V e A B') - have B': "B \ B'" . - have "\vn. v \ LVar vn". + note B' = `B \ B'` + note `\vn. v \ LVar vn` moreover obtain V' where V': "Env\ B' \\v\\ V'" proof - @@ -1629,8 +1625,8 @@ thus ?case .. next case (CondBool Env c e1 e2 B C E1 E2 A B') - have B': "B \ B'" . - have "Env\(c ? e1 : e2)\-(PrimT Boolean)" . + note B' = `B \ B'` + note `Env\(c ? e1 : e2)\-(PrimT Boolean)` moreover obtain C' where C': "Env\ B' \\c\\ C'" proof - have "PROP ?Hyp Env B \c\" by (rule CondBool.hyps) @@ -1665,8 +1661,8 @@ thus ?case .. next case (Cond Env c e1 e2 B C E1 E2 A B') - have B': "B \ B'" . - have "\ Env\(c ? e1 : e2)\-(PrimT Boolean)" . + note B' = `B \ B'` + note `\ Env\(c ? e1 : e2)\-(PrimT Boolean)` moreover obtain C' where C': "Env\ B' \\c\\ C'" proof - have "PROP ?Hyp Env B \c\" by (rule Cond.hyps) @@ -1701,7 +1697,7 @@ thus ?case .. next case (Call Env B e E args A accC statT mode mn pTs B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E' where E': "Env\ B' \\e\\ E'" proof - have "PROP ?Hyp Env B \e\" by (rule Call.hyps) @@ -1727,7 +1723,7 @@ case Methd thus ?case by (iprover intro: da.Methd) next case (Body Env B c C A D B') - have B': "B \ B'" . + note B' = `B \ B'` obtain C' where C': "Env\ B' \\c\\ C'" and nrm_C': "nrm C \ nrm C'" proof - have "Env\ B \\c\\ C" by (rule Body.hyps) @@ -1741,10 +1737,10 @@ with da_c that show ?thesis by iprover qed moreover - have "Result \ nrm C" . + note `Result \ nrm C` with nrm_C' have "Result \ nrm C'" by blast - moreover have "jumpNestingOkS {Ret} c" . + moreover note `jumpNestingOkS {Ret} c` ultimately obtain A' where "Env\ B' \\Body D c\\ A'" by (iprover intro: da.Body) @@ -1755,11 +1751,11 @@ case FVar thus ?case by (iprover intro: da.FVar) next case (AVar Env B e1 E1 e2 A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E1' where E1': "Env\ B' \\e1\\ E1'" proof - have "PROP ?Hyp Env B \e1\" by (rule AVar.hyps) - with B' + with B' show ?thesis using that by iprover qed moreover @@ -1781,7 +1777,7 @@ case Nil thus ?case by (iprover intro: da.Nil) next case (Cons Env B e E es A B') - have B': "B \ B'" . + note B' = `B \ B'` obtain E' where E': "Env\ B' \\e\\ E'" proof - have "PROP ?Hyp Env B \e\" by (rule Cons.hyps) @@ -1804,7 +1800,7 @@ by (iprover intro: da.Cons) thus ?case .. qed -qed +qed (rule `B \ B'`) (* Remarks about the proof style: