(* Author: Stefan Merz Author: Salomon Sickert Author: Julian Brunner Author: Peter Lammich
*)
section \<open>$\omega$-words\<close>
theory Omega_Words_Fun
imports Infinite_Set begin
text\<open>Note: This theory is based on Stefan Merz's work.\<close>
text\<open>
Automata recognize languages, which are sets of words. For the theory of $\omega$-automata, we are mostly interested in
$\omega$-words, but it is sometimes useful to reason about
finite words, too. We are modeling finite words as lists; this
lets us benefit from the existing library. Other formalizations
could be investigated, such as representing words as functions
whose domains are initial intervals of the natural numbers. \<close>
subsection \<open>Type declaration and elementary operations\<close>
text\<open>
We represent $\omega$-words as functions from the natural numbers to the alphabet type. Other possible formalizations include
a coinductivedefinition or a uniform encoding of finite and
infinite words, as studied by Müller et al. \<close>
type_synonym 'a word = "nat \ 'a"
text\<open>
We can prefix a finite word to an $\omega$-word, and a way toobtain an $\omega$-word from a finite, non-empty word is by
$\omega$-iteration. \<close>
definition
conc :: "['a list, 'a word] \ 'a word" (infixr \\\ 65) where"w \ x == \n. if n < length w then w!n else x (n - length w)"
definition
iter :: "'a list \ 'a word" (\(\notation=\postfix \\\_\<^sup>\)\ [1000]) where"iter w == if w = [] then undefined else (\n. w!(n mod (length w)))"
lemma conc_empty[simp]: "[] \ w = w" unfolding conc_def by auto
lemma conc_fst[simp]: "n < length w \ (w \ x) n = w!n" by (simp add: conc_def)
lemma conc_snd[simp]: "\(n < length w) \ (w \ x) n = x (n - length w)" by (simp add: conc_def)
lemma iter_nth [simp]: "0 < length w \ w\<^sup>\ n = w!(n mod (length w))" by (simp add: iter_def)
lemma conc_conc[simp]: "u \ v \ w = (u @ v) \ w" (is "?lhs = ?rhs") proof fix n have u: "n < length u \ ?lhs n = ?rhs n" by (simp add: conc_def nth_append) have v: "\ \(n < length u); n < length u + length v \ \ ?lhs n = ?rhs n" by (simp add: conc_def nth_append, arith) have w: "\(n < length u + length v) \ ?lhs n = ?rhs n" by (simp add: conc_def nth_append, arith) from u v w show"?lhs n = ?rhs n"by blast qed
lemma range_conc[simp]: "range (w\<^sub>1 \ w\<^sub>2) = set w\<^sub>1 \ range w\<^sub>2" proof (intro equalityI subsetI) fix a assume"a \ range (w\<^sub>1 \ w\<^sub>2)" thenobtain i where 1: "a = (w\<^sub>1 \ w\<^sub>2) i" by auto thenshow"a \ set w\<^sub>1 \ range w\<^sub>2" unfolding 1 by (cases "i < length w\<^sub>1") simp_all next fix a assume a: "a \ set w\<^sub>1 \ range w\<^sub>2" thenshow"a \ range (w\<^sub>1 \ w\<^sub>2)" proof assume"a \ set w\<^sub>1" thenobtain i where 1: "i < length w\<^sub>1" "a = w\<^sub>1 ! i" using in_set_conv_nth by metis show ?thesis proof show"a = (w\<^sub>1 \ w\<^sub>2) i" using 1 by auto show"i \ UNIV" by rule qed next assume"a \ range w\<^sub>2" thenobtain i where 1: "a = w\<^sub>2 i" by auto show ?thesis proof show"a = (w\<^sub>1 \ w\<^sub>2) (length w\<^sub>1 + i)" using 1 by simp show"length w\<^sub>1 + i \ UNIV" by rule qed qed qed
lemma iter_unroll: "0 < length w \ w\<^sup>\ = w \ w\<^sup>\" by (simp add: fun_eq_iff mod_if)
subsection \<open>Subsequence, Prefix, and Suffix\<close>
definition suffix :: "[nat, 'a word] \ 'a word" where"suffix k x \ \n. x (k+n)"
definition subsequence :: "'a word \ nat \ nat \ 'a list"
(\<open>(\<open>open_block notation=\<open>mixfix subsequence\<close>\<close>_ [_ \<rightarrow> _])\<close> 900) where"subsequence w i j \ map w [i..
abbreviation prefix :: "nat \ 'a word \ 'a list" where"prefix n w \ subsequence w 0 n"
lemma suffix_nth [simp]: "(suffix k x) n = x (k+n)" by (simp add: suffix_def)
lemma suffix_0 [simp]: "suffix 0 x = x" by (simp add: suffix_def)
lemma suffix_suffix [simp]: "suffix m (suffix k x) = suffix (k+m) x" by (rule ext) (simp add: suffix_def add.assoc)
lemma subsequence_append: "prefix (i + j) w = prefix i w @ (w [i \ i + j])" unfolding map_append[symmetric] upt_add_eq_append[OF le0] subsequence_def ..
lemma subsequence_drop[simp]: "drop i (w [j \ k]) = w [j + i \ k]" by (simp add: subsequence_def drop_map)
lemma subsequence_prefix_suffix: "prefix (j - i) (suffix i w) = w [i \ j]" proof (cases "i \ j") case True have"w [i \ j] = map w (map (\n. n + i) [0.. unfolding map_add_upt subsequence_def using le_add_diff_inverse2[OF True] by force also have"\ = map (\n. w (n + i)) [0.. unfolding map_map comp_def by blast finally show ?thesis unfolding subsequence_def suffix_def add.commute[of i] by simp next case False thenshow ?thesis by (simp add: subsequence_def) qed
lemma prefix_suffix: "x = prefix n x \ (suffix n x)" by (rule ext) (simp add: subsequence_def conc_def)
declare prefix_suffix[symmetric, simp]
lemma word_split: obtains v\<^sub>1 v\<^sub>2 where "v = v\<^sub>1 \<frown> v\<^sub>2" "length v\<^sub>1 = k" proof show"v = prefix k v \ suffix k v" by (rule prefix_suffix) show"length (prefix k v) = k" by simp qed
lemma set_subsequence[simp]: "set (w[i\j]) = w`{i.. unfolding subsequence_def by auto
lemma subsequence_take[simp]: "take i (w [j \ k]) = w [j \ min (j + i) k]" by (simp add: subsequence_def take_map min_def)
lemma subsequence_shift[simp]: "(suffix i w) [j \ k] = w [i + j \ i + k]" by (metis add_diff_cancel_left subsequence_prefix_suffix suffix_suffix)
lemma suffix_subseq_join[simp]: "i \ j \ v [i \ j] \ suffix j v = suffix i v" by (metis (no_types, lifting) Nat.add_0_right le_add_diff_inverse prefix_suffix
subsequence_shift suffix_suffix)
lemma prefix_conc_fst[simp]: assumes"j \ length w" shows"prefix j (w \ w') = take j w" proof - have"\i < j. (prefix j (w \ w')) ! i = (take j w) ! i" using assms by (simp add: conc_fst subsequence_def) thus ?thesis by (simp add: assms list_eq_iff_nth_eq min.absorb2) qed
lemma prefix_conc_snd[simp]: assumes"n \ length u" shows"prefix n (u \ v) = u @ prefix (n - length u) v" proof (intro nth_equalityI) show"length (prefix n (u \ v)) = length (u @ prefix (n - length u) v)" using assms by simp fix i assume"i < length (prefix n (u \ v))" thenshow"prefix n (u \ v) ! i = (u @ prefix (n - length u) v) ! i" by (cases "i < length u") (auto simp: nth_append) qed
lemma prefix_conc_length[simp]: "prefix (length w) (w \ w') = w" by simp
lemma suffix_conc_fst[simp]: assumes"n \ length u" shows"suffix n (u \ v) = drop n u \ v" proof show"suffix n (u \ v) i = (drop n u \ v) i" for i using assms by (cases "n + i < length u") (auto simp: algebra_simps) qed
lemma suffix_conc_snd[simp]: assumes"n \ length u" shows"suffix n (u \ v) = suffix (n - length u) v" proof show"suffix n (u \ v) i = suffix (n - length u) v i" for i using assms by simp qed
lemma suffix_conc_length[simp]: "suffix (length w) (w \ w') = w'" unfolding conc_def by force
lemma concat_eq[iff]: assumes"length v\<^sub>1 = length v\<^sub>2" shows"v\<^sub>1 \ u\<^sub>1 = v\<^sub>2 \ u\<^sub>2 \ v\<^sub>1 = v\<^sub>2 \ u\<^sub>1 = u\<^sub>2"
(is"?lhs \ ?rhs") proof assume ?lhs thenhave 1: "(v\<^sub>1 \ u\<^sub>1) i = (v\<^sub>2 \ u\<^sub>2) i" for i by auto show ?rhs proof (intro conjI ext nth_equalityI) show"length v\<^sub>1 = length v\<^sub>2" by (rule assms(1)) next fix i assume 2: "i < length v\<^sub>1" have 3: "i < length v\<^sub>2" using assms(1) 2 by simp show"v\<^sub>1 ! i = v\<^sub>2 ! i" using 1[of i] 2 3 by simp next show"u\<^sub>1 i = u\<^sub>2 i" for i using 1[of "length v\<^sub>1 + i"] assms(1) by simp qed next assume ?rhs thenshow ?lhs by simp qed
lemma same_concat_eq[iff]: "u \ v = u \ w \ v = w" by simp
lemma comp_concat[simp]: "f \ u \ v = map f u \ (f \ v)" proof fix i show"(f \ u \ v) i = (map f u \ (f \ v)) i" by (cases "i < length u") simp_all qed
subsection \<open>Prepending\<close>
primrec build :: "'a \ 'a word \ 'a word" (infixr \##\ 65) where"(a ## w) 0 = a" | "(a ## w) (Suc i) = w i"
lemma build_eq[iff]: "a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2 \ a\<^sub>1 = a\<^sub>2 \ w\<^sub>1 = w\<^sub>2" proof assume 1: "a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2" have 2: "(a\<^sub>1 ## w\<^sub>1) i = (a\<^sub>2 ## w\<^sub>2) i" for i using 1 by auto show"a\<^sub>1 = a\<^sub>2 \ w\<^sub>1 = w\<^sub>2" proof (intro conjI ext) show"a\<^sub>1 = a\<^sub>2" using 2[of "0"] by simp show"w\<^sub>1 i = w\<^sub>2 i" for i using 2[of "Suc i"] by simp qed next assume 1: "a\<^sub>1 = a\<^sub>2 \ w\<^sub>1 = w\<^sub>2" show"a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2" using 1 by simp qed
lemma build_cons[simp]: "(a # u) \ v = a ## u \ v" proof fix i show"((a # u) \ v) i = (a ## u \ v) i" proof (cases i) case 0 show ?thesis unfolding 0 by simp next case (Suc j) show ?thesis unfolding Suc by (cases "j < length u", simp+) qed qed
lemma build_append[simp]: "(w @ a # u) \ v = w \ a ## u \ v" unfolding conc_conc[symmetric] by simp
lemma build_first[simp]: "w 0 ## suffix (Suc 0) w = w" proof show"(w 0 ## suffix (Suc 0) w) i = w i"for i by (cases i) simp_all qed
lemma build_split[intro]: "w = w 0 ## suffix 1 w" by simp
lemma build_range[simp]: "range (a ## w) = insert a (range w)" proof safe show"(a ## w) i \ range w \ (a ## w) i = a" for i by (cases i) auto show"a \ range (a ## w)" proof (rule range_eqI) show"a = (a ## w) 0"by simp qed show"w i \ range (a ## w)" for i proof (rule range_eqI) show"w i = (a ## w) (Suc i)"by simp qed qed
lemma suffix_singleton_suffix[simp]: "w i ## suffix (Suc i) w = suffix i w" using suffix_subseq_join[of i "Suc i" w] by simp
text\<open>Find the first occurrence of a letter from a given set\<close> lemma word_first_split_set: assumes"A \ range w \ {}" obtains u a v where"w = u \ [a] \ v" "A \ set u = {}" "a \ A" proof -
define i where"i = (LEAST i. w i \ A)" show ?thesis proof show"w = prefix i w \ [w i] \ suffix (Suc i) w" by simp show"A \ set (prefix i w) = {}" apply safe
subgoal premises prems for a proof - from prems obtain k where 3: "k < i""w k = a" by auto have 4: "w k \ A" using not_less_Least 3(1) unfolding i_def . show ?thesis using prems(1) 3(2) 4 by auto qed done show"w i \ A" using LeastI assms(1) unfolding i_def by fast qed qed
subsection \<open>The limit set of an $\omega$-word\<close>
text\<open>
The limit set (also called infinity set) of an $\omega$-word is the set of letters that appear infinitely often in the word.
This set plays an important role in defining acceptance conditions
of $\omega$-automata. \<close>
definition limit :: "'a word \ 'a set" where"limit x \ {a . \\<^sub>\n . x n = a}"
lemma limit_iff_frequent: "a \ limit x \ (\\<^sub>\n . x n = a)" by (simp add: limit_def)
text\<open>
The following is a different way to define the limit, using the reverse image, making the laws about reverse
image applicable to the limit set.
(Might want to change the definition above?) \<close>
lemma two_in_limit_iff: "({a, b} \ limit x) =
((\<exists>n. x n =a ) \<and> (\<forall>n. x n = a \<longrightarrow> (\<exists>m>n. x m = b)) \<and> (\<forall>m. x m = b \<longrightarrow> (\<exists>n>m. x n = a)))"
(is"?lhs = (?r1 \ ?r2 \ ?r3)") proof assume lhs: "?lhs" hence 1: "?r1"by (auto simp: limit_def elim: INFM_EX) from lhs have"\n. \m>n. x m = b" by (auto simp: limit_def INFM_nat) hence 2: "?r2"by simp from lhs have"\m. \n>m. x n = a" by (auto simp: limit_def INFM_nat) hence 3: "?r3"by simp from 1 2 3 show"?r1 \ ?r2 \ ?r3" by simp next assume"?r1 \ ?r2 \ ?r3" hence 1: "?r1"and 2: "?r2"and 3: "?r3"by simp+ have infa: "\m. \n\m. x n = a" proof fix m show"\n\m. x n = a" (is "?A m") proof (induct m) from 1 show"?A 0"by simp next fix m assume ih: "?A m" thenobtain n where n: "n \ m" "x n = a" by auto with 2 obtain k where k: "k>n""x k = b"by auto with 3 obtain l where l: "l>k""x l = a"by auto from n k l have"l \ Suc m" by auto with l show"?A (Suc m)"by auto qed qed hence infa': "\\<^sub>\n. x n = a" by (simp add: INFM_nat_le) have"\n. \m>n. x m = b" proof fix n from infa obtain k where k1: "k\n" and k2: "x k = a" by auto from 2 k2 obtain l where l1: "l>k"and l2: "x l = b"by auto from k1 l1 have"l > n"by auto with l2 show"\m>n. x m = b" by auto qed hence"\\<^sub>\m. x m = b" by (simp add: INFM_nat) with infa' show "?lhs" by (auto simp: limit_def) qed
text\<open> For $\omega$-words over a finite alphabet, the limit set is
non-empty. Moreover, from some position onward, any such word contains only letters from its limit set. \<close>
lemma limit_nonempty: assumes fin: "finite (range x)" shows"\a. a \ limit x" proof - from fin obtain a where"a \ range x \ infinite (x -` {a})" by (rule inf_img_fin_domE) auto hence"a \ limit x" by (auto simp add: limit_vimage) thus ?thesis .. qed
lemmas limit_nonemptyE = limit_nonempty[THEN exE]
lemma limit_inter_INF: assumes hyp: "limit w \ S \ {}" shows"\\<^sub>\ n. w n \ S" proof - from hyp obtain x where"\\<^sub>\ n. w n = x" and "x \ S" by (auto simp add: limit_def) thus ?thesis by (auto elim: INFM_mono) qed
text\<open>
The reverse implication is true only if $S$ is finite. \<close>
lemma INF_limit_inter: assumes hyp: "\\<^sub>\ n. w n \ S" and fin: "finite (S \ range w)" shows"\a. a \ limit w \ S" proof (rule ccontr) assume contra: "\(\a. a \ limit w \ S)" hence"\a\S. finite {n. w n = a}" by (auto simp add: limit_def Inf_many_def) with fin have"finite (UN a:S \ range w. {n. w n = a})" by auto moreover have"(UN a:S \ range w. {n. w n = a}) = {n. w n \ S}" by auto moreover note hyp ultimatelyshow"False" by (simp add: Inf_many_def) qed
lemma fin_ex_inf_eq_limit: "finite A \ (\\<^sub>\i. w i \ A) \ limit w \ A \ {}" by (metis INF_limit_inter equals0D finite_Int limit_inter_INF)
lemma limit_in_range_suffix: "limit x \ range (suffix k x)" proof fix a assume"a \ limit x" thenobtain l where
kl: "k < l"and xl: "x l = a" by (auto simp add: limit_def INFM_nat) from kl obtain m where"l = k+m" by (auto simp add: less_iff_Suc_add) with xl show"a \ range (suffix k x)" by auto qed
lemma limit_in_range: "limit r \ range r" using limit_in_range_suffix[of r 0] by simp
lemma limit_subset: "limit f \ f ` {n..}" using limit_in_range_suffix[of f n] unfolding suffix_def by auto
theorem limit_is_suffix: assumes fin: "finite (range x)" shows"\k. limit x = range (suffix k x)" proof - have"\k. range (suffix k x) \ limit x" proof - \<comment> \<open>The set of letters that are not in the limit is certainly finite.\<close> from fin have"finite (range x - limit x)" by simp \<comment> \<open>Moreover, any such letter occurs only finitely often\<close> moreover have"\a \ range x - limit x. finite (x -` {a})" by (auto simp add: limit_vimage) \<comment> \<open>Thus, there are only finitely many occurrences of such letters.\<close> ultimatelyhave"finite (UN a : range x - limit x. x -` {a})" by (blast intro: finite_UN_I) \<comment> \<open>Therefore these occurrences are within some initial interval.\<close> thenobtain k where"(UN a : range x - limit x. x -` {a}) \ {.. by (blast dest: finite_nat_bounded) \<comment> \<open>This is just the bound we are looking for.\<close> hence"\m. k \ m \ x m \ limit x" by (auto simp add: limit_vimage) hence"range (suffix k x) \ limit x" by auto thus ?thesis .. qed thenobtain k where"range (suffix k x) \ limit x" .. with limit_in_range_suffix have"limit x = range (suffix k x)" by (rule subset_antisym) thus ?thesis .. qed
text\<open>
The limit set enjoys some simple algebraic laws with respect to concatenation, suffixes, iteration, and renaming. \<close>
theorem limit_conc [simp]: "limit (w \ x) = limit x" proof (auto) fix a assume a: "a \ limit (w \ x)" have"\m. \n. m x n = a" proof fix m from a obtain n where"m + length w < n \ (w \ x) n = a" by (auto simp add: limit_def Inf_many_def infinite_nat_iff_unbounded) hence"m < n - length w \ x (n - length w) = a" by (auto simp add: conc_def) thus"\n. m x n = a" .. qed hence"infinite {n . x n = a}" by (simp add: infinite_nat_iff_unbounded) thus"a \ limit x" by (simp add: limit_def Inf_many_def) next fix a assume a: "a \ limit x" have"\m. length w < m \ (\n. m (w \ x) n = a)" proof (clarify) fix m assume m: "length w < m" with a obtain n where"m - length w < n \ x n = a" by (auto simp add: limit_def Inf_many_def infinite_nat_iff_unbounded) with m have"m < n + length w \ (w \ x) (n + length w) = a" by (simp add: conc_def, arith) thus"\n. m (w \ x) n = a" .. qed hence"infinite {n . (w \ x) n = a}" by (simp add: unbounded_k_infinite) thus"a \ limit (w \ x)" by (simp add: limit_def Inf_many_def) qed
theorem limit_suffix [simp]: "limit (suffix n x) = limit x" proof - have"x = (prefix n x) \ (suffix n x)" by (simp add: prefix_suffix) hence"limit x = limit (prefix n x \ suffix n x)" by simp alsohave"\ = limit (suffix n x)" by (rule limit_conc) finallyshow ?thesis by (rule sym) qed
theorem limit_iter [simp]: assumes nempty: "0 < length w" shows"limit w\<^sup>\ = set w" proof have"limit w\<^sup>\ \ range w\<^sup>\" by (auto simp add: limit_def dest: INFM_EX) alsofrom nempty have"\ \ set w" by auto finallyshow"limit w\<^sup>\ \ set w" . next
{ fix a assume a: "a \ set w" thenobtain k where k: "k < length w \ w!k = a" by (auto simp add: set_conv_nth) \<comment> \<open>the following bound is terrible, but it simplifies the proof\<close> from nempty k have"\m. w\<^sup>\ ((Suc m)*(length w) + k) = a" by (simp add: mod_add_left_eq [symmetric]) moreover \<comment> \<open>why is the following so hard to prove??\<close> have"\m. m < (Suc m)*(length w) + k" proof fix m from nempty have"1 \ length w" by arith hence"m*1 \ m*length w" by simp hence"m \ m*length w" by simp with nempty have"m < length w + (m*length w) + k"by arith thus"m < (Suc m)*(length w) + k"by simp qed moreovernote nempty ultimatelyhave"a \ limit w\<^sup>\" by (auto simp add: limit_iff_frequent INFM_nat)
} thenshow"set w \ limit w\<^sup>\" by auto qed
lemma limit_o [simp]: assumes a: "a \ limit w" shows"f a \ limit (f \ w)" proof - from a have"\\<^sub>\n. w n = a" by (simp add: limit_iff_frequent) hence"\\<^sub>\n. f (w n) = f a" by (rule INFM_mono, simp) thus"f a \ limit (f \ w)" by (simp add: limit_iff_frequent) qed
text\<open>
The converse relation is not true in general: $f(a)$ can be in the
limit of $f \circ w$ even though $a$ is not in the limit of $w$.
However, \<open>limit\<close> commutes with renaming if the function is
injective. More generally, if $f(a)$ is the image of only finitely
many elements, some of these must be in the limit of $w$. \<close>
lemma limit_o_inv: assumes fin: "finite (f -` {x})" and x: "x \ limit (f \ w)" shows"\a \ (f -` {x}). a \ limit w" proof (rule ccontr) assume contra: "\ ?thesis" \<comment> \<open>hence, every element in the pre-image occurs only finitely often\<close> thenhave"\a \ (f -` {x}). finite {n. w n = a}" by (simp add: limit_def Inf_many_def) \<comment> \<open>so there are only finitely many occurrences of any such element\<close> with fin have"finite (\ a \ (f -` {x}). {n. w n = a})" by auto \<comment> \<open>these are precisely those positions where $x$ occurs in $f \circ w$\<close> moreover have"(\ a \ (f -` {x}). {n. w n = a}) = {n. f(w n) = x}" by auto ultimately \<comment> \<open>so $x$ can occur only finitely often in the translated word\<close> have"finite {n. f(w n) = x}" by simp \<comment> \<open>\ldots\ which yields a contradiction\<close> with x show"False" by (simp add: limit_def Inf_many_def) qed
theorem limit_inj [simp]: assumes inj: "inj f" shows"limit (f \ w) = f ` (limit w)" proof show"f ` limit w \ limit (f \ w)" by auto show"limit (f \ w) \ f ` limit w" proof fix x assume x: "x \ limit (f \ w)" from inj have"finite (f -` {x})" by (blast intro: finite_vimageI) with x obtain a where a: "a \ (f -` {x}) \ a \ limit w" by (blast dest: limit_o_inv) thus"x \ f ` (limit w)" by auto qed qed
lemma limit_inter_empty: assumes fin: "finite (range w)" assumes hyp: "limit w \ S = {}" shows"\\<^sub>\n. w n \ S" proof - from fin obtain k where k_def: "limit w = range (suffix k w)" using limit_is_suffix by blast have"w (k + k') \ S" for k' using hyp unfolding k_def suffix_def image_def by blast thus ?thesis unfolding MOST_nat_le using le_Suc_ex by blast qed
text\<open>If the limit is the suffix of the sequence's range,
we may increase the suffix index arbitrarily\<close> lemma limit_range_suffix_incr: assumes"limit r = range (suffix i r)" assumes"j\i" shows"limit r = range (suffix j r)"
(is"?lhs = ?rhs") proof - have"?lhs = range (suffix i r)" using assms by simp moreover have"\ \ ?rhs" using \j\i\ by (metis (mono_tags, lifting) assms(2)
image_subsetI le_Suc_ex range_eqI suffix_def suffix_suffix) moreover have"\ \ ?lhs" by (rule limit_in_range_suffix) ultimately show"?lhs = ?rhs" by (metis antisym_conv limit_in_range_suffix) qed
text\<open>For two finite sequences, we can find a common suffix index such
that the limits can be represented as these suffixes' ranges.\ lemma common_range_limit: assumes"finite (range x)" and"finite (range y)" obtains i where"limit x = range (suffix i x)" and"limit y = range (suffix i y)" proof - obtain i j where 1: "limit x = range (suffix i x)" and 2: "limit y = range (suffix j y)" using assms limit_is_suffix by metis have"limit x = range (suffix (max i j) x)" and"limit y = range (suffix (max i j) y)" using limit_range_suffix_incr[OF 1] limit_range_suffix_incr[OF 2] by auto thus ?thesis using that by metis qed
subsection \<open>Index sequences and piecewise definitions\<close>
text\<open>
A word can be defined piecewise: given a sequence of words $w_0, w_1, \ldots$ and a strictly increasing sequence of integers $i_0, i_1, \ldots$ where $i_0=0$,
a single word is obtained by concatenating subwords of the $w_n$ as given by
the integers: the resulting word is \[
(w_0)_{i_0} \ldots (w_0)_{i_1-1} (w_1)_{i_1} \ldots (w_1)_{i_2-1} \ldots \]
We prepare the field by proving some trivial facts about such sequences of
indexes. \<close>
lemma idx_sequence_less: assumes iseq: "idx_sequence idx" shows"idx n < idx (Suc(n+k))" proof (induct k) from iseq show"idx n < idx (Suc (n + 0))" by (simp add: idx_sequence_def) next fix k assume ih: "idx n < idx (Suc(n+k))" from iseq have"idx (Suc(n+k)) < idx (Suc(n + Suc k))" by (simp add: idx_sequence_def) with ih show"idx n < idx (Suc(n + Suc k))" by (rule less_trans) qed
lemma idx_sequence_inj: assumes iseq: "idx_sequence idx" and eq: "idx m = idx n" shows"m = n" proof (cases m n rule: linorder_cases) case greater thenobtain k where"m = Suc(n+k)" by (auto simp add: less_iff_Suc_add) with iseq have"idx n < idx m" by (simp add: idx_sequence_less) with eq show ?thesis by simp next case less thenobtain k where"n = Suc(m+k)" by (auto simp add: less_iff_Suc_add) with iseq have"idx m < idx n" by (simp add: idx_sequence_less) with eq show ?thesis by simp qed
lemma idx_sequence_mono: assumes iseq: "idx_sequence idx" and m: "m \ n" shows"idx m \ idx n" proof (cases "m=n") case True thus ?thesis by simp next case False with m have"m < n"by simp thenobtain k where"n = Suc(m+k)" by (auto simp add: less_iff_Suc_add) with iseq have"idx m < idx n" by (simp add: idx_sequence_less) thus ?thesis by simp qed
text\<open>
Given an index sequence, every natural number is contained in the
interval defined by two adjacent indexes, andin fact this interval is determined uniquely. \<close>
lemma idx_sequence_idx: assumes"idx_sequence idx" shows"idx k \ {idx k ..< idx (Suc k)}" using assms by (auto simp add: idx_sequence_def)
lemma idx_sequence_interval: assumes iseq: "idx_sequence idx" shows"\k. n \ {idx k ..< idx (Suc k) }"
(is"?P n"is"\k. ?in n k") proof (induct n) from iseq have"0 = idx 0" by (simp add: idx_sequence_def) moreover from iseq have"idx 0 \ {idx 0 ..< idx (Suc 0) }" by (rule idx_sequence_idx) ultimately show"?P 0"by auto next fix n assume"?P n" thenobtain k where k: "?in n k" .. show"?P (Suc n)" proof (cases "Suc n < idx (Suc k)") case True with k have"?in (Suc n) k" by simp thus ?thesis .. next case False with k have"Suc n = idx (Suc k)" by auto with iseq have"?in (Suc n) (Suc k)" by (simp add: idx_sequence_def) thus ?thesis .. qed qed
lemma idx_sequence_interval_unique: assumes iseq: "idx_sequence idx" and k: "n \ {idx k ..< idx (Suc k)}" and m: "n \ {idx m ..< idx (Suc m)}" shows"k = m" proof (cases k m rule: linorder_cases) case less hence"Suc k \ m" by simp with iseq have"idx (Suc k) \ idx m" by (rule idx_sequence_mono) with m have"idx (Suc k) \ n" by auto with k have"False" by simp thus ?thesis .. next case greater hence"Suc m \ k" by simp with iseq have"idx (Suc m) \ idx k" by (rule idx_sequence_mono) with k have"idx (Suc m) \ n" by auto with m have"False" by simp thus ?thesis .. qed
lemma idx_sequence_unique_interval: assumes iseq: "idx_sequence idx" shows"\! k. n \ {idx k ..< idx (Suc k) }" proof (rule ex_ex1I) from iseq show"\k. n \ {idx k ..< idx (Suc k)}" by (rule idx_sequence_interval) next fix k y assume"n \ {idx k.. {idx y.. with iseq show"k = y"by (auto elim: idx_sequence_interval_unique) qed
text\<open>
Now we can define the piecewise construction of a word using
an index sequence. \<close>
definition merge :: "'a word word \ nat word \ 'a word" where"merge ws idx \ \n. let i = THE i. n \ {idx i ..< idx (Suc i) } in ws i n"
lemma merge: assumes idx: "idx_sequence idx" and n: "n \ {idx i ..< idx (Suc i)}" shows"merge ws idx n = ws i n" proof - from n have"(THE k. n \ {idx k ..< idx (Suc k) }) = i" by (rule the_equality[OF _ sym[OF idx_sequence_interval_unique[OF idx n]]]) simp thus ?thesis by (simp add: merge_def Let_def) qed
lemma merge0: assumes idx: "idx_sequence idx" shows"merge ws idx 0 = ws 0 0" proof (rule merge[OF idx]) from idx have"idx 0 < idx (Suc 0)" unfolding idx_sequence_def by blast with idx show"0 \ {idx 0 ..< idx (Suc 0)}" by (simp add: idx_sequence_def) qed
lemma merge_Suc: assumes idx: "idx_sequence idx" and n: "n \ {idx i ..< idx (Suc i)}" shows"merge ws idx (Suc n) = (if Suc n = idx (Suc i) then ws (Suc i) else ws i) (Suc n)" proof auto assume eq: "Suc n = idx (Suc i)" from idx have"idx (Suc i) < idx (Suc(Suc i))" unfolding idx_sequence_def by blast with eq idx show"merge ws idx (idx (Suc i)) = ws (Suc i) (idx (Suc i))" by (simp add: merge) next assume neq: "Suc n \ idx (Suc i)" with n have"Suc n \ {idx i ..< idx (Suc i) }" by auto with idx show"merge ws idx (Suc n) = ws i (Suc n)" by (rule merge) qed
end
¤ Dauer der Verarbeitung: 0.5 Sekunden
(vorverarbeitet)
¤
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.