| author | wenzelm | 
| Mon, 05 Sep 2022 20:22:13 +0200 | |
| changeset 76063 | 24c9f56aa035 | 
| parent 69597 | ff784d5a5bfb | 
| child 76231 | 8a48e18f081e | 
| permissions | -rw-r--r-- | 
| 61189 | 1  | 
(*  | 
2  | 
Author: Stefan Merz  | 
|
3  | 
Author: Salomon Sickert  | 
|
4  | 
Author: Julian Brunner  | 
|
5  | 
Author: Peter Lammich  | 
|
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
6  | 
*)  | 
| 61189 | 7  | 
|
8  | 
section \<open>$\omega$-words\<close>  | 
|
9  | 
||
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
10  | 
theory Omega_Words_Fun  | 
| 61189 | 11  | 
|
12  | 
imports Infinite_Set  | 
|
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
13  | 
begin  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
14  | 
|
| 61189 | 15  | 
text \<open>Note: This theory is based on Stefan Merz's work.\<close>  | 
16  | 
||
17  | 
text \<open>  | 
|
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
18  | 
Automata recognize languages, which are sets of words. For the  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
19  | 
theory of $\omega$-automata, we are mostly interested in  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
20  | 
$\omega$-words, but it is sometimes useful to reason about  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
21  | 
finite words, too. We are modeling finite words as lists; this  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
22  | 
lets us benefit from the existing library. Other formalizations  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
23  | 
could be investigated, such as representing words as functions  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
24  | 
whose domains are initial intervals of the natural numbers.  | 
| 61189 | 25  | 
\<close>  | 
26  | 
||
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
27  | 
|
| 61189 | 28  | 
subsection \<open>Type declaration and elementary operations\<close>  | 
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
29  | 
|
| 61189 | 30  | 
text \<open>  | 
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
31  | 
We represent $\omega$-words as functions from the natural numbers  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
32  | 
to the alphabet type. Other possible formalizations include  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
33  | 
a coinductive definition or a uniform encoding of finite and  | 
| 76063 | 34  | 
infinite words, as studied by Müller et al.  | 
| 61189 | 35  | 
\<close>  | 
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
36  | 
|
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
37  | 
type_synonym  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
38  | 
'a word = "nat \<Rightarrow> 'a"  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
39  | 
|
| 61189 | 40  | 
text \<open>  | 
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
41  | 
We can prefix a finite word to an $\omega$-word, and a way  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
42  | 
to obtain an $\omega$-word from a finite, non-empty word is by  | 
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
43  | 
$\omega$-iteration.  | 
| 61189 | 44  | 
\<close>  | 
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
45  | 
|
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
46  | 
definition  | 
| 69597 | 47  | 
conc :: "['a list, 'a word] \<Rightarrow> 'a word" (infixr \<open>\<frown>\<close> 65)  | 
| 61384 | 48  | 
where "w \<frown> x == \<lambda>n. if n < length w then w!n else x (n - length w)"  | 
| 
61178
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
49  | 
|
| 
 
0b071f72f330
Omega_Words_Fun: Infinite words as functions from nat.
 
lammich <lammich@in.tum.de> 
parents:  
diff
changeset
 | 
50  | 
definition  | 
| 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: 
64593 
diff
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: 
64593 
diff
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: 
64593 
diff
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: 
64593 
diff
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: 
64593 
diff
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: 
64593 
diff
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: 
63112 
diff
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: 
64593 
diff
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: 
64593 
diff
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: 
64593 
diff
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: 
64593 
diff
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  |