| author | wenzelm | 
| Thu, 08 Aug 2019 12:11:40 +0200 | |
| changeset 70490 | c42a0a0a9a8d | 
| parent 69597 | ff784d5a5bfb | 
| child 76063 | 24c9f56aa035 | 
| 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 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 34 | infinite words, as studied by M\"uller 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 | 
| 69597 | 51 | iter :: "'a list \<Rightarrow> 'a word" (\<open>(_\<^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>" | 
| 111 | by (rule ext) (simp add: conc_def mod_geq) | |
| 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 | |
| 69597 | 119 | definition subsequence :: "'a word \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> 'a list" (\<open>_ [_ \<rightarrow> _]\<close> 900) | 
| 61189 | 120 | 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 | 121 | |
| 61189 | 122 | abbreviation prefix :: "nat \<Rightarrow> 'a word \<Rightarrow> 'a list" | 
| 123 | 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 | 124 | |
| 61189 | 125 | lemma suffix_nth [simp]: "(suffix k x) n = x (k+n)" | 
| 126 | by (simp add: suffix_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 127 | |
| 61189 | 128 | lemma suffix_0 [simp]: "suffix 0 x = x" | 
| 129 | by (simp add: suffix_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 130 | |
| 61189 | 131 | lemma suffix_suffix [simp]: "suffix m (suffix k x) = suffix (k+m) x" | 
| 132 | 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 | 133 | |
| 61189 | 134 | 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 | 135 | 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 | 136 | |
| 61189 | 137 | 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 | 138 | 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 | 139 | |
| 61189 | 140 | lemma subsequence_empty[simp]: "w [i \<rightarrow> j] = [] \<longleftrightarrow> j \<le> i" | 
| 141 | 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 | 142 | |
| 61189 | 143 | 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 | 144 | by (simp add: subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 145 | |
| 61189 | 146 | 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 | 147 | unfolding subsequence_def | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 148 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 149 | |
| 61189 | 150 | lemma subseq_to_zero[simp]: "w[i\<rightarrow>0] = []" | 
| 151 | by simp | |
| 152 | ||
| 153 | lemma subseq_to_smaller[simp]: "i\<ge>j \<Longrightarrow> w[i\<rightarrow>j] = []" | |
| 154 | by simp | |
| 155 | ||
| 156 | 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 | 157 | by (auto simp: subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 158 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 159 | 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 | 160 | by (auto simp: subsequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 161 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 162 | |
| 61189 | 163 | 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 | 164 | proof (cases "i \<le> j") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 165 | case True | 
| 61189 | 166 | have "w [i \<rightarrow> j] = map w (map (\<lambda>n. n + i) [0..<j - i])" | 
| 167 | unfolding map_add_upt subsequence_def | |
| 168 | using le_add_diff_inverse2[OF True] by force | |
| 169 | also | |
| 170 | have "\<dots> = map (\<lambda>n. w (n + i)) [0..<j - i]" | |
| 171 | unfolding map_map comp_def by blast | |
| 172 | finally | |
| 173 | show ?thesis | |
| 174 | unfolding subsequence_def suffix_def add.commute[of i] by simp | |
| 175 | next | |
| 176 | case False | |
| 177 | then show ?thesis | |
| 178 | by (simp add: subsequence_def) | |
| 179 | qed | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 180 | |
| 61189 | 181 | lemma prefix_suffix: "x = prefix n x \<frown> (suffix n x)" | 
| 182 | 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 | 183 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 184 | declare prefix_suffix[symmetric, simp] | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 185 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 186 | |
| 61189 | 187 | 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 | 188 | proof | 
| 61189 | 189 | show "v = prefix k v \<frown> suffix k v" | 
| 190 | by (rule prefix_suffix) | |
| 191 | show "length (prefix k v) = k" | |
| 192 | by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 193 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 194 | |
| 
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 | 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 | 197 | unfolding subsequence_def by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 198 | |
| 61189 | 199 | 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 | 200 | 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 | 201 | |
| 61189 | 202 | 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 | 203 | 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 | 204 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 205 | lemma suffix_subseq_join[simp]: "i \<le> j \<Longrightarrow> v [i \<rightarrow> j] \<frown> suffix j v = suffix i v" | 
| 61189 | 206 | 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 | 207 | subsequence_shift suffix_suffix) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 208 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 209 | lemma prefix_conc_fst[simp]: | 
| 61189 | 210 | assumes "j \<le> length w" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 211 | 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 | 212 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 213 | 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 | 214 | 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 | 215 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 216 | 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 | 217 | qed | 
| 61189 | 218 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 219 | lemma prefix_conc_snd[simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 220 | assumes "n \<ge> length u" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 221 | shows "prefix n (u \<frown> v) = u @ prefix (n - length u) v" | 
| 68977 | 222 | proof (intro nth_equalityI) | 
| 61189 | 223 | show "length (prefix n (u \<frown> v)) = length (u @ prefix (n - length u) v)" | 
| 224 | using assms by simp | |
| 225 | fix i | |
| 226 | assume "i < length (prefix n (u \<frown> v))" | |
| 227 | then show "prefix n (u \<frown> v) ! i = (u @ prefix (n - length u) v) ! i" | |
| 228 | 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 | 229 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 230 | |
| 61189 | 231 | 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 | 232 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 233 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 234 | lemma suffix_conc_fst[simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 235 | assumes "n \<le> length u" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 236 | 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 | 237 | proof | 
| 61189 | 238 | show "suffix n (u \<frown> v) i = (drop n u \<frown> v) i" for i | 
| 239 | 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 | 240 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 241 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 242 | lemma suffix_conc_snd[simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 243 | assumes "n \<ge> length u" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 244 | 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 | 245 | proof | 
| 61189 | 246 | show "suffix n (u \<frown> v) i = suffix (n - length u) v i" for i | 
| 247 | using assms by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 248 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 249 | |
| 61189 | 250 | 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 | 251 | unfolding conc_def by force | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 252 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 253 | lemma concat_eq[iff]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 254 | 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 | 255 | 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 | 256 | (is "?lhs \<longleftrightarrow> ?rhs") | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 257 | proof | 
| 61189 | 258 | assume ?lhs | 
| 259 | then have 1: "(v\<^sub>1 \<frown> u\<^sub>1) i = (v\<^sub>2 \<frown> u\<^sub>2) i" for i by auto | |
| 260 | show ?rhs | |
| 68977 | 261 | proof (intro conjI ext nth_equalityI) | 
| 61189 | 262 | 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 | 263 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 264 | fix i | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 265 | 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 | 266 | 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 | 267 | 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 | 268 | next | 
| 61189 | 269 | show "u\<^sub>1 i = u\<^sub>2 i" for i | 
| 270 | 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 | 271 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 272 | next | 
| 61189 | 273 | assume ?rhs | 
| 274 | then show ?lhs by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 275 | qed | 
| 61189 | 276 | |
| 277 | lemma same_concat_eq[iff]: "u \<frown> v = u \<frown> w \<longleftrightarrow> v = w" | |
| 278 | by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 279 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 280 | 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 | 281 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 282 | fix i | 
| 61189 | 283 | show "(f \<circ> u \<frown> v) i = (map f u \<frown> (f \<circ> v)) i" | 
| 284 | 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 | 285 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 286 | |
| 61189 | 287 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 288 | subsection \<open>Prepending\<close> | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 289 | |
| 69597 | 290 | 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 | 291 | 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 | 292 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 293 | 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 | 294 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 295 | assume 1: "a\<^sub>1 ## w\<^sub>1 = a\<^sub>2 ## w\<^sub>2" | 
| 61189 | 296 | have 2: "(a\<^sub>1 ## w\<^sub>1) i = (a\<^sub>2 ## w\<^sub>2) i" for i | 
| 297 | using 1 by auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 298 | 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 | 299 | proof (intro conjI ext) | 
| 61189 | 300 | show "a\<^sub>1 = a\<^sub>2" | 
| 301 | using 2[of "0"] by simp | |
| 302 | show "w\<^sub>1 i = w\<^sub>2 i" for i | |
| 303 | 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 | 304 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 305 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 306 | 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 | 307 | 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 | 308 | qed | 
| 61189 | 309 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 310 | 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 | 311 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 312 | fix i | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 313 | 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 | 314 | proof (cases i) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 315 | case 0 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 316 | show ?thesis unfolding 0 by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 317 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 318 | case (Suc j) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 319 | 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 | 320 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 321 | qed | 
| 61189 | 322 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 323 | 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 | 324 | unfolding conc_conc[symmetric] by simp | 
| 61189 | 325 | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 326 | 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 | 327 | proof | 
| 61189 | 328 | show "(w 0 ## suffix (Suc 0) w) i = w i" for i | 
| 329 | by (cases i) simp_all | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 330 | qed | 
| 61189 | 331 | |
| 332 | lemma build_split[intro]: "w = w 0 ## suffix 1 w" | |
| 333 | by simp | |
| 334 | ||
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 335 | 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 | 336 | proof safe | 
| 61189 | 337 | show "(a ## w) i \<notin> range w \<Longrightarrow> (a ## w) i = a" for i | 
| 338 | by (cases i) auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 339 | show "a \<in> range (a ## w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 340 | proof (rule range_eqI) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 341 | 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 | 342 | qed | 
| 61189 | 343 | 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 | 344 | proof (rule range_eqI) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 345 | 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 | 346 | qed | 
| 
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 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 349 | lemma suffix_singleton_suffix[simp]: "w i ## suffix (Suc i) w = suffix i w" | 
| 61189 | 350 | 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 | 351 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 352 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 353 | 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 | 354 | lemma word_first_split_set: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 355 |   assumes "A \<inter> range w \<noteq> {}"
 | 
| 61189 | 356 |   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 | 357 | proof - | 
| 63040 | 358 | 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 | 359 | show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 360 | proof | 
| 61189 | 361 | show "w = prefix i w \<frown> [w i] \<frown> suffix (Suc i) w" | 
| 362 | by simp | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 363 |     show "A \<inter> set (prefix i w) = {}"
 | 
| 61189 | 364 | apply safe | 
| 365 | subgoal premises prems for a | |
| 366 | proof - | |
| 367 | from prems obtain k where 3: "k < i" "w k = a" | |
| 368 | by auto | |
| 369 | have 4: "w k \<notin> A" | |
| 370 | using not_less_Least 3(1) unfolding i_def . | |
| 371 | show ?thesis | |
| 372 | using prems(1) 3(2) 4 by auto | |
| 373 | qed | |
| 374 | done | |
| 375 | show "w i \<in> A" | |
| 376 | 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 | 377 | qed | 
| 
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 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 380 | |
| 61189 | 381 | 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 | 382 | |
| 61189 | 383 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 384 | 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 | 385 | 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 | 386 | 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 | 387 | of $\omega$-automata. | 
| 61189 | 388 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 389 | |
| 61189 | 390 | definition limit :: "'a word \<Rightarrow> 'a set" | 
| 391 |   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 | 392 | |
| 61189 | 393 | lemma limit_iff_frequent: "a \<in> limit x \<longleftrightarrow> (\<exists>\<^sub>\<infinity>n . x n = a)" | 
| 394 | by (simp add: limit_def) | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 395 | |
| 61189 | 396 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 397 | 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 | 398 | using the reverse image, making the laws about reverse | 
| 61189 | 399 | 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 | 400 | (Might want to change the definition above?) | 
| 61189 | 401 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 402 | |
| 61189 | 403 | lemma limit_vimage: "(a \<in> limit x) = infinite (x -` {a})"
 | 
| 404 | 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 | 405 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 406 | lemma two_in_limit_iff: | 
| 61189 | 407 |   "({a, b} \<subseteq> limit x) =
 | 
| 408 | ((\<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 | 409 | (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 | 410 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 411 | assume lhs: "?lhs" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 412 | 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 | 413 | 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 | 414 | hence 2: "?r2" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 415 | 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 | 416 | hence 3: "?r3" by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 417 | 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 | 418 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 419 | assume "?r1 \<and> ?r2 \<and> ?r3" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 420 | 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 | 421 | 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 | 422 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 423 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 424 | 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 | 425 | proof (induct m) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 426 | 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 | 427 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 428 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 429 | assume ih: "?A m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 430 | 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 | 431 | 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 | 432 | 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 | 433 | 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 | 434 | 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 | 435 | qed | 
| 
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 | 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 | 438 | 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 | 439 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 440 | fix n | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 441 | 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 | 442 | 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 | 443 | 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 | 444 | 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 | 445 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 446 | 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 | 447 | 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 | 448 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 449 | |
| 61189 | 450 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 451 | 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 | 452 | 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 | 453 | contains only letters from its limit set. | 
| 61189 | 454 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 455 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 456 | lemma limit_nonempty: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 457 | assumes fin: "finite (range x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 458 | 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 | 459 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 460 |   from fin obtain a where "a \<in> range x \<and> infinite (x -` {a})"
 | 
| 61189 | 461 | 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 | 462 | hence "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 463 | by (auto simp add: limit_vimage) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 464 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 465 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 466 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 467 | 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 | 468 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 469 | lemma limit_inter_INF: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 470 |   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 | 471 | 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 | 472 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 473 | 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 | 474 | by (auto simp add: limit_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 475 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 476 | by (auto elim: INFM_mono) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 477 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 478 | |
| 61189 | 479 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 480 | The reverse implication is true only if $S$ is finite. | 
| 61189 | 481 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 482 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 483 | lemma INF_limit_inter: | 
| 61189 | 484 | assumes hyp: "\<exists>\<^sub>\<infinity> n. w n \<in> S" | 
| 485 | 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 | 486 | 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 | 487 | proof (rule ccontr) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 488 | 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 | 489 |   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 | 490 | 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 | 491 |   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 | 492 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 493 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 494 |   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 | 495 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 496 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 497 | note hyp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 498 | ultimately show "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 499 | by (simp add: Inf_many_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 500 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 501 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 502 | 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 | 503 | 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 | 504 | |
| 61189 | 505 | 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 | 506 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 507 | fix a | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 508 | assume "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 509 | then obtain l where | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 510 | 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 | 511 | 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 | 512 | 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 | 513 | 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 | 514 | 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 | 515 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 516 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 517 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 518 | 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 | 519 | 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 | 520 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 521 | 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 | 522 | |
| 61189 | 523 | 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 | 524 | 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 | 525 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 526 | theorem limit_is_suffix: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 527 | assumes fin: "finite (range x)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 528 | 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 | 529 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 530 | 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 | 531 | proof - | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 532 | \<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 | 533 | 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 | 534 | by simp | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 535 | \<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 | 536 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 537 |     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 | 538 | by (auto simp add: limit_vimage) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 539 | \<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 | 540 |     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 | 541 | by (blast intro: finite_UN_I) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 542 | \<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 | 543 |     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 | 544 | by (blast dest: finite_nat_bounded) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 545 | \<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 | 546 | 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 | 547 | by (auto simp add: limit_vimage) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 548 | 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 | 549 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 550 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 551 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 552 | 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 | 553 | with limit_in_range_suffix | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 554 | 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 | 555 | by (rule subset_antisym) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 556 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 557 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 558 | |
| 61337 | 559 | 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 | 560 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 561 | |
| 61189 | 562 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 563 | 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 | 564 | to concatenation, suffixes, iteration, and renaming. | 
| 61189 | 565 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 566 | |
| 61189 | 567 | 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 | 568 | proof (auto) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 569 | 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 | 570 | 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 | 571 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 572 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 573 | 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 | 574 | 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 | 575 | 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 | 576 | by (auto simp add: conc_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 577 | 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 | 578 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 579 |   hence "infinite {n . x n = a}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 580 | 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 | 581 | thus "a \<in> limit x" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 582 | 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 | 583 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 584 | 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 | 585 | 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 | 586 | proof (clarify) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 587 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 588 | assume m: "length w < m" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 589 | 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 | 590 | 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 | 591 | 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 | 592 | by (simp add: conc_def, arith) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 593 | 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 | 594 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 595 |   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 | 596 | by (simp add: unbounded_k_infinite) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 597 | 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 | 598 | 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 | 599 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 600 | |
| 61189 | 601 | 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 | 602 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 603 | 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 | 604 | by (simp add: prefix_suffix) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 605 | 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 | 606 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 607 | 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 | 608 | by (rule limit_conc) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 609 | finally show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 610 | by (rule sym) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 611 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 612 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 613 | theorem limit_iter [simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 614 | assumes nempty: "0 < length w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 615 | 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 | 616 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 617 | 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 | 618 | 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 | 619 | 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 | 620 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 621 | 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 | 622 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 623 |   {
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 624 | 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 | 625 | 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 | 626 | by (auto simp add: set_conv_nth) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 627 | \<comment> \<open>the following bound is terrible, but it simplifies the proof\<close> | 
| 61189 | 628 | 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 | 629 | 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 | 630 | moreover | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 631 | \<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 | 632 | 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 | 633 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 634 | fix m | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 635 | 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 | 636 | 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 | 637 | 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 | 638 | 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 | 639 | 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 | 640 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 641 | moreover note nempty | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 642 | 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 | 643 | 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 | 644 | } | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 645 | 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 | 646 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 647 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 648 | lemma limit_o [simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 649 | assumes a: "a \<in> limit w" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 650 | 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 | 651 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 652 | from a | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 653 | 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 | 654 | by (simp add: limit_iff_frequent) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 655 | 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 | 656 | by (rule INFM_mono, simp) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 657 | 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 | 658 | by (simp add: limit_iff_frequent) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 659 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 660 | |
| 61189 | 661 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 662 | 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 | 663 | limit of $f \circ w$ even though $a$ is not in the limit of $w$. | 
| 61585 | 664 | 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 | 665 | 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 | 666 | many elements, some of these must be in the limit of $w$. | 
| 61189 | 667 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 668 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 669 | lemma limit_o_inv: | 
| 61189 | 670 |   assumes fin: "finite (f -` {x})"
 | 
| 671 | 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 | 672 |   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 | 673 | proof (rule ccontr) | 
| 61189 | 674 | assume contra: "\<not> ?thesis" | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 675 | \<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 | 676 |   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 | 677 | by (simp add: limit_def Inf_many_def) | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 678 | \<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 | 679 |   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 | 680 | by auto | 
| 61585 | 681 | \<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 | 682 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 683 |   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 | 684 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 685 | ultimately | 
| 67443 
3abf6a722518
standardized towards new-style formal comments: isabelle update_comments;
 wenzelm parents: 
64593diff
changeset | 686 | \<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 | 687 |   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 | 688 | by simp | 
| 61585 | 689 | \<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 | 690 | with x show "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 691 | 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 | 692 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 693 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 694 | theorem limit_inj [simp]: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 695 | assumes inj: "inj f" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 696 | 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 | 697 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 698 | 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 | 699 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 700 | 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 | 701 | proof | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 702 | fix x | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 703 | 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 | 704 |     from inj have "finite (f -` {x})"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 705 | by (blast intro: finite_vimageI) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 706 |     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 | 707 | by (blast dest: limit_o_inv) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 708 | thus "x \<in> f ` (limit w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 709 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 710 | qed | 
| 
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 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 713 | lemma limit_inter_empty: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 714 | assumes fin: "finite (range w)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 715 |   assumes hyp: "limit w \<inter> S = {}"
 | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 716 | 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 | 717 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 718 | 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 | 719 | using limit_is_suffix by blast | 
| 61189 | 720 | 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 | 721 | 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 | 722 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 723 | 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 | 724 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 725 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 726 | 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 | 727 | 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 | 728 | lemma limit_range_suffix_incr: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 729 | 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 | 730 | assumes "j\<ge>i" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 731 | shows "limit r = range (suffix j r)" | 
| 61189 | 732 | (is "?lhs = ?rhs") | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 733 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 734 | have "?lhs = range (suffix i r)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 735 | using assms by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 736 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 737 | have "\<dots> \<supseteq> ?rhs" using \<open>j\<ge>i\<close> | 
| 61189 | 738 | by (metis (mono_tags, lifting) assms(2) | 
| 739 | 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 | 740 | moreover | 
| 61189 | 741 | 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 | 742 | ultimately | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 743 | show "?lhs = ?rhs" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 744 | 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 | 745 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 746 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 747 | 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 | 748 | 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 | 749 | lemma common_range_limit: | 
| 61189 | 750 | assumes "finite (range x)" | 
| 751 | and "finite (range y)" | |
| 752 | 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 | 753 | 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 | 754 | proof - | 
| 61189 | 755 | 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 | 756 | 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 | 757 | using assms limit_is_suffix by metis | 
| 61189 | 758 | 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 | 759 | 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 | 760 | 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 | 761 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 762 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 763 | using that by metis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 764 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 765 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 766 | |
| 61189 | 767 | 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 | 768 | |
| 61189 | 769 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 770 | 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 | 771 | 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 | 772 | 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 | 773 | the integers: the resulting word is | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 774 | \[ | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 775 |     (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 | 776 | \] | 
| 61189 | 777 | 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 | 778 | indexes. | 
| 61189 | 779 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 780 | |
| 61189 | 781 | 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 | 782 | 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 | 783 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 784 | lemma idx_sequence_less: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 785 | assumes iseq: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 786 | 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 | 787 | proof (induct k) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 788 | 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 | 789 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 790 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 791 | fix k | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 792 | 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 | 793 | 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 | 794 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 795 | 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 | 796 | by (rule less_trans) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 797 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 798 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 799 | lemma idx_sequence_inj: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 800 | assumes iseq: "idx_sequence idx" | 
| 61189 | 801 | 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 | 802 | shows "m = n" | 
| 63112 | 803 | proof (cases m n rule: linorder_cases) | 
| 804 | case greater | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 805 | 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 | 806 | 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 | 807 | 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 | 808 | by (simp add: idx_sequence_less) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 809 | with eq show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 810 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 811 | next | 
| 63112 | 812 | case less | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 813 | 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 | 814 | 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 | 815 | 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 | 816 | by (simp add: idx_sequence_less) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 817 | with eq show ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 818 | by simp | 
| 63112 | 819 | qed | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 820 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 821 | lemma idx_sequence_mono: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 822 | assumes iseq: "idx_sequence idx" | 
| 61189 | 823 | and m: "m \<le> n" | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 824 | shows "idx m \<le> idx n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 825 | proof (cases "m=n") | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 826 | case True | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 827 | thus ?thesis by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 828 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 829 | case False | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 830 | 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 | 831 | 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 | 832 | 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 | 833 | 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 | 834 | by (simp add: idx_sequence_less) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 835 | thus ?thesis by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 836 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 837 | |
| 61189 | 838 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 839 | 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 | 840 | 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 | 841 | is determined uniquely. | 
| 61189 | 842 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 843 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 844 | lemma idx_sequence_idx: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 845 | assumes "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 846 |   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 | 847 | 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 | 848 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 849 | lemma idx_sequence_interval: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 850 | assumes iseq: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 851 |   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 | 852 | (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 | 853 | proof (induct n) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 854 | from iseq have "0 = idx 0" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 855 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 856 | moreover | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 857 |   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 | 858 | by (rule idx_sequence_idx) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 859 | ultimately | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 860 | show "?P 0" by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 861 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 862 | fix n | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 863 | assume "?P n" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 864 | 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 | 865 | show "?P (Suc n)" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 866 | 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 | 867 | case True | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 868 | 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 | 869 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 870 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 871 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 872 | case False | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 873 | 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 | 874 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 875 | 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 | 876 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 877 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 878 | qed | 
| 
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 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 881 | lemma idx_sequence_interval_unique: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 882 | assumes iseq: "idx_sequence idx" | 
| 61189 | 883 |     and k: "n \<in> {idx k ..< idx (Suc k)}"
 | 
| 884 |     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 | 885 | shows "k = m" | 
| 63112 | 886 | proof (cases k m rule: linorder_cases) | 
| 887 | case less | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 888 | 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 | 889 | 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 | 890 | by (rule idx_sequence_mono) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 891 | 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 | 892 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 893 | with k have "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 894 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 895 | thus ?thesis .. | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 896 | next | 
| 63112 | 897 | case greater | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 898 | 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 | 899 | 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 | 900 | by (rule idx_sequence_mono) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 901 | 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 | 902 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 903 | with m have "False" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 904 | by simp | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 905 | thus ?thesis .. | 
| 63112 | 906 | qed | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 907 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 908 | lemma idx_sequence_unique_interval: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 909 | assumes iseq: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 910 |   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 | 911 | proof (rule ex_ex1I) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 912 |   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 | 913 | by (rule idx_sequence_interval) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 914 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 915 | fix k y | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 916 |   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 | 917 | 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 | 918 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 919 | |
| 61189 | 920 | text \<open> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 921 | 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 | 922 | an index sequence. | 
| 61189 | 923 | \<close> | 
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 924 | |
| 61189 | 925 | definition merge :: "'a word word \<Rightarrow> nat word \<Rightarrow> 'a word" | 
| 926 |   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 | 927 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 928 | lemma merge: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 929 | assumes idx: "idx_sequence idx" | 
| 61189 | 930 |     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 | 931 | 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 | 932 | proof - | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 933 |   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 | 934 | 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 | 935 | thus ?thesis | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 936 | 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 | 937 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 938 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 939 | lemma merge0: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 940 | assumes idx: "idx_sequence idx" | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 941 | 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 | 942 | proof (rule merge[OF idx]) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 943 | from idx have "idx 0 < idx (Suc 0)" | 
| 61189 | 944 | 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 | 945 |   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 | 946 | by (simp add: idx_sequence_def) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 947 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 948 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 949 | lemma merge_Suc: | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 950 | assumes idx: "idx_sequence idx" | 
| 61189 | 951 |     and n: "n \<in> {idx i ..< idx (Suc i)}"
 | 
| 952 | shows "merge ws idx (Suc n) = (if Suc n = idx (Suc i) then ws (Suc i) else ws i) (Suc n)" | |
| 953 | proof auto | |
| 61178 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 954 | 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 | 955 | from idx have "idx (Suc i) < idx (Suc(Suc i))" | 
| 61189 | 956 | 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 | 957 | 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 | 958 | by (simp add: merge) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 959 | next | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 960 | 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 | 961 |   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 | 962 | by auto | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 963 | 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 | 964 | by (rule merge) | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 965 | qed | 
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 966 | |
| 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 lammich <lammich@in.tum.de> parents: diff
changeset | 967 | end |