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≤i<n]
(WHILE (∀j<n. 🍋X 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<m ⟶ P(B!(🍋Y i)) ∧🍋Y i≤ m+i)}, {(∀j<n. i≠j ⟶♀Y j ≤♂Y j) ∧♂X i = ♀X i ∧ ♂Y i = ♀Y i}, {(∀j<n. i≠j ⟶♂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<m ⟶ P(B!(🍋Y i)) ∧🍋Y i≤ m+i) ∧ (∃j<n. 🍋Y j ≤🍋X i) })
COEND
SAT [{∀i<n. 🍋X i=i ∧🍋Y i=m+i },{♂X=♀X ∧♂Y=♀Y},{True}, {∀i<n. (🍋X i) mod n=i ∧ (∀j<🍋X i. j mod n=i ⟶¬P(B!j)) ∧
(🍋Y i<m ⟶ P(B!(🍋Y i)) ∧🍋Y i≤ m+i) ∧ (∃j<n. 🍋Y 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 (erule dvdE) apply(rule_tac pre'="\ \X i mod n = i \ (\j. j<\X i \ j mod n = i \ \P(B!j)) \ (\Y i < n * k \ 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 fastforce 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\i
(WHILE (∀j<n. 🍋X!i < 🍋Y!j) DO IF P(B!(🍋X!i)) THEN🍋Y:=🍋Y[i:=🍋X!i] ELSE 🍋X:= 🍋X[i:=(🍋X!i)+ n] FI
OD, {n<length 🍋X ∧ n<length 🍋Y ∧ (🍋X!i) mod n=i ∧ (∀j<🍋X!i. j mod n=i ⟶¬P(B!j)) ∧ (🍋Y!i<m ⟶ P(B!(🍋Y!i)) ∧🍋Y!i≤ m+i)}, {(∀j<n. i≠j ⟶♀Y!j ≤♂Y!j) ∧♂X!i = ♀X!i ∧ ♂Y!i = ♀Y!i ∧ length ♂X = length ♀X ∧ length ♂Y = length ♀Y}, {(∀j<n. i≠j ⟶♂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<m ⟶ P(B!(🍋Y!i)) ∧🍋Y!i≤ m+i) ∧ (∃j<n. 🍋Y!j ≤🍋X!i) }) COEND)
SAT [{n<length 🍋X ∧ n<length 🍋Y ∧ (∀i<n. 🍋X!i=i ∧🍋Y!i=m+i) }, {♂X=♀X ∧♂Y=♀Y}, {True}, {∀i<n. (🍋X!i) mod n=i ∧ (∀j<🍋X!i. j mod n=i ⟶¬P(B!j)) ∧
(🍋Y!i<m ⟶ P(B!(🍋Y!i)) ∧🍋Y!i≤ m+i) ∧ (∃j<n. 🍋Y!j ≤🍋X!i)}]" apply (rule Parallel) apply (auto cong del: image_cong_simp) apply force apply (rule While) apply force apply force apply force apply (erule dvdE) 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 * k \ 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
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.