diff -r c876bcb601fc -r 5b65449d7669 src/HOL/HoareParallel/RG_Examples.thy --- a/src/HOL/HoareParallel/RG_Examples.thy Thu Sep 17 14:17:37 2009 +1000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,359 +0,0 @@ -header {* \section{Examples} *} - -theory RG_Examples -imports RG_Syntax -begin - -lemmas definitions [simp]= stable_def Pre_def Rely_def Guar_def Post_def Com_def - -subsection {* Set Elements of an Array to Zero *} - -lemma le_less_trans2: "\(j::nat) j\ \ i (a::nat) < c; b\d \ \ a + b < c + d" -by simp - -record Example1 = - A :: "nat list" - -lemma Example1: - "\ COBEGIN - SCHEME [0 \ i < n] - (\A := \A [i := 0], - \ n < length \A \, - \ length \A = length \A \ \A ! i = \A ! i \, - \ length \A = length \A \ (\j j \ \A ! j = \A ! j) \, - \ \A ! i = 0 \) - COEND - SAT [\ n < length \A \, \ \A = \A \, \ True \, \ \i < n. \A ! i = 0 \]" -apply(rule Parallel) -apply (auto intro!: Basic) -done - -lemma Example1_parameterized: -"k < t \ - \ COBEGIN - SCHEME [k*n\i<(Suc k)*n] (\A:=\A[i:=0], - \t*n < length \A\, - \t*n < length \A \ length \A=length \A \ \A!i = \A!i\, - \t*n < length \A \ length \A=length \A \ (\jA . i\j \ \A!j = \A!j)\, - \\A!i=0\) - COEND - SAT [\t*n < length \A\, - \t*n < length \A \ length \A=length \A \ (\iA!(k*n+i)=\A!(k*n+i))\, - \t*n < length \A \ length \A=length \A \ - (\iA . (i \A!i = \A!i) \ ((Suc k)*n \ i\ \A!i = \A!i))\, - \\iA!(k*n+i) = 0\]" -apply(rule Parallel) - apply auto - apply(erule_tac x="k*n +i" in allE) - apply(subgoal_tac "k*n+i COBEGIN - (\ \x:=\x+1;; \c_0:=\c_0 + 1 \, - \\x=\c_0 + \c_1 \ \c_0=0\, - \\c_0 = \c_0 \ - (\x=\c_0 + \c_1 - \ \x = \c_0 + \c_1)\, - \\c_1 = \c_1 \ - (\x=\c_0 + \c_1 - \ \x =\c_0 + \c_1)\, - \\x=\c_0 + \c_1 \ \c_0=1 \) - \ - (\ \x:=\x+1;; \c_1:=\c_1+1 \, - \\x=\c_0 + \c_1 \ \c_1=0 \, - \\c_1 = \c_1 \ - (\x=\c_0 + \c_1 - \ \x = \c_0 + \c_1)\, - \\c_0 = \c_0 \ - (\x=\c_0 + \c_1 - \ \x =\c_0 + \c_1)\, - \\x=\c_0 + \c_1 \ \c_1=1\) - COEND - SAT [\\x=0 \ \c_0=0 \ \c_1=0\, - \\x=\x \ \c_0= \c_0 \ \c_1=\c_1\, - \True\, - \\x=2\]" -apply(rule Parallel) - apply simp_all - apply clarify - apply(case_tac i) - apply simp - apply(rule conjI) - apply clarify - apply simp - apply clarify - apply simp - apply(case_tac j,simp) - apply simp - apply simp - apply(rule conjI) - apply clarify - apply simp - apply clarify - apply simp - apply(subgoal_tac "j=0") - apply (rotate_tac -1) - apply (simp (asm_lr)) - apply arith - apply clarify - apply(case_tac i,simp,simp) - apply clarify - apply simp - apply(erule_tac x=0 in all_dupE) - apply(erule_tac x=1 in allE,simp) -apply clarify -apply(case_tac i,simp) - apply(rule Await) - apply simp_all - apply(clarify) - apply(rule Seq) - prefer 2 - apply(rule Basic) - apply simp_all - apply(rule subset_refl) - apply(rule Basic) - apply simp_all - apply clarify - apply simp -apply(rule Await) - apply simp_all -apply(clarify) -apply(rule Seq) - prefer 2 - apply(rule Basic) - apply simp_all - apply(rule subset_refl) -apply(auto intro!: Basic) -done - -subsubsection {* Parameterized *} - -lemma Example2_lemma2_aux: "j - (\i=0..i=0..i=0.. s \ (\i::nat=0..i=0..j \ Suc (\i::nat=0..i=0..i=0..i=0..j") - apply(drule_tac b="b" and t="(Suc 0)" in Example2_lemma2_aux2) -apply(rotate_tac -1) -apply(erule ssubst) -apply simp_all -done - -lemma Example2_lemma2_Suc0: "\j \ - Suc (\i::nat=0..< n. b i)=(\i=0..< n. (b (j:=Suc 0)) i)" -by(simp add:Example2_lemma2) - -record Example2_parameterized = - C :: "nat \ nat" - y :: nat - -lemma Example2_parameterized: "0 - \ COBEGIN SCHEME [0\i \y:=\y+1;; \C:=\C (i:=1) \, - \\y=(\i=0..C i) \ \C i=0\, - \\C i = \C i \ - (\y=(\i=0..C i) \ \y =(\i=0..C i))\, - \(\jj \ \C j = \C j) \ - (\y=(\i=0..C i) \ \y =(\i=0..C i))\, - \\y=(\i=0..C i) \ \C i=1\) - COEND - SAT [\\y=0 \ (\i=0..C i)=0 \, \\C=\C \ \y=\y\, \True\, \\y=n\]" -apply(rule Parallel) -apply force -apply force -apply(force) -apply clarify -apply simp -apply(simp cong:setsum_ivl_cong) -apply clarify -apply simp -apply(rule Await) -apply simp_all -apply clarify -apply(rule Seq) -prefer 2 -apply(rule Basic) -apply(rule subset_refl) -apply simp+ -apply(rule Basic) -apply simp -apply clarify -apply simp -apply(simp add:Example2_lemma2_Suc0 cong:if_cong) -apply simp+ -done - -subsection {* Find Least Element *} - -text {* A previous lemma: *} - -lemma mod_aux :"\i < (n::nat); a mod n = i; j < a + n; j mod n = i; a < j\ \ False" -apply(subgoal_tac "a=a div n*n + a mod n" ) - prefer 2 apply (simp (no_asm_use)) -apply(subgoal_tac "j=j div n*n + j mod n") - prefer 2 apply (simp (no_asm_use)) -apply simp -apply(subgoal_tac "a div n*n < j div n*n") -prefer 2 apply arith -apply(subgoal_tac "j div n*n < (a div n + 1)*n") -prefer 2 apply simp -apply (simp only:mult_less_cancel2) -apply arith -done - -record Example3 = - X :: "nat \ nat" - Y :: "nat \ nat" - -lemma Example3: "m mod n=0 \ - \ COBEGIN - SCHEME [0\ijX i < \Y j) DO - IF P(B!(\X i)) THEN \Y:=\Y (i:=\X i) - ELSE \X:= \X (i:=(\X i)+ n) FI - OD, - \(\X i) mod n=i \ (\j<\X i. j mod n=i \ \P(B!j)) \ (\Y i P(B!(\Y i)) \ \Y i\ m+i)\, - \(\jj \ \Y j \ \Y j) \ \X i = \X i \ - \Y i = \Y i\, - \(\jj \ \X j = \X j \ \Y j = \Y j) \ - \Y i \ \Y i\, - \(\X i) mod n=i \ (\j<\X i. j mod n=i \ \P(B!j)) \ (\Y i P(B!(\Y i)) \ \Y i\ m+i) \ (\jY j \ \X i) \) - COEND - SAT [\ \iX i=i \ \Y i=m+i \,\\X=\X \ \Y=\Y\,\True\, - \\iX i) mod n=i \ (\j<\X i. j mod n=i \ \P(B!j)) \ - (\Y i P(B!(\Y i)) \ \Y i\ m+i) \ (\jY j \ \X i)\]" -apply(rule Parallel) ---{*5 subgoals left *} -apply force+ -apply clarify -apply simp -apply(rule While) - apply force - apply force - apply force - apply(rule_tac pre'="\ \X i mod n = i \ (\j. j<\X i \ j mod n = i \ \P(B!j)) \ (\Y i < n * q \ P (B!(\Y i))) \ \X i<\Y i\" in Conseq) - apply force - apply(rule subset_refl)+ - apply(rule Cond) - apply force - apply(rule Basic) - apply force - apply fastsimp - apply force - apply force - apply(rule Basic) - apply simp - apply clarify - apply simp - apply (case_tac "X x (j mod n) \ j") - apply (drule le_imp_less_or_eq) - apply (erule disjE) - apply (drule_tac j=j and n=n and i="j mod n" and a="X x (j mod n)" in mod_aux) - apply auto -done - -text {* Same but with a list as auxiliary variable: *} - -record Example3_list = - X :: "nat list" - Y :: "nat list" - -lemma Example3_list: "m mod n=0 \ \ (COBEGIN SCHEME [0\ijX!i < \Y!j) DO - IF P(B!(\X!i)) THEN \Y:=\Y[i:=\X!i] ELSE \X:= \X[i:=(\X!i)+ n] FI - OD, - \nX \ nY \ (\X!i) mod n=i \ (\j<\X!i. j mod n=i \ \P(B!j)) \ (\Y!i P(B!(\Y!i)) \ \Y!i\ m+i)\, - \(\jj \ \Y!j \ \Y!j) \ \X!i = \X!i \ - \Y!i = \Y!i \ length \X = length \X \ length \Y = length \Y\, - \(\jj \ \X!j = \X!j \ \Y!j = \Y!j) \ - \Y!i \ \Y!i \ length \X = length \X \ length \Y = length \Y\, - \(\X!i) mod n=i \ (\j<\X!i. j mod n=i \ \P(B!j)) \ (\Y!i P(B!(\Y!i)) \ \Y!i\ m+i) \ (\jY!j \ \X!i) \) COEND) - SAT [\nX \ nY \ (\iX!i=i \ \Y!i=m+i) \, - \\X=\X \ \Y=\Y\, - \True\, - \\iX!i) mod n=i \ (\j<\X!i. j mod n=i \ \P(B!j)) \ - (\Y!i P(B!(\Y!i)) \ \Y!i\ m+i) \ (\jY!j \ \X!i)\]" -apply(rule Parallel) ---{* 5 subgoals left *} -apply force+ -apply clarify -apply simp -apply(rule While) - apply force - apply force - apply force - apply(rule_tac pre'="\nX \ nY \ \X ! i mod n = i \ (\j. j < \X ! i \ j mod n = i \ \ P (B ! j)) \ (\Y ! i < n * q \ P (B ! (\Y ! i))) \ \X!i<\Y!i\" in Conseq) - apply force - apply(rule subset_refl)+ - apply(rule Cond) - apply force - apply(rule Basic) - apply force - apply force - apply force - apply force - apply(rule Basic) - apply simp - apply clarify - apply simp - apply(rule allI) - apply(rule impI)+ - apply(case_tac "X x ! i\ j") - apply(drule le_imp_less_or_eq) - apply(erule disjE) - apply(drule_tac j=j and n=n and i=i and a="X x ! i" in mod_aux) - apply auto -done - -end