| author | wenzelm | 
| Tue, 20 May 2025 17:02:10 +0200 | |
| changeset 82637 | c6c20afb29c2 | 
| parent 81142 | 6ad2c917dd2e | 
| permissions | -rw-r--r-- | 
| 61189 | 1 | (* | 
| 2 | Author: Stefan Merz | |
| 3 | Author: Salomon Sickert | |
| 4 | Author: Julian Brunner | |
| 5 | Author: Peter Lammich | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 6 | *) | 
| 61189 | 7 | |
| 8 | section \<open>$\omega$-words\<close> | |
| 9 | ||
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 10 | theory Omega_Words_Fun | 
| 61189 | 11 | |
| 12 | imports Infinite_Set | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 13 | begin | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 14 | |
| 61189 | 15 | text \<open>Note: This theory is based on Stefan Merz's work.\<close> | 
| 16 | ||
| 17 | text \<open> | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 18 | Automata recognize languages, which are sets of words. For the | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 19 | theory of $\omega$-automata, we are mostly interested in | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 20 | $\omega$-words, but it is sometimes useful to reason about | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 21 | finite words, too. We are modeling finite words as lists; this | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 22 | lets us benefit from the existing library. Other formalizations | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 23 | could be investigated, such as representing words as functions | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 24 | whose domains are initial intervals of the natural numbers. | 
| 61189 | 25 | \<close> | 
| 26 | ||
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 27 | |
| 61189 | 28 | subsection \<open>Type declaration and elementary operations\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 29 | |
| 61189 | 30 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 31 | We represent $\omega$-words as functions from the natural numbers | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 32 | to the alphabet type. Other possible formalizations include | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 33 | a coinductive definition or a uniform encoding of finite and | 
| 76063 | 34 | infinite words, as studied by Müller et al. | 
| 61189 | 35 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 36 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 37 | type_synonym | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 38 | 'a word = "nat \<Rightarrow> 'a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 39 | |
| 61189 | 40 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 41 | We can prefix a finite word to an $\omega$-word, and a way | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 42 | to obtain an $\omega$-word from a finite, non-empty word is by | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 43 | $\omega$-iteration. | 
| 61189 | 44 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 45 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 46 | definition | 
| 69597 | 47 | conc :: "['a list, 'a word] \<Rightarrow> 'a word" (infixr \<open>\<frown>\<close> 65) | 
| 61384 | 48 | where "w \<frown> x == \<lambda>n. if n < length w then w!n else x (n - length w)" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 49 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 50 | definition | 
| 81142 | 51 | iter :: "'a list \<Rightarrow> 'a word" (\<open>(\<open>notation=\<open>postfix \<omega>\<close>\<close>_\<^sup>\<omega>)\<close> [1000]) | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 52 | where "iter w == if w = [] then undefined else (\<lambda>n. w!(n mod (length w)))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 53 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 54 | lemma conc_empty[simp]: "[] \<frown> w = w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 55 | unfolding conc_def by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 56 | |
| 61189 | 57 | lemma conc_fst[simp]: "n < length w \<Longrightarrow> (w \<frown> x) n = w!n" | 
| 58 | by (simp add: conc_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 59 | |
| 61189 | 60 | lemma conc_snd[simp]: "\<not>(n < length w) \<Longrightarrow> (w \<frown> x) n = x (n - length w)" | 
| 61 | by (simp add: conc_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 62 | |
| 61189 | 63 | lemma iter_nth [simp]: "0 < length w \<Longrightarrow> w\<^sup>\<omega> n = w!(n mod (length w))" | 
| 64 | by (simp add: iter_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 65 | |
| 61189 | 66 | lemma conc_conc[simp]: "u \<frown> v \<frown> w = (u @ v) \<frown> w" (is "?lhs = ?rhs") | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 67 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 68 | fix n | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 69 | have u: "n < length u \<Longrightarrow> ?lhs n = ?rhs n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 70 | by (simp add: conc_def nth_append) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 71 | have v: "\<lbrakk> \<not>(n < length u); n < length u + length v \<rbrakk> \<Longrightarrow> ?lhs n = ?rhs n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 72 | by (simp add: conc_def nth_append, arith) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 73 | have w: "\<not>(n < length u + length v) \<Longrightarrow> ?lhs n = ?rhs n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 74 | by (simp add: conc_def nth_append, arith) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 75 | from u v w show "?lhs n = ?rhs n" by blast | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 76 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 77 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 78 | lemma range_conc[simp]: "range (w\<^sub>1 \<frown> w\<^sub>2) = set w\<^sub>1 \<union> range w\<^sub>2" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 79 | proof (intro equalityI subsetI) | 
| 61189 | 80 | fix a | 
| 81 | assume "a \<in> range (w\<^sub>1 \<frown> w\<^sub>2)" | |
| 82 | then obtain i where 1: "a = (w\<^sub>1 \<frown> w\<^sub>2) i" by auto | |
| 83 | then show "a \<in> set w\<^sub>1 \<union> range w\<^sub>2" | |
| 84 | unfolding 1 by (cases "i < length w\<^sub>1") simp_all | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 85 | next | 
| 61189 | 86 | fix a | 
| 87 | assume a: "a \<in> set w\<^sub>1 \<union> range w\<^sub>2" | |
| 88 | then show "a \<in> range (w\<^sub>1 \<frown> w\<^sub>2)" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 89 | proof | 
| 61189 | 90 | assume "a \<in> set w\<^sub>1" | 
| 91 | then obtain i where 1: "i < length w\<^sub>1" "a = w\<^sub>1 ! i" | |
| 92 | using in_set_conv_nth by metis | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 93 | show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 94 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 95 | show "a = (w\<^sub>1 \<frown> w\<^sub>2) i" using 1 by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 96 | show "i \<in> UNIV" by rule | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 97 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 98 | next | 
| 61189 | 99 | assume "a \<in> range w\<^sub>2" | 
| 100 | then obtain i where 1: "a = w\<^sub>2 i" by auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 101 | show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 102 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 103 | show "a = (w\<^sub>1 \<frown> w\<^sub>2) (length w\<^sub>1 + i)" using 1 by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 104 | show "length w\<^sub>1 + i \<in> UNIV" by rule | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 105 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 106 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 107 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 108 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 109 | |
| 61189 | 110 | lemma iter_unroll: "0 < length w \<Longrightarrow> w\<^sup>\<omega> = w \<frown> w\<^sup>\<omega>" | 
| 76231 | 111 | by (simp add: fun_eq_iff mod_if) | 
| 61189 | 112 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 113 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 114 | subsection \<open>Subsequence, Prefix, and Suffix\<close> | 
| 61189 | 115 | |
| 116 | definition suffix :: "[nat, 'a word] \<Rightarrow> 'a word" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 117 | where "suffix k x \<equiv> \<lambda>n. x (k+n)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 118 | |
| 81142 | 119 | definition subsequence :: "'a word \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> 'a list" | 
| 120 | (\<open>(\<open>open_block notation=\<open>mixfix subsequence\<close>\<close>_ [_ \<rightarrow> _])\<close> 900) | |
| 61189 | 121 | where "subsequence w i j \<equiv> map w [i..<j]" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 122 | |
| 61189 | 123 | abbreviation prefix :: "nat \<Rightarrow> 'a word \<Rightarrow> 'a list" | 
| 124 | where "prefix n w \<equiv> subsequence w 0 n" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 125 | |
| 61189 | 126 | lemma suffix_nth [simp]: "(suffix k x) n = x (k+n)" | 
| 127 | by (simp add: suffix_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 128 | |
| 61189 | 129 | lemma suffix_0 [simp]: "suffix 0 x = x" | 
| 130 | by (simp add: suffix_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 131 | |
| 61189 | 132 | lemma suffix_suffix [simp]: "suffix m (suffix k x) = suffix (k+m) x" | 
| 133 | by (rule ext) (simp add: suffix_def add.assoc) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 134 | |
| 61189 | 135 | lemma subsequence_append: "prefix (i + j) w = prefix i w @ (w [i \<rightarrow> i + j])" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 136 | unfolding map_append[symmetric] upt_add_eq_append[OF le0] subsequence_def .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 137 | |
| 61189 | 138 | lemma subsequence_drop[simp]: "drop i (w [j \<rightarrow> k]) = w [j + i \<rightarrow> k]" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 139 | by (simp add: subsequence_def drop_map) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 140 | |
| 61189 | 141 | lemma subsequence_empty[simp]: "w [i \<rightarrow> j] = [] \<longleftrightarrow> j \<le> i" | 
| 142 | by (auto simp add: subsequence_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 143 | |
| 61189 | 144 | lemma subsequence_length[simp]: "length (subsequence w i j) = j - i" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 145 | by (simp add: subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 146 | |
| 61189 | 147 | lemma subsequence_nth[simp]: "k < j - i \<Longrightarrow> (w [i \<rightarrow> j]) ! k = w (i + k)" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 148 | unfolding subsequence_def | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 149 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 150 | |
| 61189 | 151 | lemma subseq_to_zero[simp]: "w[i\<rightarrow>0] = []" | 
| 152 | by simp | |
| 153 | ||
| 154 | lemma subseq_to_smaller[simp]: "i\<ge>j \<Longrightarrow> w[i\<rightarrow>j] = []" | |
| 155 | by simp | |
| 156 | ||
| 157 | lemma subseq_to_Suc[simp]: "i\<le>j \<Longrightarrow> w [i \<rightarrow> Suc j] = w [ i \<rightarrow> j ] @ [w j]" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 158 | by (auto simp: subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 159 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 160 | lemma subsequence_singleton[simp]: "w [i \<rightarrow> Suc i] = [w i]" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 161 | by (auto simp: subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 162 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 163 | |
| 61189 | 164 | lemma subsequence_prefix_suffix: "prefix (j - i) (suffix i w) = w [i \<rightarrow> j]" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 165 | proof (cases "i \<le> j") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 166 | case True | 
| 61189 | 167 | have "w [i \<rightarrow> j] = map w (map (\<lambda>n. n + i) [0..<j - i])" | 
| 168 | unfolding map_add_upt subsequence_def | |
| 169 | using le_add_diff_inverse2[OF True] by force | |
| 170 | also | |
| 171 | have "\<dots> = map (\<lambda>n. w (n + i)) [0..<j - i]" | |
| 172 | unfolding map_map comp_def by blast | |
| 173 | finally | |
| 174 | show ?thesis | |
| 175 | unfolding subsequence_def suffix_def add.commute[of i] by simp | |
| 176 | next | |
| 177 | case False | |
| 178 | then show ?thesis | |
| 179 | by (simp add: subsequence_def) | |
| 180 | qed | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 181 | |
| 61189 | 182 | lemma prefix_suffix: "x = prefix n x \<frown> (suffix n x)" | 
| 183 | by (rule ext) (simp add: subsequence_def conc_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 184 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 185 | declare prefix_suffix[symmetric, simp] | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 186 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 187 | |
| 61189 | 188 | lemma word_split: obtains v\<^sub>1 v\<^sub>2 where "v = v\<^sub>1 \<frown> v\<^sub>2" "length v\<^sub>1 = k" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 189 | proof | 
| 61189 | 190 | show "v = prefix k v \<frown> suffix k v" | 
| 191 | by (rule prefix_suffix) | |
| 192 | show "length (prefix k v) = k" | |
| 193 | by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 194 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 195 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 196 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 197 | lemma set_subsequence[simp]: "set (w[i\<rightarrow>j]) = w`{i..<j}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 198 | unfolding subsequence_def by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 199 | |
| 61189 | 200 | lemma subsequence_take[simp]: "take i (w [j \<rightarrow> k]) = w [j \<rightarrow> min (j + i) k]" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 201 | by (simp add: subsequence_def take_map min_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 202 | |
| 61189 | 203 | lemma subsequence_shift[simp]: "(suffix i w) [j \<rightarrow> k] = w [i + j \<rightarrow> i + k]" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 204 | by (metis add_diff_cancel_left subsequence_prefix_suffix suffix_suffix) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 205 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 206 | lemma suffix_subseq_join[simp]: "i \<le> j \<Longrightarrow> v [i \<rightarrow> j] \<frown> suffix j v = suffix i v" | 
| 61189 | 207 | by (metis (no_types, lifting) Nat.add_0_right le_add_diff_inverse prefix_suffix | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 208 | subsequence_shift suffix_suffix) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 209 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 210 | lemma prefix_conc_fst[simp]: | 
| 61189 | 211 | assumes "j \<le> length w" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 212 | shows "prefix j (w \<frown> w') = take j w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 213 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 214 | have "\<forall>i < j. (prefix j (w \<frown> w')) ! i = (take j w) ! i" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 215 | using assms by (simp add: conc_fst subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 216 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 217 | by (simp add: assms list_eq_iff_nth_eq min.absorb2) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 218 | qed | 
| 61189 | 219 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 220 | lemma prefix_conc_snd[simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 221 | assumes "n \<ge> length u" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 222 | shows "prefix n (u \<frown> v) = u @ prefix (n - length u) v" | 
| 68977 | 223 | proof (intro nth_equalityI) | 
| 61189 | 224 | show "length (prefix n (u \<frown> v)) = length (u @ prefix (n - length u) v)" | 
| 225 | using assms by simp | |
| 226 | fix i | |
| 227 | assume "i < length (prefix n (u \<frown> v))" | |
| 228 | then show "prefix n (u \<frown> v) ! i = (u @ prefix (n - length u) v) ! i" | |
| 229 | by (cases "i < length u") (auto simp: nth_append) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 230 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 231 | |
| 61189 | 232 | lemma prefix_conc_length[simp]: "prefix (length w) (w \<frown> w') = w" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 233 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 234 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 235 | lemma suffix_conc_fst[simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 236 | assumes "n \<le> length u" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 237 | shows "suffix n (u \<frown> v) = drop n u \<frown> v" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 238 | proof | 
| 61189 | 239 | show "suffix n (u \<frown> v) i = (drop n u \<frown> v) i" for i | 
| 240 | using assms by (cases "n + i < length u") (auto simp: algebra_simps) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 241 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 242 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 243 | lemma suffix_conc_snd[simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 244 | assumes "n \<ge> length u" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 245 | shows "suffix n (u \<frown> v) = suffix (n - length u) v" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 246 | proof | 
| 61189 | 247 | show "suffix n (u \<frown> v) i = suffix (n - length u) v i" for i | 
| 248 | using assms by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 249 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 250 | |
| 61189 | 251 | lemma suffix_conc_length[simp]: "suffix (length w) (w \<frown> w') = w'" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 252 | unfolding conc_def by force | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 253 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 254 | lemma concat_eq[iff]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 255 | assumes "length v\<^sub>1 = length v\<^sub>2" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 256 | shows "v\<^sub>1 \<frown> u\<^sub>1 = v\<^sub>2 \<frown> u\<^sub>2 \<longleftrightarrow> v\<^sub>1 = v\<^sub>2 \<and> u\<^sub>1 = u\<^sub>2" | 
| 61189 | 257 | (is "?lhs \<longleftrightarrow> ?rhs") | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 258 | proof | 
| 61189 | 259 | assume ?lhs | 
| 260 | then have 1: "(v\<^sub>1 \<frown> u\<^sub>1) i = (v\<^sub>2 \<frown> u\<^sub>2) i" for i by auto | |
| 261 | show ?rhs | |
| 68977 | 262 | proof (intro conjI ext nth_equalityI) | 
| 61189 | 263 | show "length v\<^sub>1 = length v\<^sub>2" by (rule assms(1)) | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 264 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 265 | fix i | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 266 | assume 2: "i < length v\<^sub>1" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 267 | have 3: "i < length v\<^sub>2" using assms(1) 2 by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 268 | show "v\<^sub>1 ! i = v\<^sub>2 ! i" using 1[of i] 2 3 by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 269 | next | 
| 61189 | 270 | show "u\<^sub>1 i = u\<^sub>2 i" for i | 
| 271 | using 1[of "length v\<^sub>1 + i"] assms(1) by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 272 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 273 | next | 
| 61189 | 274 | assume ?rhs | 
| 275 | then show ?lhs by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 276 | qed | 
| 61189 | 277 | |
| 278 | lemma same_concat_eq[iff]: "u \<frown> v = u \<frown> w \<longleftrightarrow> v = w" | |
| 279 | by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 280 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 281 | lemma comp_concat[simp]: "f \<circ> u \<frown> v = map f u \<frown> (f \<circ> v)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 282 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 283 | fix i | 
| 61189 | 284 | show "(f \<circ> u \<frown> v) i = (map f u \<frown> (f \<circ> v)) i" | 
| 285 | by (cases "i < length u") simp_all | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 286 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 287 | |
| 61189 | 288 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 289 | subsection \<open>Prepending\<close> | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 290 | |
| 69597 | 291 | primrec build :: "'a \<Rightarrow> 'a word \<Rightarrow> 'a word" (infixr \<open>##\<close> 65) | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 292 | where "(a ## w) 0 = a" | "(a ## w) (Suc i) = w i" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 293 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 294 | lemma build_eq[iff]: "a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2 \<longleftrightarrow> a\<^sub>1 = a\<^sub>2 \<and> w\<^sub>1 = w\<^sub>2" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 295 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 296 | assume 1: "a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2" | 
| 61189 | 297 | have 2: "(a\<^sub>1 ## w\<^sub>1) i = (a\<^sub>2 ## w\<^sub>2) i" for i | 
| 298 | using 1 by auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 299 | show "a\<^sub>1 = a\<^sub>2 \<and> w\<^sub>1 = w\<^sub>2" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 300 | proof (intro conjI ext) | 
| 61189 | 301 | show "a\<^sub>1 = a\<^sub>2" | 
| 302 | using 2[of "0"] by simp | |
| 303 | show "w\<^sub>1 i = w\<^sub>2 i" for i | |
| 304 | using 2[of "Suc i"] by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 305 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 306 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 307 | assume 1: "a\<^sub>1 = a\<^sub>2 \<and> w\<^sub>1 = w\<^sub>2" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 308 | show "a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2" using 1 by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 309 | qed | 
| 61189 | 310 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 311 | lemma build_cons[simp]: "(a # u) \<frown> v = a ## u \<frown> v" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 312 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 313 | fix i | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 314 | show "((a # u) \<frown> v) i = (a ## u \<frown> v) i" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 315 | proof (cases i) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 316 | case 0 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 317 | show ?thesis unfolding 0 by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 318 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 319 | case (Suc j) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 320 | show ?thesis unfolding Suc by (cases "j < length u", simp+) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 321 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 322 | qed | 
| 61189 | 323 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 324 | lemma build_append[simp]: "(w @ a # u) \<frown> v = w \<frown> a ## u \<frown> v" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 325 | unfolding conc_conc[symmetric] by simp | 
| 61189 | 326 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 327 | lemma build_first[simp]: "w 0 ## suffix (Suc 0) w = w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 328 | proof | 
| 61189 | 329 | show "(w 0 ## suffix (Suc 0) w) i = w i" for i | 
| 330 | by (cases i) simp_all | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 331 | qed | 
| 61189 | 332 | |
| 333 | lemma build_split[intro]: "w = w 0 ## suffix 1 w" | |
| 334 | by simp | |
| 335 | ||
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 336 | lemma build_range[simp]: "range (a ## w) = insert a (range w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 337 | proof safe | 
| 61189 | 338 | show "(a ## w) i \<notin> range w \<Longrightarrow> (a ## w) i = a" for i | 
| 339 | by (cases i) auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 340 | show "a \<in> range (a ## w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 341 | proof (rule range_eqI) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 342 | show "a = (a ## w) 0" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 343 | qed | 
| 61189 | 344 | show "w i \<in> range (a ## w)" for i | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 345 | proof (rule range_eqI) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 346 | show "w i = (a ## w) (Suc i)" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 347 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 348 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 349 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 350 | lemma suffix_singleton_suffix[simp]: "w i ## suffix (Suc i) w = suffix i w" | 
| 61189 | 351 | using suffix_subseq_join[of i "Suc i" w] | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 352 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 353 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 354 | text \<open>Find the first occurrence of a letter from a given set\<close> | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 355 | lemma word_first_split_set: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 356 |   assumes "A \<inter> range w \<noteq> {}"
 | 
| 61189 | 357 |   obtains u a v where "w = u \<frown> [a] \<frown> v" "A \<inter> set u = {}" "a \<in> A"
 | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 358 | proof - | 
| 63040 | 359 | define i where "i = (LEAST i. w i \<in> A)" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 360 | show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 361 | proof | 
| 61189 | 362 | show "w = prefix i w \<frown> [w i] \<frown> suffix (Suc i) w" | 
| 363 | by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 364 |     show "A \<inter> set (prefix i w) = {}"
 | 
| 61189 | 365 | apply safe | 
| 366 | subgoal premises prems for a | |
| 367 | proof - | |
| 368 | from prems obtain k where 3: "k < i" "w k = a" | |
| 369 | by auto | |
| 370 | have 4: "w k \<notin> A" | |
| 371 | using not_less_Least 3(1) unfolding i_def . | |
| 372 | show ?thesis | |
| 373 | using prems(1) 3(2) 4 by auto | |
| 374 | qed | |
| 375 | done | |
| 376 | show "w i \<in> A" | |
| 377 | using LeastI assms(1) unfolding i_def by fast | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 378 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 379 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 380 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 381 | |
| 61189 | 382 | subsection \<open>The limit set of an $\omega$-word\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 383 | |
| 61189 | 384 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 385 | The limit set (also called infinity set) of an $\omega$-word | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 386 | is the set of letters that appear infinitely often in the word. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 387 | This set plays an important role in defining acceptance conditions | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 388 | of $\omega$-automata. | 
| 61189 | 389 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 390 | |
| 61189 | 391 | definition limit :: "'a word \<Rightarrow> 'a set" | 
| 392 |   where "limit x \<equiv> {a . \<exists>\<^sub>\<infinity>n . x n = a}"
 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 393 | |
| 61189 | 394 | lemma limit_iff_frequent: "a \<in> limit x \<longleftrightarrow> (\<exists>\<^sub>\<infinity>n . x n = a)" | 
| 395 | by (simp add: limit_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 396 | |
| 61189 | 397 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 398 | The following is a different way to define the limit, | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 399 | using the reverse image, making the laws about reverse | 
| 61189 | 400 | image applicable to the limit set. | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 401 | (Might want to change the definition above?) | 
| 61189 | 402 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 403 | |
| 61189 | 404 | lemma limit_vimage: "(a \<in> limit x) = infinite (x -` {a})"
 | 
| 405 | by (simp add: limit_def Inf_many_def vimage_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 406 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 407 | lemma two_in_limit_iff: | 
| 61189 | 408 |   "({a, b} \<subseteq> limit x) =
 | 
| 409 | ((\<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)))" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 410 | (is "?lhs = (?r1 \<and> ?r2 \<and> ?r3)") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 411 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 412 | assume lhs: "?lhs" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 413 | hence 1: "?r1" by (auto simp: limit_def elim: INFM_EX) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 414 | from lhs have "\<forall>n. \<exists>m>n. x m = b" by (auto simp: limit_def INFM_nat) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 415 | hence 2: "?r2" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 416 | from lhs have "\<forall>m. \<exists>n>m. x n = a" by (auto simp: limit_def INFM_nat) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 417 | hence 3: "?r3" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 418 | from 1 2 3 show "?r1 \<and> ?r2 \<and> ?r3" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 419 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 420 | assume "?r1 \<and> ?r2 \<and> ?r3" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 421 | hence 1: "?r1" and 2: "?r2" and 3: "?r3" by simp+ | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 422 | have infa: "\<forall>m. \<exists>n\<ge>m. x n = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 423 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 424 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 425 | show "\<exists>n\<ge>m. x n = a" (is "?A m") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 426 | proof (induct m) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 427 | from 1 show "?A 0" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 428 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 429 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 430 | assume ih: "?A m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 431 | then obtain n where n: "n \<ge> m" "x n = a" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 432 | with 2 obtain k where k: "k>n" "x k = b" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 433 | with 3 obtain l where l: "l>k" "x l = a" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 434 | from n k l have "l \<ge> Suc m" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 435 | with l show "?A (Suc m)" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 436 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 437 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 438 | hence infa': "\<exists>\<^sub>\<infinity>n. x n = a" by (simp add: INFM_nat_le) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 439 | have "\<forall>n. \<exists>m>n. x m = b" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 440 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 441 | fix n | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 442 | from infa obtain k where k1: "k\<ge>n" and k2: "x k = a" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 443 | from 2 k2 obtain l where l1: "l>k" and l2: "x l = b" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 444 | from k1 l1 have "l > n" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 445 | with l2 show "\<exists>m>n. x m = b" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 446 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 447 | hence "\<exists>\<^sub>\<infinity>m. x m = b" by (simp add: INFM_nat) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 448 | with infa' show "?lhs" by (auto simp: limit_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 449 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 450 | |
| 61189 | 451 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 452 | For $\omega$-words over a finite alphabet, the limit set is | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 453 | non-empty. Moreover, from some position onward, any such word | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 454 | contains only letters from its limit set. | 
| 61189 | 455 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 456 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 457 | lemma limit_nonempty: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 458 | assumes fin: "finite (range x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 459 | shows "\<exists>a. a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 460 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 461 |   from fin obtain a where "a \<in> range x \<and> infinite (x -` {a})"
 | 
| 61189 | 462 | by (rule inf_img_fin_domE) auto | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 463 | hence "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 464 | by (auto simp add: limit_vimage) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 465 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 466 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 467 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 468 | lemmas limit_nonemptyE = limit_nonempty[THEN exE] | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 469 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 470 | lemma limit_inter_INF: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 471 |   assumes hyp: "limit w \<inter> S \<noteq> {}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 472 | shows "\<exists>\<^sub>\<infinity> n. w n \<in> S" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 473 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 474 | from hyp obtain x where "\<exists>\<^sub>\<infinity> n. w n = x" and "x \<in> S" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 475 | by (auto simp add: limit_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 476 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 477 | by (auto elim: INFM_mono) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 478 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 479 | |
| 61189 | 480 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 481 | The reverse implication is true only if $S$ is finite. | 
| 61189 | 482 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 483 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 484 | lemma INF_limit_inter: | 
| 61189 | 485 | assumes hyp: "\<exists>\<^sub>\<infinity> n. w n \<in> S" | 
| 486 | and fin: "finite (S \<inter> range w)" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 487 | shows "\<exists>a. a \<in> limit w \<inter> S" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 488 | proof (rule ccontr) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 489 | assume contra: "\<not>(\<exists>a. a \<in> limit w \<inter> S)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 490 |   hence "\<forall>a\<in>S. finite {n. w n = a}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 491 | by (auto simp add: limit_def Inf_many_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 492 |   with fin have "finite (UN a:S \<inter> range w. {n. w n = a})"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 493 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 494 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 495 |   have "(UN a:S \<inter> range w. {n. w n = a}) = {n. w n \<in> S}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 496 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 497 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 498 | note hyp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 499 | ultimately show "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 500 | by (simp add: Inf_many_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 501 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 502 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 503 | lemma fin_ex_inf_eq_limit: "finite A \<Longrightarrow> (\<exists>\<^sub>\<infinity>i. w i \<in> A) \<longleftrightarrow> limit w \<inter> A \<noteq> {}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 504 | by (metis INF_limit_inter equals0D finite_Int limit_inter_INF) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 505 | |
| 61189 | 506 | lemma limit_in_range_suffix: "limit x \<subseteq> range (suffix k x)" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 507 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 508 | fix a | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 509 | assume "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 510 | then obtain l where | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 511 | kl: "k < l" and xl: "x l = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 512 | by (auto simp add: limit_def INFM_nat) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 513 | from kl obtain m where "l = k+m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 514 | by (auto simp add: less_iff_Suc_add) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 515 | with xl show "a \<in> range (suffix k x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 516 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 517 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 518 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 519 | lemma limit_in_range: "limit r \<subseteq> range r" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 520 | using limit_in_range_suffix[of r 0] by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 521 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 522 | lemmas limit_in_range_suffixD = limit_in_range_suffix[THEN subsetD] | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 523 | |
| 61189 | 524 | lemma limit_subset: "limit f \<subseteq> f ` {n..}"
 | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 525 | using limit_in_range_suffix[of f n] unfolding suffix_def by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 526 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 527 | theorem limit_is_suffix: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 528 | assumes fin: "finite (range x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 529 | shows "\<exists>k. limit x = range (suffix k x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 530 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 531 | have "\<exists>k. range (suffix k x) \<subseteq> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 532 | proof - | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 533 | \<comment> \<open>The set of letters that are not in the limit is certainly finite.\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 534 | from fin have "finite (range x - limit x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 535 | by simp | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 536 | \<comment> \<open>Moreover, any such letter occurs only finitely often\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 537 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 538 |     have "\<forall>a \<in> range x - limit x. finite (x -` {a})"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 539 | by (auto simp add: limit_vimage) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 540 | \<comment> \<open>Thus, there are only finitely many occurrences of such letters.\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 541 |     ultimately have "finite (UN a : range x - limit x. x -` {a})"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 542 | by (blast intro: finite_UN_I) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 543 | \<comment> \<open>Therefore these occurrences are within some initial interval.\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 544 |     then obtain k where "(UN a : range x - limit x. x -` {a}) \<subseteq> {..<k}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 545 | by (blast dest: finite_nat_bounded) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 546 | \<comment> \<open>This is just the bound we are looking for.\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 547 | hence "\<forall>m. k \<le> m \<longrightarrow> x m \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 548 | by (auto simp add: limit_vimage) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 549 | hence "range (suffix k x) \<subseteq> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 550 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 551 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 552 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 553 | then obtain k where "range (suffix k x) \<subseteq> limit x" .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 554 | with limit_in_range_suffix | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 555 | have "limit x = range (suffix k x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 556 | by (rule subset_antisym) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 557 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 558 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 559 | |
| 61337 | 560 | lemmas limit_is_suffixE = limit_is_suffix[THEN exE] | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 561 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 562 | |
| 61189 | 563 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 564 | The limit set enjoys some simple algebraic laws with respect | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 565 | to concatenation, suffixes, iteration, and renaming. | 
| 61189 | 566 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 567 | |
| 61189 | 568 | theorem limit_conc [simp]: "limit (w \<frown> x) = limit x" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 569 | proof (auto) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 570 | fix a assume a: "a \<in> limit (w \<frown> x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 571 | have "\<forall>m. \<exists>n. m<n \<and> x n = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 572 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 573 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 574 | from a obtain n where "m + length w < n \<and> (w \<frown> x) n = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 575 | by (auto simp add: limit_def Inf_many_def infinite_nat_iff_unbounded) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 576 | hence "m < n - length w \<and> x (n - length w) = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 577 | by (auto simp add: conc_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 578 | thus "\<exists>n. m<n \<and> x n = a" .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 579 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 580 |   hence "infinite {n . x n = a}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 581 | by (simp add: infinite_nat_iff_unbounded) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 582 | thus "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 583 | by (simp add: limit_def Inf_many_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 584 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 585 | fix a assume a: "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 586 | have "\<forall>m. length w < m \<longrightarrow> (\<exists>n. m<n \<and> (w \<frown> x) n = a)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 587 | proof (clarify) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 588 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 589 | assume m: "length w < m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 590 | with a obtain n where "m - length w < n \<and> x n = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 591 | by (auto simp add: limit_def Inf_many_def infinite_nat_iff_unbounded) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 592 | with m have "m < n + length w \<and> (w \<frown> x) (n + length w) = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 593 | by (simp add: conc_def, arith) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 594 | thus "\<exists>n. m<n \<and> (w \<frown> x) n = a" .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 595 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 596 |   hence "infinite {n . (w \<frown> x) n = a}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 597 | by (simp add: unbounded_k_infinite) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 598 | thus "a \<in> limit (w \<frown> x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 599 | by (simp add: limit_def Inf_many_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 600 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 601 | |
| 61189 | 602 | theorem limit_suffix [simp]: "limit (suffix n x) = limit x" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 603 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 604 | have "x = (prefix n x) \<frown> (suffix n x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 605 | by (simp add: prefix_suffix) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 606 | hence "limit x = limit (prefix n x \<frown> suffix n x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 607 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 608 | also have "\<dots> = limit (suffix n x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 609 | by (rule limit_conc) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 610 | finally show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 611 | by (rule sym) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 612 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 613 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 614 | theorem limit_iter [simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 615 | assumes nempty: "0 < length w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 616 | shows "limit w\<^sup>\<omega> = set w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 617 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 618 | have "limit w\<^sup>\<omega> \<subseteq> range w\<^sup>\<omega>" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 619 | by (auto simp add: limit_def dest: INFM_EX) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 620 | also from nempty have "\<dots> \<subseteq> set w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 621 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 622 | finally show "limit w\<^sup>\<omega> \<subseteq> set w" . | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 623 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 624 |   {
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 625 | fix a assume a: "a \<in> set w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 626 | then obtain k where k: "k < length w \<and> w!k = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 627 | by (auto simp add: set_conv_nth) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 628 | \<comment> \<open>the following bound is terrible, but it simplifies the proof\<close> | 
| 61189 | 629 | from nempty k have "\<forall>m. w\<^sup>\<omega> ((Suc m)*(length w) + k) = a" | 
| 64593 
50c715579715
reoriented congruence rules in non-explosive direction
 haftmann parents: 
63112diff
changeset | 630 | by (simp add: mod_add_left_eq [symmetric]) | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 631 | moreover | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 632 | \<comment> \<open>why is the following so hard to prove??\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 633 | have "\<forall>m. m < (Suc m)*(length w) + k" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 634 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 635 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 636 | from nempty have "1 \<le> length w" by arith | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 637 | hence "m*1 \<le> m*length w" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 638 | hence "m \<le> m*length w" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 639 | with nempty have "m < length w + (m*length w) + k" by arith | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 640 | thus "m < (Suc m)*(length w) + k" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 641 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 642 | moreover note nempty | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 643 | ultimately have "a \<in> limit w\<^sup>\<omega>" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 644 | by (auto simp add: limit_iff_frequent INFM_nat) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 645 | } | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 646 | then show "set w \<subseteq> limit w\<^sup>\<omega>" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 647 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 648 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 649 | lemma limit_o [simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 650 | assumes a: "a \<in> limit w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 651 | shows "f a \<in> limit (f \<circ> w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 652 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 653 | from a | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 654 | have "\<exists>\<^sub>\<infinity>n. w n = a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 655 | by (simp add: limit_iff_frequent) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 656 | hence "\<exists>\<^sub>\<infinity>n. f (w n) = f a" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 657 | by (rule INFM_mono, simp) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 658 | thus "f a \<in> limit (f \<circ> w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 659 | by (simp add: limit_iff_frequent) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 660 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 661 | |
| 61189 | 662 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 663 | The converse relation is not true in general: $f(a)$ can be in the | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 664 | limit of $f \circ w$ even though $a$ is not in the limit of $w$. | 
| 61585 | 665 | However, \<open>limit\<close> commutes with renaming if the function is | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 666 | injective. More generally, if $f(a)$ is the image of only finitely | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 667 | many elements, some of these must be in the limit of $w$. | 
| 61189 | 668 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 669 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 670 | lemma limit_o_inv: | 
| 61189 | 671 |   assumes fin: "finite (f -` {x})"
 | 
| 672 | and x: "x \<in> limit (f \<circ> w)" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 673 |   shows "\<exists>a \<in> (f -` {x}). a \<in> limit w"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 674 | proof (rule ccontr) | 
| 61189 | 675 | assume contra: "\<not> ?thesis" | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 676 | \<comment> \<open>hence, every element in the pre-image occurs only finitely often\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 677 |   then have "\<forall>a \<in> (f -` {x}). finite {n. w n = a}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 678 | by (simp add: limit_def Inf_many_def) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 679 | \<comment> \<open>so there are only finitely many occurrences of any such element\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 680 |   with fin have "finite (\<Union> a \<in> (f -` {x}). {n. w n = a})"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 681 | by auto | 
| 61585 | 682 | \<comment> \<open>these are precisely those positions where $x$ occurs in $f \circ w$\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 683 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 684 |   have "(\<Union> a \<in> (f -` {x}). {n. w n = a}) = {n. f(w n) = x}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 685 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 686 | ultimately | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 687 | \<comment> \<open>so $x$ can occur only finitely often in the translated word\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 688 |   have "finite {n. f(w n) = x}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 689 | by simp | 
| 61585 | 690 | \<comment> \<open>\ldots\ which yields a contradiction\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 691 | with x show "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 692 | by (simp add: limit_def Inf_many_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 693 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 694 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 695 | theorem limit_inj [simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 696 | assumes inj: "inj f" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 697 | shows "limit (f \<circ> w) = f ` (limit w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 698 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 699 | show "f ` limit w \<subseteq> limit (f \<circ> w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 700 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 701 | show "limit (f \<circ> w) \<subseteq> f ` limit w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 702 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 703 | fix x | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 704 | assume x: "x \<in> limit (f \<circ> w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 705 |     from inj have "finite (f -` {x})"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 706 | by (blast intro: finite_vimageI) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 707 |     with x obtain a where a: "a \<in> (f -` {x}) \<and> a \<in> limit w"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 708 | by (blast dest: limit_o_inv) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 709 | thus "x \<in> f ` (limit w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 710 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 711 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 712 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 713 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 714 | lemma limit_inter_empty: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 715 | assumes fin: "finite (range w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 716 |   assumes hyp: "limit w \<inter> S = {}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 717 | shows "\<forall>\<^sub>\<infinity>n. w n \<notin> S" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 718 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 719 | from fin obtain k where k_def: "limit w = range (suffix k w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 720 | using limit_is_suffix by blast | 
| 61189 | 721 | have "w (k + k') \<notin> S" for k' | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 722 | using hyp unfolding k_def suffix_def image_def by blast | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 723 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 724 | unfolding MOST_nat_le using le_Suc_ex by blast | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 725 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 726 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 727 | text \<open>If the limit is the suffix of the sequence's range, | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 728 | we may increase the suffix index arbitrarily\<close> | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 729 | lemma limit_range_suffix_incr: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 730 | assumes "limit r = range (suffix i r)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 731 | assumes "j\<ge>i" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 732 | shows "limit r = range (suffix j r)" | 
| 61189 | 733 | (is "?lhs = ?rhs") | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 734 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 735 | have "?lhs = range (suffix i r)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 736 | using assms by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 737 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 738 | have "\<dots> \<supseteq> ?rhs" using \<open>j\<ge>i\<close> | 
| 61189 | 739 | by (metis (mono_tags, lifting) assms(2) | 
| 740 | image_subsetI le_Suc_ex range_eqI suffix_def suffix_suffix) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 741 | moreover | 
| 61189 | 742 | have "\<dots> \<supseteq> ?lhs" by (rule limit_in_range_suffix) | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 743 | ultimately | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 744 | show "?lhs = ?rhs" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 745 | by (metis antisym_conv limit_in_range_suffix) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 746 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 747 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 748 | text \<open>For two finite sequences, we can find a common suffix index such | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 749 | that the limits can be represented as these suffixes' ranges.\<close> | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 750 | lemma common_range_limit: | 
| 61189 | 751 | assumes "finite (range x)" | 
| 752 | and "finite (range y)" | |
| 753 | obtains i where "limit x = range (suffix i x)" | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 754 | and "limit y = range (suffix i y)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 755 | proof - | 
| 61189 | 756 | obtain i j where 1: "limit x = range (suffix i x)" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 757 | and 2: "limit y = range (suffix j y)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 758 | using assms limit_is_suffix by metis | 
| 61189 | 759 | have "limit x = range (suffix (max i j) x)" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 760 | and "limit y = range (suffix (max i j) y)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 761 | using limit_range_suffix_incr[OF 1] limit_range_suffix_incr[OF 2] | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 762 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 763 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 764 | using that by metis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 765 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 766 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 767 | |
| 61189 | 768 | subsection \<open>Index sequences and piecewise definitions\<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 769 | |
| 61189 | 770 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 771 | A word can be defined piecewise: given a sequence of words $w_0, w_1, \ldots$ | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 772 | and a strictly increasing sequence of integers $i_0, i_1, \ldots$ where $i_0=0$, | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 773 | a single word is obtained by concatenating subwords of the $w_n$ as given by | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 774 | the integers: the resulting word is | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 775 | \[ | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 776 |     (w_0)_{i_0} \ldots (w_0)_{i_1-1} (w_1)_{i_1} \ldots (w_1)_{i_2-1} \ldots
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 777 | \] | 
| 61189 | 778 | We prepare the field by proving some trivial facts about such sequences of | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 779 | indexes. | 
| 61189 | 780 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 781 | |
| 61189 | 782 | definition idx_sequence :: "nat word \<Rightarrow> bool" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 783 | where "idx_sequence idx \<equiv> (idx 0 = 0) \<and> (\<forall>n. idx n < idx (Suc n))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 784 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 785 | lemma idx_sequence_less: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 786 | assumes iseq: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 787 | shows "idx n < idx (Suc(n+k))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 788 | proof (induct k) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 789 | from iseq show "idx n < idx (Suc (n + 0))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 790 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 791 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 792 | fix k | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 793 | assume ih: "idx n < idx (Suc(n+k))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 794 | from iseq have "idx (Suc(n+k)) < idx (Suc(n + Suc k))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 795 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 796 | with ih show "idx n < idx (Suc(n + Suc k))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 797 | by (rule less_trans) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 798 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 799 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 800 | lemma idx_sequence_inj: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 801 | assumes iseq: "idx_sequence idx" | 
| 61189 | 802 | and eq: "idx m = idx n" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 803 | shows "m = n" | 
| 63112 | 804 | proof (cases m n rule: linorder_cases) | 
| 805 | case greater | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 806 | then obtain k where "m = Suc(n+k)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 807 | by (auto simp add: less_iff_Suc_add) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 808 | with iseq have "idx n < idx m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 809 | by (simp add: idx_sequence_less) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 810 | with eq show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 811 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 812 | next | 
| 63112 | 813 | case less | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 814 | then obtain k where "n = Suc(m+k)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 815 | by (auto simp add: less_iff_Suc_add) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 816 | with iseq have "idx m < idx n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 817 | by (simp add: idx_sequence_less) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 818 | with eq show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 819 | by simp | 
| 63112 | 820 | qed | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 821 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 822 | lemma idx_sequence_mono: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 823 | assumes iseq: "idx_sequence idx" | 
| 61189 | 824 | and m: "m \<le> n" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 825 | shows "idx m \<le> idx n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 826 | proof (cases "m=n") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 827 | case True | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 828 | thus ?thesis by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 829 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 830 | case False | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 831 | with m have "m < n" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 832 | then obtain k where "n = Suc(m+k)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 833 | by (auto simp add: less_iff_Suc_add) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 834 | with iseq have "idx m < idx n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 835 | by (simp add: idx_sequence_less) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 836 | thus ?thesis by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 837 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 838 | |
| 61189 | 839 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 840 | Given an index sequence, every natural number is contained in the | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 841 | interval defined by two adjacent indexes, and in fact this interval | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 842 | is determined uniquely. | 
| 61189 | 843 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 844 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 845 | lemma idx_sequence_idx: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 846 | assumes "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 847 |   shows "idx k \<in> {idx k ..< idx (Suc k)}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 848 | using assms by (auto simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 849 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 850 | lemma idx_sequence_interval: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 851 | assumes iseq: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 852 |   shows "\<exists>k. n \<in> {idx k ..< idx (Suc k) }"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 853 | (is "?P n" is "\<exists>k. ?in n k") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 854 | proof (induct n) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 855 | from iseq have "0 = idx 0" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 856 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 857 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 858 |   from iseq have "idx 0 \<in> {idx 0 ..< idx (Suc 0) }"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 859 | by (rule idx_sequence_idx) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 860 | ultimately | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 861 | show "?P 0" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 862 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 863 | fix n | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 864 | assume "?P n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 865 | then obtain k where k: "?in n k" .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 866 | show "?P (Suc n)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 867 | proof (cases "Suc n < idx (Suc k)") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 868 | case True | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 869 | with k have "?in (Suc n) k" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 870 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 871 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 872 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 873 | case False | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 874 | with k have "Suc n = idx (Suc k)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 875 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 876 | with iseq have "?in (Suc n) (Suc k)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 877 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 878 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 879 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 880 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 881 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 882 | lemma idx_sequence_interval_unique: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 883 | assumes iseq: "idx_sequence idx" | 
| 61189 | 884 |     and k: "n \<in> {idx k ..< idx (Suc k)}"
 | 
| 885 |     and m: "n \<in> {idx m ..< idx (Suc m)}"
 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 886 | shows "k = m" | 
| 63112 | 887 | proof (cases k m rule: linorder_cases) | 
| 888 | case less | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 889 | hence "Suc k \<le> m" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 890 | with iseq have "idx (Suc k) \<le> idx m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 891 | by (rule idx_sequence_mono) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 892 | with m have "idx (Suc k) \<le> n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 893 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 894 | with k have "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 895 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 896 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 897 | next | 
| 63112 | 898 | case greater | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 899 | hence "Suc m \<le> k" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 900 | with iseq have "idx (Suc m) \<le> idx k" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 901 | by (rule idx_sequence_mono) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 902 | with k have "idx (Suc m) \<le> n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 903 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 904 | with m have "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 905 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 906 | thus ?thesis .. | 
| 63112 | 907 | qed | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 908 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 909 | lemma idx_sequence_unique_interval: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 910 | assumes iseq: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 911 |   shows "\<exists>! k. n \<in> {idx k ..< idx (Suc k) }"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 912 | proof (rule ex_ex1I) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 913 |   from iseq show "\<exists>k. n \<in> {idx k ..< idx (Suc k)}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 914 | by (rule idx_sequence_interval) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 915 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 916 | fix k y | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 917 |   assume "n \<in> {idx k..<idx (Suc k)}" and "n \<in> {idx y..<idx (Suc y)}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 918 | with iseq show "k = y" by (auto elim: idx_sequence_interval_unique) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 919 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 920 | |
| 61189 | 921 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 922 | Now we can define the piecewise construction of a word using | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 923 | an index sequence. | 
| 61189 | 924 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 925 | |
| 61189 | 926 | definition merge :: "'a word word \<Rightarrow> nat word \<Rightarrow> 'a word" | 
| 927 |   where "merge ws idx \<equiv> \<lambda>n. let i = THE i. n \<in> {idx i ..< idx (Suc i) } in ws i n"
 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 928 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 929 | lemma merge: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 930 | assumes idx: "idx_sequence idx" | 
| 61189 | 931 |     and n: "n \<in> {idx i ..< idx (Suc i)}"
 | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 932 | shows "merge ws idx n = ws i n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 933 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 934 |   from n have "(THE k. n \<in> {idx k ..< idx (Suc k) }) = i"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 935 | by (rule the_equality[OF _ sym[OF idx_sequence_interval_unique[OF idx n]]]) simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 936 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 937 | by (simp add: merge_def Let_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 938 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 939 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 940 | lemma merge0: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 941 | assumes idx: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 942 | shows "merge ws idx 0 = ws 0 0" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 943 | proof (rule merge[OF idx]) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 944 | from idx have "idx 0 < idx (Suc 0)" | 
| 61189 | 945 | unfolding idx_sequence_def by blast | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 946 |   with idx show "0 \<in> {idx 0 ..< idx (Suc 0)}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 947 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 948 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 949 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 950 | lemma merge_Suc: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 951 | assumes idx: "idx_sequence idx" | 
| 61189 | 952 |     and n: "n \<in> {idx i ..< idx (Suc i)}"
 | 
| 953 | shows "merge ws idx (Suc n) = (if Suc n = idx (Suc i) then ws (Suc i) else ws i) (Suc n)" | |
| 954 | proof auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 955 | assume eq: "Suc n = idx (Suc i)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 956 | from idx have "idx (Suc i) < idx (Suc(Suc i))" | 
| 61189 | 957 | unfolding idx_sequence_def by blast | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 958 | with eq idx show "merge ws idx (idx (Suc i)) = ws (Suc i) (idx (Suc i))" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 959 | by (simp add: merge) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 960 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 961 | assume neq: "Suc n \<noteq> idx (Suc i)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 962 |   with n have "Suc n \<in> {idx i ..< idx (Suc i) }"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 963 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 964 | with idx show "merge ws idx (Suc n) = ws i (Suc n)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 965 | by (rule merge) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 966 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 967 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 968 | end |