lemma nths_update2: "i \ inds \ nths (xs[i := v]) inds = (nths xs inds)[(card {k \ inds. k < i}):= v]" proof (induct xs arbitrary: i inds) case Nil thus ?caseby simp next case (Cons x xs) thus ?case proof (cases i) case 0 with Cons show ?thesis by (simp add: nths_Cons) next case (Suc i') with Cons show ?thesis apply simp apply (simp add: nths_Cons) apply auto apply (auto simp add: nat.split) apply (simp add: card_less_Suc[symmetric]) apply (simp add: card_less_Suc2) done qed qed
lemma nths_update: "nths (xs[i := v]) inds = (if i \ inds then (nths xs inds)[(card {k \ inds. k < i}) := v] else nths xs inds)" by (simp add: nths_update1 nths_update2)
lemma nths_take: "nths xs {j. j < m} = take m xs" apply (induct xs arbitrary: m) apply simp apply (case_tac m) apply simp apply (simp add: nths_Cons) done
function nths' :: "nat \ nat \ 'a list \ 'a list" where "nths' n m [] = []"
| "nths' n 0 xs = []"
| "nths' 0 (Suc m) (x#xs) = (x#nths' 0 m xs)"
| "nths' (Suc n) (Suc m) (x#xs) = nths' n m xs" by pat_completeness auto terminationby lexicographic_order
subsection \<open>Proving equivalence to the other nths command\<close>
lemma nths'_nths: "nths' n m xs = nths xs {j. n \<le> j \<and> j < m}" apply (induct xs arbitrary: n m) apply simp apply (case_tac n) apply (case_tac m) apply simp apply (simp add: nths_Cons) apply (case_tac m) apply simp apply (simp add: nths_Cons) done
lemma"nths' n m xs = nths xs {n.. apply (induct xs arbitrary: n m) apply simp apply (case_tac n, case_tac m) apply simp apply simp apply (simp add: nths_take') apply (case_tac m) apply simp apply (simp add: nths_Cons nths'_nths) done
subsection \<open>Showing equivalence to use of drop and take for definition\<close>
lemma"nths' n m xs = take (m - n) (drop n xs)" apply (induct xs arbitrary: n m) apply simp apply (case_tac m) apply simp apply (case_tac n) apply simp apply simp done
subsection \<open>General lemma about nths\<close>
lemma nths'_Nil[simp]: "nths' i j [] = []" by simp
lemma nths'_Cons[simp]: "nths' i (Suc j) (x#xs) = (case i of 0 \<Rightarrow> (x # nths' 0 j xs) | Suc i' \<Rightarrow> nths' i' j xs)" by (cases i) auto
lemma nths'_Cons2[simp]: "nths' i j (x#xs) = (if (j = 0) then [] else ((if (i = 0) then [x] else []) @ nths' (i - 1) (j - 1) xs))" apply (cases j) apply auto apply (cases i) apply auto done
lemma nths_n_0: "nths' n 0 xs = []" by (induct xs, auto)
lemma nths'_Nil': "n \ m \ nths' n m xs = []" apply (induct xs arbitrary: n m) apply simp apply (case_tac m) apply simp apply (case_tac n) apply simp apply simp done
lemma nths'_Nil2: "n \ length xs \ nths' n m xs = []" apply (induct xs arbitrary: n m) apply simp apply (case_tac m) apply simp apply (case_tac n) apply simp apply simp done
lemma nths'_Nil3: "(nths' n m xs = []) = ((n \<ge> m) \<or> (n \<ge> length xs))" apply (induct xs arbitrary: n m) apply simp apply (case_tac m) apply simp apply (case_tac n) apply simp apply simp done
lemma nths'_notNil: "\ n < length xs; n < m \ \ nths' n m xs \ []" apply (induct xs arbitrary: n m) apply simp apply (case_tac m) apply simp apply (case_tac n) apply simp apply simp done
lemma nths'_update1: "i \ m \ nths' n m (xs[i:=v]) = nths' n m xs" apply (induct xs arbitrary: n m i) apply simp apply simp apply (case_tac i) apply simp apply simp done
lemma nths'_update2: "i < n \ nths' n m (xs[i:=v]) = nths' n m xs" apply (induct xs arbitrary: n m i) apply simp apply simp apply (case_tac i) apply simp apply simp done
lemma nths'_update3: "\n \ i; i < m\ \ nths' n m (xs[i := v]) = (nths' n m xs)[i - n := v]" proof (induct xs arbitrary: n m i) case Nil thus ?caseby auto next case (Cons x xs) thus ?case apply - apply auto apply (cases i) apply auto apply (cases i) apply auto done qed
lemma"\ nths' i j xs = nths' i j ys; n \ i; m \ j \ \ nths' n m xs = nths' n m ys" proof (induct xs arbitrary: i j ys n m) case Nil thus ?case apply - apply (rule sym, drule sym) apply (simp add: nths'_Nil) apply (simp add: nths'_Nil3) apply arith done next case (Cons x xs i j ys n m) note c = this thus ?case proof (cases m) case 0 thus ?thesis by (simp add: nths_n_0) next case (Suc m') note a = this thus ?thesis proof (cases n) case 0 note b = this show ?thesis proof (cases ys) case Nil with a b Cons.prems show ?thesis by (simp add: nths'_Nil3) next case (Cons y ys) show ?thesis proof (cases j) case 0 with a b Cons.prems show ?thesis by simp next case (Suc j') with a b Cons.prems Cons show ?thesis apply - apply (simp, rule Cons.hyps [of "0""j'""ys""0""m'"], auto) done qed qed next case (Suc n') show ?thesis proof (cases ys) case Nil with Suc a Cons.prems show ?thesis by (auto simp add: nths'_Nil3) next case (Cons y ys) with Suc a Cons.prems show ?thesis apply - apply simp apply (cases j) apply simp apply (cases i) apply simp apply (rule_tac j="nat"in Cons.hyps [of "0" _ "ys""n'""m'"]) apply simp apply simp apply simp apply simp apply (rule_tac i="nata"and j="nat"in Cons.hyps [of _ _ "ys""n'""m'"]) apply simp apply simp apply simp done qed qed qed qed
lemma length_nths': "j \ length xs \ length (nths' i j xs) = j - i" by (induct xs arbitrary: i j, auto)
lemma nths'_front: "\ i < j; i < length xs \ \ nths' i j xs = xs ! i # nths' (Suc i) j xs" apply (induct xs arbitrary: i j) apply simp apply (case_tac j) apply simp apply (case_tac i) apply simp apply simp done
lemma nths'_back: "\ i < j; j \ length xs \ \ nths' i j xs = nths' i (j - 1) xs @ [xs ! (j - 1)]" apply (induct xs arbitrary: i j) apply simp apply simp done
(* suffices that j \<le> length xs and length ys *) lemma nths'_eq_samelength_iff: "length xs = length ys \ (nths' i j xs = nths' i j ys) = (\i'. i \ i' \ i' < j \ xs ! i' = ys ! i')" proof (induct xs arbitrary: ys i j) case Nil thus ?caseby simp next case (Cons x xs) thus ?case apply - apply (cases ys) apply simp apply simp apply auto apply (case_tac i', auto) apply (erule_tac x="Suc i'"in allE, auto) apply (erule_tac x="i' - 1"in allE, auto) apply (erule_tac x="Suc i'"in allE, auto) done qed
lemma nths'_nths': "nths' n m (nths' i j xs) = nths' (i + n) (min (i + m) j) xs" by (induct xs arbitrary: i j n m) (auto simp add: min_diff)
lemma nths'_append: "\ i \ j; j \ k \ \(nths' i j xs) @ (nths' j k xs) = nths' i k xs" by (induct xs arbitrary: i j k) auto
lemma nth_nths': "\ k < j - i; j \ length xs \ \ (nths' i j xs) ! k = xs ! (i + k)" apply (induct xs arbitrary: i j k) apply simp apply (case_tac k) apply auto done
lemma set_nths': "set (nths' i j xs) = {x. \<exists>k. i \<le> k \<and> k < j \<and> k < List.length xs \<and> x = xs ! k}" apply (simp add: nths'_nths) apply (simp add: set_nths) apply auto done
lemma all_in_set_nths'_conv: "(\j. j \ set (nths' l r xs) \ P j) = (\k. l \ k \ k < r \ k < List.length xs \ P (xs ! k))" unfolding set_nths' by blast
lemma ball_in_set_nths'_conv: "(\j \ set (nths' l r xs). P j) = (\k. l \ k \ k < r \ k < List.length xs \ P (xs ! k))" unfolding set_nths' by blast
lemma mset_nths: assumes l_r: "l \ r \ r \ List.length xs" assumes left: "\ i. i < l \ (xs::'a list) ! i = ys ! i" assumes right: "\ i. i \ r \ (xs::'a list) ! i = ys ! i" assumes multiset: "mset xs = mset ys" shows"mset (nths' l r xs) = mset (nths' l r ys)" proof - from l_r have xs_def: "xs = (nths' 0 l xs) @ (nths' l r xs) @ (nths' r (List.length xs) xs)" (is"_ = ?xs_long") by (simp add: nths'_append) from multiset have length_eq: "List.length xs = List.length ys"by (rule mset_eq_length) with l_r have ys_def: "ys = (nths' 0 l ys) @ (nths' l r ys) @ (nths' r (List.length ys) ys)" (is"_ = ?ys_long") by (simp add: nths'_append) from xs_def ys_def multiset have"mset ?xs_long = mset ?ys_long"by simp moreover from left l_r length_eq have"nths' 0 l xs = nths' 0 l ys" by (auto simp add: length_nths' nth_nths' intro!: nth_equalityI) moreover from right l_r length_eq have"nths' r (List.length xs) xs = nths' r (List.length ys) ys" by (auto simp add: length_nths' nth_nths' intro!: nth_equalityI) ultimatelyshow ?thesis by (simp add: mset_append) qed
end
¤ 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.0.2Bemerkung:
Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können
¤
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 ist noch experimentell.