diff -r 42a54d6cec15 -r 51c5f3f11d16 src/HOL/MicroJava/BV/Kildall.thy --- a/src/HOL/MicroJava/BV/Kildall.thy Sat Mar 02 12:09:23 2002 +0100 +++ b/src/HOL/MicroJava/BV/Kildall.thy Sun Mar 03 16:59:08 2002 +0100 @@ -11,24 +11,24 @@ theory Kildall = Typing_Framework + While_Combinator + Product: -syntax "@lesubstep_type" :: "(nat \ 's) list => 's ord => (nat \ 's) list => bool" +syntax "@lesubstep_type" :: "(nat \ 's) list \ 's ord \ (nat \ 's) list \ bool" ("(_ /<=|_| _)" [50, 0, 51] 50) translations "x <=|r| y" == "x <=[(Product.le (op =) r)] y" constdefs - pres_type :: "'s step_type => nat => 's set => bool" + pres_type :: "'s step_type \ nat \ 's set \ bool" "pres_type step n A == \s\A. \p(q,s')\set (step p s). s' \ A" - mono :: "'s ord => 's step_type => nat => 's set => bool" + mono :: "'s ord \ 's step_type \ nat \ 's set \ bool" "mono r step n A == - \s p t. s \ A \ p < n \ s <=_r t --> step p s <=|r| step p t" + \s p t. s \ A \ p < n \ s <=_r t \ step p s <=|r| step p t" consts iter :: "'s binop \ 's step_type \ 's list \ nat set \ 's list \ nat set" - propa :: "'s binop => (nat \ 's) list => 's list => nat set => 's list * nat set" + propa :: "'s binop \ (nat \ 's) list \ 's list \ nat set \ 's list * nat set" primrec "propa f [] ss w = (ss,w)" @@ -45,13 +45,13 @@ (ss,w)" constdefs - unstables :: "'s ord => 's step_type => 's list => nat set" + unstables :: "'s ord \ 's step_type \ 's list \ nat set" "unstables r step ss == {p. p < size ss \ \stable r step ss p}" - kildall :: "'s ord => 's binop => 's step_type => 's list => 's list" + kildall :: "'s ord \ 's binop \ 's step_type \ 's list \ 's list" "kildall r f step ss == fst(iter f step ss (unstables r step ss))" -consts merges :: "'s binop => (nat \ 's) list => 's list => 's list" +consts merges :: "'s binop \ (nat \ 's) list \ 's list \ 's list" primrec "merges f [] ss = ss" "merges f (p'#ps) ss = (let (p,s) = p' in merges f ps (ss[p := s +_f ss!p]))" @@ -61,16 +61,16 @@ consts - "@plusplussub" :: "'a list => ('a => 'a => 'a) => 'a => 'a" ("(_ /++'__ _)" [65, 1000, 66] 65) + "@plusplussub" :: "'a list \ ('a \ 'a \ 'a) \ 'a \ 'a" ("(_ /++'__ _)" [65, 1000, 66] 65) primrec "[] ++_f y = y" "(x#xs) ++_f y = xs ++_f (x +_f y)" lemma nth_merges: - "!!ss. [| semilat (A, r, f); p < length ss; ss \ list n A; - \(p,t)\set ps. p t\A |] ==> + "\ss. \ semilat (A, r, f); p < length ss; ss \ list n A; + \(p,t)\set ps. p t\A \ \ (merges f ps ss)!p = map snd [(p',t') \ ps. p'=p] ++_f ss!p" - (is "!!ss. _ \ _ \ _ \ ?steptype ps \ ?P ss ps") + (is "\ss. _ \ _ \ _ \ ?steptype ps \ ?P ss ps") proof (induct ps) show "\ss. ?P ss []" by simp @@ -98,15 +98,15 @@ lemma pres_typeD: - "[| pres_type step n A; s\A; pset (step p s) |] ==> s' \ A" + "\ pres_type step n A; s\A; pset (step p s) \ \ s' \ A" by (unfold pres_type_def, blast) lemma boundedD: - "[| bounded step n; p < n; (q,t) : set (step p xs) |] ==> q < n" + "\ bounded step n; p < n; (q,t) : set (step p xs) \ \ q < n" by (unfold bounded_def, blast) lemma monoD: - "[| mono r step n A; p < n; s\A; s <=_r t |] ==> step p s <=|r| step p t" + "\ mono r step n A; p < n; s\A; s <=_r t \ \ step p s <=|r| step p t" by (unfold mono_def, blast) (** merges **) @@ -117,9 +117,9 @@ lemma merges_preserves_type_lemma: - "[| semilat(A,r,f) |] ==> - \xs. xs \ list n A --> (\(p,x) \ set ps. p x\A) - --> merges f ps xs \ list n A" + "semilat(A,r,f) \ + \xs. xs \ list n A \ (\(p,x) \ set ps. p x\A) + \ merges f ps xs \ list n A" apply (frule semilatDclosedI) apply (unfold closed_def) apply (induct_tac ps) @@ -128,13 +128,13 @@ done lemma merges_preserves_type [simp]: - "[| semilat(A,r,f); xs \ list n A; \(p,x) \ set ps. p x\A |] - ==> merges f ps xs \ list n A" + "\ semilat(A,r,f); xs \ list n A; \(p,x) \ set ps. p x\A \ + \ merges f ps xs \ list n A" by (simp add: merges_preserves_type_lemma) lemma merges_incr_lemma: - "[| semilat(A,r,f) |] ==> - \xs. xs \ list n A --> (\(p,x)\set ps. p x \ A) --> xs <=[r] merges f ps xs" + "semilat(A,r,f) \ + \xs. xs \ list n A \ (\(p,x)\set ps. p x \ A) \ xs <=[r] merges f ps xs" apply (induct_tac ps) apply simp apply simp @@ -149,14 +149,14 @@ done lemma merges_incr: - "[| semilat(A,r,f); xs \ list n A; \(p,x)\set ps. p x \ A |] - ==> xs <=[r] merges f ps xs" + "\ semilat(A,r,f); xs \ list n A; \(p,x)\set ps. p x \ A \ + \ xs <=[r] merges f ps xs" by (simp add: merges_incr_lemma) lemma merges_same_conv [rule_format]: - "[| semilat(A,r,f) |] ==> - (\xs. xs \ list n A --> (\(p,x)\set ps. p x\A) --> + "semilat(A,r,f) \ + (\xs. xs \ list n A \ (\(p,x)\set ps. p x\A) \ (merges f ps xs = xs) = (\(p,x)\set ps. x <=_r xs!p))" apply (induct_tac ps) apply simp @@ -191,25 +191,25 @@ lemma list_update_le_listI [rule_format]: - "set xs <= A --> set ys <= A --> xs <=[r] ys --> p < size xs --> - x <=_r ys!p --> semilat(A,r,f) --> x\A --> + "set xs <= A \ set ys <= A \ xs <=[r] ys \ p < size xs \ + x <=_r ys!p \ semilat(A,r,f) \ x\A \ xs[p := x +_f xs!p] <=[r] ys" apply (unfold Listn.le_def lesub_def semilat_def) apply (simp add: list_all2_conv_all_nth nth_list_update) done lemma merges_pres_le_ub: - "[| semilat(A,r,f); set ts <= A; set ss <= A; + "\ semilat(A,r,f); set ts <= A; set ss <= A; \(p,t)\set ps. t <=_r ts!p \ t \ A \ p < size ts; - ss <=[r] ts |] - ==> merges f ps ss <=[r] ts" + ss <=[r] ts \ + \ merges f ps ss <=[r] ts" proof - { fix A r f t ts ps have - "!!qs. [| semilat(A,r,f); set ts <= A; - \(p,t)\set ps. t <=_r ts!p \ t \ A \ p < size ts |] ==> - set qs <= set ps --> - (\ss. set ss <= A --> ss <=[r] ts --> merges f qs ss <=[r] ts)" + "\qs. \ semilat(A,r,f); set ts <= A; + \(p,t)\set ps. t <=_r ts!p \ t \ A \ p < size ts \ \ + set qs <= set ps \ + (\ss. set ss <= A \ ss <=[r] ts \ merges f qs ss <=[r] ts)" apply (induct_tac qs) apply simp apply (simp (no_asm_simp)) @@ -233,7 +233,7 @@ lemma decomp_propa: - "!!ss w. (\(q,t)\set qs. q < size ss) \ + "\ss w. (\(q,t)\set qs. q < size ss) \ propa f qs ss w = (merges f qs ss, {q. \t. (q,t)\set qs \ t +_f ss!q \ ss!q} Un w)" apply (induct qs) @@ -263,7 +263,7 @@ thus "(x#xs) ++_f y \ A" by simp qed -lemma ub2: "!!y. \semilat (A, r, f); set x \ A; y \ A\ \ y <=_r x ++_f y" +lemma ub2: "\y. \semilat (A, r, f); set x \ A; y \ A\ \ y <=_r x ++_f y" proof (induct x) show "\y. semilat(A, r, f) \ y <=_r [] ++_f y" by simp @@ -287,7 +287,8 @@ qed -lemma ub1: "\y. \semilat (A, r, f); set ls \ A; y \ A; x \ set ls\ \ x <=_r ls ++_f y" +lemma ub1: + "\y. \semilat (A, r, f); set ls \ A; y \ A; x \ set ls\ \ x <=_r ls ++_f y" proof (induct ls) show "\y. x \ set [] \ x <=_r [] ++_f y" by simp @@ -298,7 +299,8 @@ then obtain s: "s \ A" and ls: "set ls \ A" by simp assume y: "y \ A" - assume "\y. \semilat (A, r, f); set ls \ A; y \ A; x \ set ls\ \ x <=_r ls ++_f y" + assume + "\y. \semilat (A, r, f); set ls \ A; y \ A; x \ set ls\ \ x <=_r ls ++_f y" hence IH: "\y. x \ set ls \ y \ A \ x <=_r ls ++_f y" . assume "x \ set (s#ls)" @@ -356,12 +358,12 @@ lemma stable_pres_lemma: - "[| semilat (A,r,f); pres_type step n A; bounded step n; + "\ semilat (A,r,f); pres_type step n A; bounded step n; ss \ list n A; p \ w; \q\w. q < n; \q. q < n \ q \ w \ stable r step ss q; q < n; \s'. (q,s') \ set (step p (ss ! p)) \ s' +_f ss ! q = ss ! q; - q \ w \ q = p |] - ==> stable r step (merges f (step p (ss!p)) ss) q" + q \ w \ q = p \ + \ stable r step (merges f (step p (ss!p)) ss) q" apply (unfold stable_def) apply (subgoal_tac "\s'. (q,s') \ set (step p (ss!p)) \ s' : A") prefer 2 @@ -434,7 +436,7 @@ lemma lesub_step_type: - "!!b x y. a <=|r| b \ (x,y) \ set a \ \y'. (x, y') \ set b \ y <=_r y'" + "\b x y. a <=|r| b \ (x,y) \ set a \ \y'. (x, y') \ set b \ y <=_r y'" apply (induct a) apply simp apply simp @@ -451,10 +453,10 @@ lemma merges_bounded_lemma: - "[| semilat (A,r,f); mono r step n A; bounded step n; + "\ semilat (A,r,f); mono r step n A; bounded step n; \(p',s') \ set (step p (ss!p)). s' \ A; ss \ list n A; ts \ list n A; p < n; - ss <=[r] ts; ! p. p < n --> stable r step ts p |] - ==> merges f (step p (ss!p)) ss <=[r] ts" + ss <=[r] ts; ! p. p < n \ stable r step ts p \ + \ merges f (step p (ss!p)) ss <=[r] ts" apply (unfold stable_def) apply (rule merges_pres_le_ub) apply assumption @@ -481,7 +483,7 @@ done lemma termination_lemma: - "[| semilat(A,r,f); ss \ list n A; \(q,t)\set qs. q t\A; p\w |] ==> + "\ semilat(A,r,f); ss \ list n A; \(q,t)\set qs. q t\A; p\w \ \ ss <[r] merges f qs ss \ merges f qs ss = ss \ {q. \t. (q,t)\set qs \ t +_f ss!q \ ss!q} Un (w-{p}) < w" apply (unfold lesssub_def) @@ -617,10 +619,10 @@ done lemma is_bcv_kildall: - "[| semilat(A,r,f); acc r; top r T; + "\ semilat(A,r,f); acc r; top r T; pres_type step n A; bounded step n; - mono r step n A |] - ==> is_bcv r T step n A (kildall r f step)" + mono r step n A \ + \ is_bcv r T step n A (kildall r f step)" apply(unfold is_bcv_def wt_step_def) apply(insert kildall_properties[of A]) apply(simp add:stables_def)