src/HOLCF/FOCUS/Fstream.thy
author huffman
Tue, 01 Jul 2008 02:19:53 +0200
changeset 27413 3154f3765cc7
parent 27148 5b78e50adc49
child 30807 a167ed35ec0d
permissions -rw-r--r--
replace lub (range Y) with (LUB i. Y i)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17293
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
     1
(*  Title:      HOLCF/FOCUS/Fstream.thy
11355
wenzelm
parents: 11350
diff changeset
     2
    ID:         $Id$
17293
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
     3
    Author:     David von Oheimb, TU Muenchen
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
     4
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
     5
FOCUS streams (with lifted elements)
15188
9d57263faf9e integrated Streams with ex/Stream.*; added FOCUS/Fstreams.thy
oheimb
parents: 14981
diff changeset
     6
###TODO: integrate Fstreams.thy
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
     7
*)
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
     8
17293
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
     9
header {* FOCUS flat streams *}
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    10
17293
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
    11
theory Fstream
24107
fecafd71e758 proper path specifications;
wenzelm
parents: 21404
diff changeset
    12
imports "../ex/Stream"
17293
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
    13
begin
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    14
17293
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
    15
defaultsort type
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
    16
ecf182ccc3ca converted to Isar theory format;
wenzelm
parents: 15188
diff changeset
    17
types 'a fstream = "'a lift stream"
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    18
19763
wenzelm
parents: 19759
diff changeset
    19
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    20
  fscons        :: "'a     \<Rightarrow> 'a fstream \<rightarrow> 'a fstream" where
19763
wenzelm
parents: 19759
diff changeset
    21
  "fscons a = (\<Lambda> s. Def a && s)"
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    22
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    23
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    24
  fsfilter      :: "'a set \<Rightarrow> 'a fstream \<rightarrow> 'a fstream" where
19763
wenzelm
parents: 19759
diff changeset
    25
  "fsfilter A = (sfilter\<cdot>(flift2 (\<lambda>x. x\<in>A)))"
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    26
19763
wenzelm
parents: 19759
diff changeset
    27
abbreviation
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    28
  emptystream   :: "'a fstream"                          ("<>") where
19763
wenzelm
parents: 19759
diff changeset
    29
  "<> == \<bottom>"
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    30
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    31
abbreviation
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    32
  fscons'       :: "'a \<Rightarrow> 'a fstream \<Rightarrow> 'a fstream"       ("(_~>_)"    [66,65] 65) where
19763
wenzelm
parents: 19759
diff changeset
    33
  "a~>s == fscons a\<cdot>s"
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    34
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    35
abbreviation
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    36
  fsfilter'     :: "'a set \<Rightarrow> 'a fstream \<Rightarrow> 'a fstream"   ("(_'(C')_)" [64,63] 63) where
19763
wenzelm
parents: 19759
diff changeset
    37
  "A(C)s == fsfilter A\<cdot>s"
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    38
21210
c17fd2df4e9e renamed 'const_syntax' to 'notation';
wenzelm
parents: 19764
diff changeset
    39
notation (xsymbols)
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 21210
diff changeset
    40
  fscons'  ("(_\<leadsto>_)"                                                 [66,65] 65) and
19763
wenzelm
parents: 19759
diff changeset
    41
  fsfilter'  ("(_\<copyright>_)"                                               [64,63] 63)
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    42
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
    43
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    44
lemma Def_maximal: "a = Def d \<Longrightarrow> a\<sqsubseteq>b \<Longrightarrow> b = Def d"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    45
apply (rule flat_eq [THEN iffD1, symmetric])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    46
apply (rule Def_not_UU)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    47
apply (drule antisym_less_inverse)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    48
apply (erule (1) conjunct2 [THEN trans_less])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    49
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    50
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    51
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    52
section "fscons"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    53
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    54
lemma fscons_def2: "a~>s = Def a && s"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    55
apply (unfold fscons_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    56
apply (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    57
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    58
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    59
lemma fstream_exhaust: "x = UU |  (? a y. x = a~> y)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    60
apply (simp add: fscons_def2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    61
apply (cut_tac stream.exhaust)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    62
apply (fast dest: not_Undef_is_Def [THEN iffD1])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    63
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    64
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    65
lemma fstream_cases: "[| x = UU ==> P; !!a y. x = a~> y ==> P |] ==> P"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    66
apply (cut_tac fstream_exhaust)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    67
apply (erule disjE)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    68
apply fast
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    69
apply fast
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    70
done
27148
5b78e50adc49 removed dead code;
wenzelm
parents: 25922
diff changeset
    71
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    72
lemma fstream_exhaust_eq: "(x ~= UU) = (? a y. x = a~> y)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    73
apply (simp add: fscons_def2 stream_exhaust_eq)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    74
apply (fast dest: not_Undef_is_Def [THEN iffD1] elim: DefE)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    75
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    76
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    77
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    78
lemma fscons_not_empty [simp]: "a~> s ~= <>"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    79
by (simp add: fscons_def2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    80
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    81
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    82
lemma fscons_inject [simp]: "(a~> s = b~> t) = (a = b &  s = t)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    83
by (simp add: fscons_def2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    84
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    85
lemma fstream_prefix: "a~> s << t ==> ? tt. t = a~> tt &  s << tt"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    86
apply (rule_tac x="t" in stream.casedist)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    87
apply (cut_tac fscons_not_empty)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    88
apply (fast dest: eq_UU_iff [THEN iffD2])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    89
apply (simp add: fscons_def2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    90
apply (drule stream_flat_prefix)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    91
apply (rule Def_not_UU)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    92
apply (fast)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    93
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    94
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    95
lemma fstream_prefix' [simp]:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    96
        "x << a~> z = (x = <> |  (? y. x = a~> y &  y << z))"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    97
apply (simp add: fscons_def2 Def_not_UU [THEN stream_prefix'])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    98
apply (safe)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
    99
apply (erule_tac [!] contrapos_np)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   100
prefer 2 apply (fast elim: DefE)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   101
apply (rule Lift_cases)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   102
apply (erule (1) notE)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   103
apply (safe)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   104
apply (drule Def_inject_less_eq [THEN iffD1])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   105
apply fast
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   106
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   107
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   108
(* ------------------------------------------------------------------------- *)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   109
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   110
section "ft & rt"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   111
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   112
lemmas ft_empty = stream.sel_rews (1)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   113
lemma ft_fscons [simp]: "ft\<cdot>(m~> s) = Def m"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   114
by (simp add: fscons_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   115
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   116
lemmas rt_empty = stream.sel_rews (2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   117
lemma rt_fscons [simp]: "rt\<cdot>(m~> s) = s"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   118
by (simp add: fscons_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   119
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   120
lemma ft_eq [simp]: "(ft\<cdot>s = Def a) = (? t. s = a~> t)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   121
apply (unfold fscons_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   122
apply (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   123
apply (safe)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   124
apply (erule subst)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   125
apply (rule exI)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   126
apply (rule surjectiv_scons [symmetric])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   127
apply (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   128
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   129
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   130
lemma surjective_fscons_lemma: "(d\<leadsto>y = x) = (ft\<cdot>x = Def d & rt\<cdot>x = y)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   131
by auto
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   132
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   133
lemma surjective_fscons: "ft\<cdot>x = Def d \<Longrightarrow> d\<leadsto>rt\<cdot>x = x"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   134
by (simp add: surjective_fscons_lemma)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   135
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   136
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   137
(* ------------------------------------------------------------------------- *)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   138
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   139
section "take"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   140
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   141
lemma fstream_take_Suc [simp]:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   142
        "stream_take (Suc n)\<cdot>(a~> s) = a~> stream_take n\<cdot>s"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   143
by (simp add: fscons_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   144
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   145
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   146
(* ------------------------------------------------------------------------- *)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   147
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   148
section "slen"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   149
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   150
lemma slen_fscons: "#(m~> s) = iSuc (#s)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   151
by (simp add: fscons_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   152
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   153
lemma slen_fscons_eq:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   154
        "(Fin (Suc n) < #x) = (? a y. x = a~> y & Fin n < #y)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   155
apply (simp add: fscons_def2 slen_scons_eq)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   156
apply (fast dest: not_Undef_is_Def [THEN iffD1] elim: DefE)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   157
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   158
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   159
lemma slen_fscons_eq_rev:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   160
        "(#x < Fin (Suc (Suc n))) = (!a y. x ~= a~> y | #y < Fin (Suc n))"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   161
apply (simp add: fscons_def2 slen_scons_eq_rev)
19764
372065f34795 removed obsolete ML files;
wenzelm
parents: 19763
diff changeset
   162
apply (tactic {* step_tac (HOL_cs addSEs [thm "DefE"]) 1 *})
372065f34795 removed obsolete ML files;
wenzelm
parents: 19763
diff changeset
   163
apply (tactic {* step_tac (HOL_cs addSEs [thm "DefE"]) 1 *})
372065f34795 removed obsolete ML files;
wenzelm
parents: 19763
diff changeset
   164
apply (tactic {* step_tac (HOL_cs addSEs [thm "DefE"]) 1 *})
372065f34795 removed obsolete ML files;
wenzelm
parents: 19763
diff changeset
   165
apply (tactic {* step_tac (HOL_cs addSEs [thm "DefE"]) 1 *})
372065f34795 removed obsolete ML files;
wenzelm
parents: 19763
diff changeset
   166
apply (tactic {* step_tac (HOL_cs addSEs [thm "DefE"]) 1 *})
372065f34795 removed obsolete ML files;
wenzelm
parents: 19763
diff changeset
   167
apply (tactic {* step_tac (HOL_cs addSEs [thm "DefE"]) 1 *})
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   168
apply (erule contrapos_np)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   169
apply (fast dest: not_Undef_is_Def [THEN iffD1] elim: DefE)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   170
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   171
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   172
lemma slen_fscons_less_eq:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   173
        "(#(a~> y) < Fin (Suc (Suc n))) = (#y < Fin (Suc n))"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   174
apply (subst slen_fscons_eq_rev)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   175
apply (fast dest!: fscons_inject [THEN iffD1])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   176
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   177
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   178
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   179
(* ------------------------------------------------------------------------- *)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   180
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   181
section "induction"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   182
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   183
lemma fstream_ind:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   184
        "[| adm P; P <>; !!a s. P s ==> P (a~> s) |] ==> P x"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   185
apply (erule stream.ind)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   186
apply (assumption)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   187
apply (unfold fscons_def2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   188
apply (fast dest: not_Undef_is_Def [THEN iffD1])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   189
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   190
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   191
lemma fstream_ind2:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   192
  "[| adm P; P UU; !!a. P (a~> UU); !!a b s. P s ==> P (a~> b~> s) |] ==> P x"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   193
apply (erule stream_ind2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   194
apply (assumption)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   195
apply (unfold fscons_def2)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   196
apply (fast dest: not_Undef_is_Def [THEN iffD1])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   197
apply (fast dest: not_Undef_is_Def [THEN iffD1])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   198
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   199
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   200
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   201
(* ------------------------------------------------------------------------- *)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   202
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   203
section "fsfilter"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   204
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   205
lemma fsfilter_empty: "A(C)UU = UU"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   206
apply (unfold fsfilter_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   207
apply (rule sfilter_empty)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   208
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   209
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   210
lemma fsfilter_fscons:
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   211
        "A(C)x~> xs = (if x:A then x~> (A(C)xs) else A(C)xs)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   212
apply (unfold fsfilter_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   213
apply (simp add: fscons_def2 sfilter_scons If_and_if)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   214
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   215
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   216
lemma fsfilter_emptys: "{}(C)x = UU"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   217
apply (rule_tac x="x" in fstream_ind)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   218
apply (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   219
apply (rule fsfilter_empty)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   220
apply (simp add: fsfilter_fscons)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   221
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   222
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   223
lemma fsfilter_insert: "(insert a A)(C)a~> x = a~> ((insert a A)(C)x)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   224
by (simp add: fsfilter_fscons)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   225
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   226
lemma fsfilter_single_in: "{a}(C)a~> x = a~> ({a}(C)x)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   227
by (rule fsfilter_insert)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   228
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   229
lemma fsfilter_single_out: "b ~= a ==> {a}(C)b~> x = ({a}(C)x)"
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   230
by (simp add: fsfilter_fscons)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   231
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   232
lemma fstream_lub_lemma1:
27413
3154f3765cc7 replace lub (range Y) with (LUB i. Y i)
huffman
parents: 27148
diff changeset
   233
    "\<lbrakk>chain Y; (\<Squnion>i. Y i) = a\<leadsto>s\<rbrakk> \<Longrightarrow> \<exists>j t. Y j = a\<leadsto>t"
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   234
apply (case_tac "max_in_chain i Y")
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   235
apply  (drule (1) lub_finch1 [THEN thelubI, THEN sym])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   236
apply  (force)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   237
apply (unfold max_in_chain_def)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   238
apply auto
25922
cb04d05e95fb rename lemma chain_mono3 -> chain_mono, chain_mono -> chain_mono_less
huffman
parents: 24327
diff changeset
   239
apply (frule (1) chain_mono)
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   240
apply (rule_tac x="Y j" in fstream_cases)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   241
apply  (force)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   242
apply (drule_tac x="j" in is_ub_thelub)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   243
apply (force)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   244
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   245
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   246
lemma fstream_lub_lemma:
27413
3154f3765cc7 replace lub (range Y) with (LUB i. Y i)
huffman
parents: 27148
diff changeset
   247
      "\<lbrakk>chain Y; (\<Squnion>i. Y i) = a\<leadsto>s\<rbrakk> \<Longrightarrow> (\<exists>j t. Y j = a\<leadsto>t) & (\<exists>X. chain X & (!i. ? j. Y j = a\<leadsto>X i) & (\<Squnion>i. X i) = s)"
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   248
apply (frule (1) fstream_lub_lemma1)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   249
apply (clarsimp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   250
apply (rule_tac x="%i. rt\<cdot>(Y(i+j))" in exI)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   251
apply (rule conjI)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   252
apply  (erule chain_shift [THEN chain_monofun])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   253
apply safe
25922
cb04d05e95fb rename lemma chain_mono3 -> chain_mono, chain_mono -> chain_mono_less
huffman
parents: 24327
diff changeset
   254
apply  (drule_tac i="j" and j="i+j" in chain_mono)
19759
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   255
apply   (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   256
apply  (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   257
apply  (rule_tac x="i+j" in exI)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   258
apply  (drule fstream_prefix)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   259
apply  (clarsimp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   260
apply  (subst contlub_cfun [symmetric])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   261
apply   (rule chainI)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   262
apply   (fast)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   263
apply  (erule chain_shift)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   264
apply (subst lub_const [THEN thelubI])
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   265
apply (subst lub_range_shift)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   266
apply  (assumption)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   267
apply (simp)
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   268
done
2d0896653e7a removed legacy ML scripts
huffman
parents: 17293
diff changeset
   269
11350
4c55b020d6ee added FOCUS including the One-Element Buffer by Manfred Broy
oheimb
parents:
diff changeset
   270
end