# HG changeset patch # User kleing # Date 1311864974 -7200 # Node ID a9fcbafdf208f3f6b32a9823abb20d12c8f11b27 # Parent 0a0ee31ec20ae4dbcc9fe3497447b92b6daaf589 compiler proof cleanup diff -r 0a0ee31ec20a -r a9fcbafdf208 src/HOL/IMP/Comp_Rev.thy --- a/src/HOL/IMP/Comp_Rev.thy Thu Jul 28 16:32:49 2011 +0200 +++ b/src/HOL/IMP/Comp_Rev.thy Thu Jul 28 16:56:14 2011 +0200 @@ -22,7 +22,6 @@ | JMPFGE j \ {n + 1 + j, n + 1} | _ \ {n +1}" -(* FIXME: _Collect? *) text {* The possible successors pc's of an instruction list *} definition "succs P n = {s. \i. 0 \ i \ i < isize P \ s \ isuccs (P!!i) (n+i)}" @@ -36,7 +35,7 @@ lemma exec_n_exec: "P \ c \^n c' \ P \ c \* c'" - by (induct n arbitrary: c) (auto intro: exec.step) + by (induct n arbitrary: c) auto lemma exec_0 [intro!]: "P \ c \^0 c" by simp @@ -56,7 +55,7 @@ "[] \ c \^k c' = (c' = c \ k = 0)" by (induct k) auto -lemma exec1_exec_n [elim,intro!]: +lemma exec1_exec_n [intro!]: "P \ c \ c' \ P \ c \^1 c'" by (cases c') simp @@ -133,8 +132,9 @@ qed lemma succs_iexec1: - "\ P!!i \i (i,s,stk) \ c'; 0 \ i; i < isize P \ \ fst c' \ succs P 0" - by (auto elim!: iexec1.cases simp: succs_def isuccs_def) + assumes "P!!i \i (i,s,stk) \ c'" "0 \ i" "i < isize P" + shows "fst c' \ succs P 0" + using assms by (auto elim!: iexec1.cases simp: succs_def isuccs_def) lemma succs_shift: "(p - n \ succs P 0) = (p \ succs P n)" @@ -256,14 +256,15 @@ by (auto elim!: iexec1.cases) lemma exec_n_split: - shows "\ P @ c @ P' \ (isize P + i, s) \^n (j, s'); - 0 \ i; i < isize c; j \ {isize P ..< isize P + isize c} \ \ - \s'' i' k m. + assumes "P @ c @ P' \ (isize P + i, s) \^n (j, s')" + "0 \ i" "i < isize c" + "j \ {isize P ..< isize P + isize c}" + shows "\s'' i' k m. c \ (i, s) \^k (i', s'') \ i' \ exits c \ P @ c @ P' \ (isize P + i', s'') \^m (j, s') \ n = k + m" -proof (induct n arbitrary: i j s) +using assms proof (induct n arbitrary: i j s) case 0 thus ?case by simp next @@ -304,14 +305,14 @@ qed lemma exec_n_drop_right: - shows "\ c @ P' \ (0, s) \^n (j, s'); j \ {0.. \ - \s'' i' k m. - (if c = [] then s'' = s \ i' = 0 \ k = 0 - else - c \ (0, s) \^k (i', s'') \ - i' \ exits c) \ - c @ P' \ (i', s'') \^m (j, s') \ - n = k + m" + assumes "c @ P' \ (0, s) \^n (j, s')" "j \ {0..s'' i' k m. + (if c = [] then s'' = s \ i' = 0 \ k = 0 + else c \ (0, s) \^k (i', s'') \ + i' \ exits c) \ + c @ P' \ (i', s'') \^m (j, s') \ + n = k + m" + using assms by (cases "c = []") (auto dest: exec_n_split [where P="[]", simplified]) @@ -334,10 +335,10 @@ qed lemma exec_n_drop_left: - "\ P @ P' \ (i, s, stk) \^k (n, s', stk'); - isize P \ i; exits P' \ {0..} \ \ - P' \ (i - isize P, s, stk) \^k (n - isize P, s', stk')" -proof (induct k arbitrary: i s stk) + assumes "P @ P' \ (i, s, stk) \^k (n, s', stk')" + "isize P \ i" "exits P' \ {0..}" + shows "P' \ (i - isize P, s, stk) \^k (n - isize P, s', stk')" +using assms proof (induct k arbitrary: i s stk) case 0 thus ?case by simp next case (Suc k) @@ -427,22 +428,21 @@ qed (auto simp: exec_n_simps) lemma bcomp_split: - shows "\ bcomp b c i @ P' \ (0, s, stk) \^n (j, s', stk'); - j \ {0.. i \ \ - \s'' stk'' i' k m. + assumes "bcomp b c i @ P' \ (0, s, stk) \^n (j, s', stk')" + "j \ {0.. i" + shows "\s'' stk'' i' k m. bcomp b c i \ (0, s, stk) \^k (i', s'', stk'') \ (i' = isize (bcomp b c i) \ i' = i + isize (bcomp b c i)) \ bcomp b c i @ P' \ (i', s'', stk'') \^m (j, s', stk') \ n = k + m" - by (cases "bcomp b c i = []") - (fastsimp dest!: exec_n_drop_right)+ + using assms by (cases "bcomp b c i = []") (fastsimp dest!: exec_n_drop_right)+ lemma bcomp_exec_n [dest]: - "\ bcomp b c j \ (0, s, stk) \^n (i, s', stk'); - isize (bcomp b c j) \ i; 0 \ j \ \ - i = isize(bcomp b c j) + (if c = bval b s then j else 0) \ - s' = s \ stk' = stk" -proof (induct b arbitrary: c j i n s' stk') + assumes "bcomp b c j \ (0, s, stk) \^n (i, s', stk')" + "isize (bcomp b c j) \ i" "0 \ j" + shows "i = isize(bcomp b c j) + (if c = bval b s then j else 0) \ + s' = s \ stk' = stk" +using assms proof (induct b arbitrary: c j i n s' stk') case B thus ?case by (simp split: split_if_asm add: exec_n_simps) next @@ -554,7 +554,7 @@ let ?c0 = "WHILE b DO c" let ?cs = "ccomp ?c0" let ?bs = "bcomp b False (isize (ccomp c) + 1)" - let ?jmp = "[JMPB (isize ?bs + isize (ccomp c) + 1)]" + let ?jmp = "[JMP (-((isize ?bs + isize (ccomp c) + 1)))]" from "1.prems" b obtain k where diff -r 0a0ee31ec20a -r a9fcbafdf208 src/HOL/IMP/Compiler.thy --- a/src/HOL/IMP/Compiler.thy Thu Jul 28 16:32:49 2011 +0200 +++ b/src/HOL/IMP/Compiler.thy Thu Jul 28 16:56:14 2011 +0200 @@ -40,10 +40,6 @@ JMPFLESS int | JMPFGE int -(* reads slightly nicer *) -abbreviation - "JMPB i == JMP (-i)" - type_synonym stack = "val list" type_synonym config = "int\state\stack" @@ -51,7 +47,7 @@ abbreviation "tl2 xs == tl(tl xs)" inductive iexec1 :: "instr \ config \ config \ bool" - ("(_/ \i (_ \/ _))" [50,0,0] 50) + ("(_/ \i (_ \/ _))" [59,0,59] 60) where "LOADI n \i (i,s,stk) \ (i+1,s, n#stk)" | "LOAD x \i (i,s,stk) \ (i+1,s, s x # stk)" | @@ -66,16 +62,17 @@ declare iexec1.intros definition - exec1 :: "instr list \ config \ config \ bool" ("(_/ \ (_ \/ _))" [50,0,0] 50) + exec1 :: "instr list \ config \ config \ bool" ("(_/ \ (_ \/ _))" [59,0,59] 60) where "P \ c \ c' = - (\i s stk. c = (i,s,stk) \ P!!i \i (i,s,stk) \ c' \ 0 \ i \ i < isize P)" + (\i s stk. c = (i,s,stk) \ P!!i \i (i,s,stk) \ c' \ 0 \ i \ i < isize P)" declare exec1_def [simp] lemma exec1I [intro, code_pred_intro]: - "\ P!!i \i (i,s,stk) \ c'; 0 \ i; i < isize P \ \ P \ (i,s,stk) \ c'" - by simp + assumes "P!!i \i (i,s,stk) \ c'" "0 \ i" "i < isize P" + shows "P \ (i,s,stk) \ c'" + using assms by simp inductive exec :: "instr list \ config \ config \ bool" ("_/ \ (_ \*/ _)" 50) where @@ -245,7 +242,8 @@ in cb @ cc\<^isub>1 @ JMP (isize cc\<^isub>2) # cc\<^isub>2)" | "ccomp (WHILE b DO c) = (let cc = ccomp c; cb = bcomp b False (isize cc + 1) - in cb @ cc @ [JMPB (isize cb + isize cc + 1)])" + in cb @ cc @ [JMP (-(isize cb + isize cc + 1))])" + value "ccomp (IF Less (V ''u'') (N 1) THEN ''u'' ::= Plus (V ''u'') (N 1)