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