src/HOL/HOLCF/IOA/meta_theory/Sequence.thy
changeset 62001 1f2788fb0b8b
parent 62000 8cba509ace9c
child 62002 f1599e98c4d0
equal deleted inserted replaced
62000:8cba509ace9c 62001:1f2788fb0b8b
    25   Flat             ::"('a Seq) seq   -> 'a Seq"
    25   Flat             ::"('a Seq) seq   -> 'a Seq"
    26 
    26 
    27   Filter2          ::"('a => bool)  => 'a Seq -> 'a Seq"
    27   Filter2          ::"('a => bool)  => 'a Seq -> 'a Seq"
    28 
    28 
    29 abbreviation
    29 abbreviation
    30   Consq_syn  ("(_/>>_)"  [66,65] 65) where
    30   Consq_syn  ("(_/\<leadsto>_)"  [66,65] 65) where
    31   "a>>s == Consq a$s"
    31   "a\<leadsto>s == Consq a$s"
    32 
       
    33 notation (xsymbols)
       
    34   Consq_syn  ("(_\<leadsto>_)"  [66,65] 65)
       
    35 
    32 
    36 
    33 
    37 (* list Enumeration *)
    34 (* list Enumeration *)
    38 syntax
    35 syntax
    39   "_totlist"      :: "args => 'a Seq"              ("[(_)!]")
    36   "_totlist"      :: "args => 'a Seq"              ("[(_)!]")
    40   "_partlist"     :: "args => 'a Seq"              ("[(_)?]")
    37   "_partlist"     :: "args => 'a Seq"              ("[(_)?]")
    41 translations
    38 translations
    42   "[x, xs!]"     == "x>>[xs!]"
    39   "[x, xs!]"     == "x\<leadsto>[xs!]"
    43   "[x!]"         == "x>>nil"
    40   "[x!]"         == "x\<leadsto>nil"
    44   "[x, xs?]"     == "x>>[xs?]"
    41   "[x, xs?]"     == "x\<leadsto>[xs?]"
    45   "[x?]"         == "x>>CONST bottom"
    42   "[x?]"         == "x\<leadsto>CONST bottom"
    46 
    43 
    47 defs
    44 defs
    48 
    45 
    49 Consq_def:     "Consq a == LAM s. Def a ## s"
    46 Consq_def:     "Consq a == LAM s. Def a ## s"
    50 
    47 
    90 by (simp add: Map_def)
    87 by (simp add: Map_def)
    91 
    88 
    92 lemma Map_nil: "Map f$nil =nil"
    89 lemma Map_nil: "Map f$nil =nil"
    93 by (simp add: Map_def)
    90 by (simp add: Map_def)
    94 
    91 
    95 lemma Map_cons: "Map f$(x>>xs)=(f x) >> Map f$xs"
    92 lemma Map_cons: "Map f$(x\<leadsto>xs)=(f x) \<leadsto> Map f$xs"
    96 by (simp add: Map_def Consq_def flift2_def)
    93 by (simp add: Map_def Consq_def flift2_def)
    97 
    94 
    98 
    95 
    99 subsubsection {* Filter *}
    96 subsubsection {* Filter *}
   100 
    97 
   103 
   100 
   104 lemma Filter_nil: "Filter P$nil =nil"
   101 lemma Filter_nil: "Filter P$nil =nil"
   105 by (simp add: Filter_def)
   102 by (simp add: Filter_def)
   106 
   103 
   107 lemma Filter_cons:
   104 lemma Filter_cons:
   108   "Filter P$(x>>xs)= (if P x then x>>(Filter P$xs) else Filter P$xs)"
   105   "Filter P$(x\<leadsto>xs)= (if P x then x\<leadsto>(Filter P$xs) else Filter P$xs)"
   109 by (simp add: Filter_def Consq_def flift2_def If_and_if)
   106 by (simp add: Filter_def Consq_def flift2_def If_and_if)
   110 
   107 
   111 
   108 
   112 subsubsection {* Forall *}
   109 subsubsection {* Forall *}
   113 
   110 
   115 by (simp add: Forall_def sforall_def)
   112 by (simp add: Forall_def sforall_def)
   116 
   113 
   117 lemma Forall_nil: "Forall P nil"
   114 lemma Forall_nil: "Forall P nil"
   118 by (simp add: Forall_def sforall_def)
   115 by (simp add: Forall_def sforall_def)
   119 
   116 
   120 lemma Forall_cons: "Forall P (x>>xs)= (P x & Forall P xs)"
   117 lemma Forall_cons: "Forall P (x\<leadsto>xs)= (P x & Forall P xs)"
   121 by (simp add: Forall_def sforall_def Consq_def flift2_def)
   118 by (simp add: Forall_def sforall_def Consq_def flift2_def)
   122 
   119 
   123 
   120 
   124 subsubsection {* Conc *}
   121 subsubsection {* Conc *}
   125 
   122 
   126 lemma Conc_cons: "(x>>xs) @@ y = x>>(xs @@y)"
   123 lemma Conc_cons: "(x\<leadsto>xs) @@ y = x\<leadsto>(xs @@y)"
   127 by (simp add: Consq_def)
   124 by (simp add: Consq_def)
   128 
   125 
   129 
   126 
   130 subsubsection {* Takewhile *}
   127 subsubsection {* Takewhile *}
   131 
   128 
   134 
   131 
   135 lemma Takewhile_nil: "Takewhile P$nil =nil"
   132 lemma Takewhile_nil: "Takewhile P$nil =nil"
   136 by (simp add: Takewhile_def)
   133 by (simp add: Takewhile_def)
   137 
   134 
   138 lemma Takewhile_cons:
   135 lemma Takewhile_cons:
   139   "Takewhile P$(x>>xs)= (if P x then x>>(Takewhile P$xs) else nil)"
   136   "Takewhile P$(x\<leadsto>xs)= (if P x then x\<leadsto>(Takewhile P$xs) else nil)"
   140 by (simp add: Takewhile_def Consq_def flift2_def If_and_if)
   137 by (simp add: Takewhile_def Consq_def flift2_def If_and_if)
   141 
   138 
   142 
   139 
   143 subsubsection {* DropWhile *}
   140 subsubsection {* DropWhile *}
   144 
   141 
   147 
   144 
   148 lemma Dropwhile_nil: "Dropwhile P$nil =nil"
   145 lemma Dropwhile_nil: "Dropwhile P$nil =nil"
   149 by (simp add: Dropwhile_def)
   146 by (simp add: Dropwhile_def)
   150 
   147 
   151 lemma Dropwhile_cons:
   148 lemma Dropwhile_cons:
   152   "Dropwhile P$(x>>xs)= (if P x then Dropwhile P$xs else x>>xs)"
   149   "Dropwhile P$(x\<leadsto>xs)= (if P x then Dropwhile P$xs else x\<leadsto>xs)"
   153 by (simp add: Dropwhile_def Consq_def flift2_def If_and_if)
   150 by (simp add: Dropwhile_def Consq_def flift2_def If_and_if)
   154 
   151 
   155 
   152 
   156 subsubsection {* Last *}
   153 subsubsection {* Last *}
   157 
   154 
   159 by (simp add: Last_def)
   156 by (simp add: Last_def)
   160 
   157 
   161 lemma Last_nil: "Last$nil =UU"
   158 lemma Last_nil: "Last$nil =UU"
   162 by (simp add: Last_def)
   159 by (simp add: Last_def)
   163 
   160 
   164 lemma Last_cons: "Last$(x>>xs)= (if xs=nil then Def x else Last$xs)"
   161 lemma Last_cons: "Last$(x\<leadsto>xs)= (if xs=nil then Def x else Last$xs)"
   165 apply (simp add: Last_def Consq_def)
   162 apply (simp add: Last_def Consq_def)
   166 apply (cases xs)
   163 apply (cases xs)
   167 apply simp_all
   164 apply simp_all
   168 done
   165 done
   169 
   166 
   214 lemma Zip_nil: "Zip$nil$y =nil"
   211 lemma Zip_nil: "Zip$nil$y =nil"
   215 apply (subst Zip_unfold)
   212 apply (subst Zip_unfold)
   216 apply simp
   213 apply simp
   217 done
   214 done
   218 
   215 
   219 lemma Zip_cons_nil: "Zip$(x>>xs)$nil= UU"
   216 lemma Zip_cons_nil: "Zip$(x\<leadsto>xs)$nil= UU"
   220 apply (subst Zip_unfold)
   217 apply (subst Zip_unfold)
   221 apply (simp add: Consq_def)
   218 apply (simp add: Consq_def)
   222 done
   219 done
   223 
   220 
   224 lemma Zip_cons: "Zip$(x>>xs)$(y>>ys)= (x,y) >> Zip$xs$ys"
   221 lemma Zip_cons: "Zip$(x\<leadsto>xs)$(y\<leadsto>ys)= (x,y) \<leadsto> Zip$xs$ys"
   225 apply (rule trans)
   222 apply (rule trans)
   226 apply (subst Zip_unfold)
   223 apply (subst Zip_unfold)
   227 apply simp
   224 apply simp
   228 apply (simp add: Consq_def)
   225 apply (simp add: Consq_def)
   229 done
   226 done
   250 
   247 
   251 
   248 
   252 
   249 
   253 section "Cons"
   250 section "Cons"
   254 
   251 
   255 lemma Consq_def2: "a>>s = (Def a)##s"
   252 lemma Consq_def2: "a\<leadsto>s = (Def a)##s"
   256 apply (simp add: Consq_def)
   253 apply (simp add: Consq_def)
   257 done
   254 done
   258 
   255 
   259 lemma Seq_exhaust: "x = UU | x = nil | (? a s. x = a >> s)"
   256 lemma Seq_exhaust: "x = UU | x = nil | (? a s. x = a \<leadsto> s)"
   260 apply (simp add: Consq_def2)
   257 apply (simp add: Consq_def2)
   261 apply (cut_tac seq.nchotomy)
   258 apply (cut_tac seq.nchotomy)
   262 apply (fast dest: not_Undef_is_Def [THEN iffD1])
   259 apply (fast dest: not_Undef_is_Def [THEN iffD1])
   263 done
   260 done
   264 
   261 
   265 
   262 
   266 lemma Seq_cases:
   263 lemma Seq_cases:
   267 "!!P. [| x = UU ==> P; x = nil ==> P; !!a s. x = a >> s  ==> P |] ==> P"
   264 "!!P. [| x = UU ==> P; x = nil ==> P; !!a s. x = a \<leadsto> s  ==> P |] ==> P"
   268 apply (cut_tac x="x" in Seq_exhaust)
   265 apply (cut_tac x="x" in Seq_exhaust)
   269 apply (erule disjE)
   266 apply (erule disjE)
   270 apply simp
   267 apply simp
   271 apply (erule disjE)
   268 apply (erule disjE)
   272 apply simp
   269 apply simp
   276 
   273 
   277 (*
   274 (*
   278 fun Seq_case_tac s i = rule_tac x",s)] Seq_cases i
   275 fun Seq_case_tac s i = rule_tac x",s)] Seq_cases i
   279           THEN hyp_subst_tac i THEN hyp_subst_tac (i+1) THEN hyp_subst_tac (i+2);
   276           THEN hyp_subst_tac i THEN hyp_subst_tac (i+1) THEN hyp_subst_tac (i+2);
   280 *)
   277 *)
   281 (* on a>>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *)
   278 (* on a\<leadsto>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *)
   282 (*
   279 (*
   283 fun Seq_case_simp_tac s i = Seq_case_tac s i THEN Asm_simp_tac (i+2)
   280 fun Seq_case_simp_tac s i = Seq_case_tac s i THEN Asm_simp_tac (i+2)
   284                                              THEN Asm_full_simp_tac (i+1)
   281                                              THEN Asm_full_simp_tac (i+1)
   285                                              THEN Asm_full_simp_tac i;
   282                                              THEN Asm_full_simp_tac i;
   286 *)
   283 *)
   287 
   284 
   288 lemma Cons_not_UU: "a>>s ~= UU"
   285 lemma Cons_not_UU: "a\<leadsto>s ~= UU"
   289 apply (subst Consq_def2)
   286 apply (subst Consq_def2)
   290 apply simp
   287 apply simp
   291 done
   288 done
   292 
   289 
   293 
   290 
   294 lemma Cons_not_less_UU: "~(a>>x) << UU"
   291 lemma Cons_not_less_UU: "~(a\<leadsto>x) << UU"
   295 apply (rule notI)
   292 apply (rule notI)
   296 apply (drule below_antisym)
   293 apply (drule below_antisym)
   297 apply simp
   294 apply simp
   298 apply (simp add: Cons_not_UU)
   295 apply (simp add: Cons_not_UU)
   299 done
   296 done
   300 
   297 
   301 lemma Cons_not_less_nil: "~a>>s << nil"
   298 lemma Cons_not_less_nil: "~a\<leadsto>s << nil"
   302 apply (simp add: Consq_def2)
   299 apply (simp add: Consq_def2)
   303 done
   300 done
   304 
   301 
   305 lemma Cons_not_nil: "a>>s ~= nil"
   302 lemma Cons_not_nil: "a\<leadsto>s ~= nil"
   306 apply (simp add: Consq_def2)
   303 apply (simp add: Consq_def2)
   307 done
   304 done
   308 
   305 
   309 lemma Cons_not_nil2: "nil ~= a>>s"
   306 lemma Cons_not_nil2: "nil ~= a\<leadsto>s"
   310 apply (simp add: Consq_def2)
   307 apply (simp add: Consq_def2)
   311 done
   308 done
   312 
   309 
   313 lemma Cons_inject_eq: "(a>>s = b>>t) = (a = b & s = t)"
   310 lemma Cons_inject_eq: "(a\<leadsto>s = b\<leadsto>t) = (a = b & s = t)"
   314 apply (simp only: Consq_def2)
   311 apply (simp only: Consq_def2)
   315 apply (simp add: scons_inject_eq)
   312 apply (simp add: scons_inject_eq)
   316 done
   313 done
   317 
   314 
   318 lemma Cons_inject_less_eq: "(a>>s<<b>>t) = (a = b & s<<t)"
   315 lemma Cons_inject_less_eq: "(a\<leadsto>s<<b\<leadsto>t) = (a = b & s<<t)"
   319 apply (simp add: Consq_def2)
   316 apply (simp add: Consq_def2)
   320 done
   317 done
   321 
   318 
   322 lemma seq_take_Cons: "seq_take (Suc n)$(a>>x) = a>> (seq_take n$x)"
   319 lemma seq_take_Cons: "seq_take (Suc n)$(a\<leadsto>x) = a\<leadsto> (seq_take n$x)"
   323 apply (simp add: Consq_def)
   320 apply (simp add: Consq_def)
   324 done
   321 done
   325 
   322 
   326 lemmas [simp] =
   323 lemmas [simp] =
   327   Cons_not_nil2 Cons_inject_eq Cons_inject_less_eq seq_take_Cons
   324   Cons_not_nil2 Cons_inject_eq Cons_inject_less_eq seq_take_Cons
   329 
   326 
   330 
   327 
   331 subsection "induction"
   328 subsection "induction"
   332 
   329 
   333 lemma Seq_induct:
   330 lemma Seq_induct:
   334 "!! P. [| adm P; P UU; P nil; !! a s. P s ==> P (a>>s)|] ==> P x"
   331 "!! P. [| adm P; P UU; P nil; !! a s. P s ==> P (a\<leadsto>s)|] ==> P x"
   335 apply (erule (2) seq.induct)
   332 apply (erule (2) seq.induct)
   336 apply defined
   333 apply defined
   337 apply (simp add: Consq_def)
   334 apply (simp add: Consq_def)
   338 done
   335 done
   339 
   336 
   340 lemma Seq_FinitePartial_ind:
   337 lemma Seq_FinitePartial_ind:
   341 "!! P.[|P UU;P nil; !! a s. P s ==> P(a>>s) |]
   338 "!! P.[|P UU;P nil; !! a s. P s ==> P(a\<leadsto>s) |]
   342                 ==> seq_finite x --> P x"
   339                 ==> seq_finite x --> P x"
   343 apply (erule (1) seq_finite_ind)
   340 apply (erule (1) seq_finite_ind)
   344 apply defined
   341 apply defined
   345 apply (simp add: Consq_def)
   342 apply (simp add: Consq_def)
   346 done
   343 done
   347 
   344 
   348 lemma Seq_Finite_ind:
   345 lemma Seq_Finite_ind:
   349 "!! P.[| Finite x; P nil; !! a s. [| Finite s; P s|] ==> P (a>>s) |] ==> P x"
   346 "!! P.[| Finite x; P nil; !! a s. [| Finite s; P s|] ==> P (a\<leadsto>s) |] ==> P x"
   350 apply (erule (1) Finite.induct)
   347 apply (erule (1) Finite.induct)
   351 apply defined
   348 apply defined
   352 apply (simp add: Consq_def)
   349 apply (simp add: Consq_def)
   353 done
   350 done
   354 
   351 
   377 
   374 
   378 (* ------------------------------------------------------------------------------------ *)
   375 (* ------------------------------------------------------------------------------------ *)
   379 
   376 
   380 subsection "HD,TL"
   377 subsection "HD,TL"
   381 
   378 
   382 lemma HD_Cons [simp]: "HD$(x>>y) = Def x"
   379 lemma HD_Cons [simp]: "HD$(x\<leadsto>y) = Def x"
   383 apply (simp add: Consq_def)
   380 apply (simp add: Consq_def)
   384 done
   381 done
   385 
   382 
   386 lemma TL_Cons [simp]: "TL$(x>>y) = y"
   383 lemma TL_Cons [simp]: "TL$(x\<leadsto>y) = y"
   387 apply (simp add: Consq_def)
   384 apply (simp add: Consq_def)
   388 done
   385 done
   389 
   386 
   390 (* ------------------------------------------------------------------------------------ *)
   387 (* ------------------------------------------------------------------------------------ *)
   391 
   388 
   392 subsection "Finite, Partial, Infinite"
   389 subsection "Finite, Partial, Infinite"
   393 
   390 
   394 lemma Finite_Cons [simp]: "Finite (a>>xs) = Finite xs"
   391 lemma Finite_Cons [simp]: "Finite (a\<leadsto>xs) = Finite xs"
   395 apply (simp add: Consq_def2 Finite_cons)
   392 apply (simp add: Consq_def2 Finite_cons)
   396 done
   393 done
   397 
   394 
   398 lemma FiniteConc_1: "Finite (x::'a Seq) ==> Finite y --> Finite (x@@y)"
   395 lemma FiniteConc_1: "Finite (x::'a Seq) ==> Finite y --> Finite (x@@y)"
   399 apply (erule Seq_Finite_ind, simp_all)
   396 apply (erule Seq_Finite_ind, simp_all)
   790 subsection "coinductive characterizations of Filter"
   787 subsection "coinductive characterizations of Filter"
   791 
   788 
   792 
   789 
   793 lemma divide_Seq_lemma:
   790 lemma divide_Seq_lemma:
   794  "HD$(Filter P$y) = Def x
   791  "HD$(Filter P$y) = Def x
   795     --> y = ((Takewhile (%x. ~P x)$y) @@ (x >> TL$(Dropwhile (%a. ~P a)$y)))
   792     --> y = ((Takewhile (%x. ~P x)$y) @@ (x \<leadsto> TL$(Dropwhile (%a. ~P a)$y)))
   796              & Finite (Takewhile (%x. ~ P x)$y)  & P x"
   793              & Finite (Takewhile (%x. ~ P x)$y)  & P x"
   797 
   794 
   798 (* FIX: pay attention: is only admissible with chain-finite package to be added to
   795 (* FIX: pay attention: is only admissible with chain-finite package to be added to
   799         adm test and Finite f x admissibility *)
   796         adm test and Finite f x admissibility *)
   800 apply (rule_tac x="y" in Seq_induct)
   797 apply (rule_tac x="y" in Seq_induct)
   806  apply blast
   803  apply blast
   807 (* ~ P a *)
   804 (* ~ P a *)
   808 apply simp
   805 apply simp
   809 done
   806 done
   810 
   807 
   811 lemma divide_Seq: "(x>>xs) << Filter P$y 
   808 lemma divide_Seq: "(x\<leadsto>xs) << Filter P$y 
   812    ==> y = ((Takewhile (%a. ~ P a)$y) @@ (x >> TL$(Dropwhile (%a. ~ P a)$y)))
   809    ==> y = ((Takewhile (%a. ~ P a)$y) @@ (x \<leadsto> TL$(Dropwhile (%a. ~ P a)$y)))
   813       & Finite (Takewhile (%a. ~ P a)$y)  & P x"
   810       & Finite (Takewhile (%a. ~ P a)$y)  & P x"
   814 apply (rule divide_Seq_lemma [THEN mp])
   811 apply (rule divide_Seq_lemma [THEN mp])
   815 apply (drule_tac f="HD" and x="x>>xs" in  monofun_cfun_arg)
   812 apply (drule_tac f="HD" and x="x\<leadsto>xs" in  monofun_cfun_arg)
   816 apply simp
   813 apply simp
   817 done
   814 done
   818 
   815 
   819 
   816 
   820 lemma nForall_HDFilter:
   817 lemma nForall_HDFilter:
   825 apply simp_all
   822 apply simp_all
   826 done
   823 done
   827 
   824 
   828 
   825 
   829 lemma divide_Seq2: "~Forall P y
   826 lemma divide_Seq2: "~Forall P y
   830   ==> ? x. y= (Takewhile P$y @@ (x >> TL$(Dropwhile P$y))) &
   827   ==> ? x. y= (Takewhile P$y @@ (x \<leadsto> TL$(Dropwhile P$y))) &
   831       Finite (Takewhile P$y) & (~ P x)"
   828       Finite (Takewhile P$y) & (~ P x)"
   832 apply (drule nForall_HDFilter [THEN mp])
   829 apply (drule nForall_HDFilter [THEN mp])
   833 apply safe
   830 apply safe
   834 apply (rule_tac x="x" in exI)
   831 apply (rule_tac x="x" in exI)
   835 apply (cut_tac P1="%x. ~ P x" in divide_Seq_lemma [THEN mp])
   832 apply (cut_tac P1="%x. ~ P x" in divide_Seq_lemma [THEN mp])
   836 apply auto
   833 apply auto
   837 done
   834 done
   838 
   835 
   839 
   836 
   840 lemma divide_Seq3: "~Forall P y
   837 lemma divide_Seq3: "~Forall P y
   841   ==> ? x bs rs. y= (bs @@ (x>>rs)) & Finite bs & Forall P bs & (~ P x)"
   838   ==> ? x bs rs. y= (bs @@ (x\<leadsto>rs)) & Finite bs & Forall P bs & (~ P x)"
   842 apply (drule divide_Seq2)
   839 apply (drule divide_Seq2)
   843 (*Auto_tac no longer proves it*)
   840 (*Auto_tac no longer proves it*)
   844 apply fastforce
   841 apply fastforce
   845 done
   842 done
   846 
   843 
   858 apply auto
   855 apply auto
   859 done
   856 done
   860 
   857 
   861 lemma take_reduction1:
   858 lemma take_reduction1:
   862 "  ! n. ((! k. k < n --> seq_take k$y1 = seq_take k$y2)
   859 "  ! n. ((! k. k < n --> seq_take k$y1 = seq_take k$y2)
   863     --> seq_take n$(x @@ (t>>y1)) =  seq_take n$(x @@ (t>>y2)))"
   860     --> seq_take n$(x @@ (t\<leadsto>y1)) =  seq_take n$(x @@ (t\<leadsto>y2)))"
   864 apply (rule_tac x="x" in Seq_induct)
   861 apply (rule_tac x="x" in Seq_induct)
   865 apply simp_all
   862 apply simp_all
   866 apply (intro strip)
   863 apply (intro strip)
   867 apply (case_tac "n")
   864 apply (case_tac "n")
   868 apply auto
   865 apply auto
   871 done
   868 done
   872 
   869 
   873 
   870 
   874 lemma take_reduction:
   871 lemma take_reduction:
   875  "!! n.[| x=y; s=t; !! k. k<n ==> seq_take k$y1 = seq_take k$y2|]
   872  "!! n.[| x=y; s=t; !! k. k<n ==> seq_take k$y1 = seq_take k$y2|]
   876   ==> seq_take n$(x @@ (s>>y1)) =  seq_take n$(y @@ (t>>y2))"
   873   ==> seq_take n$(x @@ (s\<leadsto>y1)) =  seq_take n$(y @@ (t\<leadsto>y2))"
   877 apply (auto intro!: take_reduction1 [rule_format])
   874 apply (auto intro!: take_reduction1 [rule_format])
   878 done
   875 done
   879 
   876 
   880 (* ------------------------------------------------------------------
   877 (* ------------------------------------------------------------------
   881           take-lemma and take_reduction for << instead of =
   878           take-lemma and take_reduction for << instead of =
   882    ------------------------------------------------------------------ *)
   879    ------------------------------------------------------------------ *)
   883 
   880 
   884 lemma take_reduction_less1:
   881 lemma take_reduction_less1:
   885 "  ! n. ((! k. k < n --> seq_take k$y1 << seq_take k$y2)
   882 "  ! n. ((! k. k < n --> seq_take k$y1 << seq_take k$y2)
   886     --> seq_take n$(x @@ (t>>y1)) <<  seq_take n$(x @@ (t>>y2)))"
   883     --> seq_take n$(x @@ (t\<leadsto>y1)) <<  seq_take n$(x @@ (t\<leadsto>y2)))"
   887 apply (rule_tac x="x" in Seq_induct)
   884 apply (rule_tac x="x" in Seq_induct)
   888 apply simp_all
   885 apply simp_all
   889 apply (intro strip)
   886 apply (intro strip)
   890 apply (case_tac "n")
   887 apply (case_tac "n")
   891 apply auto
   888 apply auto
   894 done
   891 done
   895 
   892 
   896 
   893 
   897 lemma take_reduction_less:
   894 lemma take_reduction_less:
   898  "!! n.[| x=y; s=t;!! k. k<n ==> seq_take k$y1 << seq_take k$y2|]
   895  "!! n.[| x=y; s=t;!! k. k<n ==> seq_take k$y1 << seq_take k$y2|]
   899   ==> seq_take n$(x @@ (s>>y1)) <<  seq_take n$(y @@ (t>>y2))"
   896   ==> seq_take n$(x @@ (s\<leadsto>y1)) <<  seq_take n$(y @@ (t\<leadsto>y2))"
   900 apply (auto intro!: take_reduction_less1 [rule_format])
   897 apply (auto intro!: take_reduction_less1 [rule_format])
   901 done
   898 done
   902 
   899 
   903 lemma take_lemma_less1:
   900 lemma take_lemma_less1:
   904   assumes "!! n. seq_take n$s1 << seq_take n$s2"
   901   assumes "!! n. seq_take n$s1 << seq_take n$s2"
   923           take-lemma proof principles
   920           take-lemma proof principles
   924    ------------------------------------------------------------------ *)
   921    ------------------------------------------------------------------ *)
   925 
   922 
   926 lemma take_lemma_principle1:
   923 lemma take_lemma_principle1:
   927  "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   924  "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   928             !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2)|]
   925             !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2)|]
   929                           ==> (f (s1 @@ y>>s2)) = (g (s1 @@ y>>s2)) |]
   926                           ==> (f (s1 @@ y\<leadsto>s2)) = (g (s1 @@ y\<leadsto>s2)) |]
   930                ==> A x --> (f x)=(g x)"
   927                ==> A x --> (f x)=(g x)"
   931 apply (case_tac "Forall Q x")
   928 apply (case_tac "Forall Q x")
   932 apply (auto dest!: divide_Seq3)
   929 apply (auto dest!: divide_Seq3)
   933 done
   930 done
   934 
   931 
   935 lemma take_lemma_principle2:
   932 lemma take_lemma_principle2:
   936   "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   933   "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   937            !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2)|]
   934            !! s1 s2 y. [| Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2)|]
   938                           ==> ! n. seq_take n$(f (s1 @@ y>>s2))
   935                           ==> ! n. seq_take n$(f (s1 @@ y\<leadsto>s2))
   939                                  = seq_take n$(g (s1 @@ y>>s2)) |]
   936                                  = seq_take n$(g (s1 @@ y\<leadsto>s2)) |]
   940                ==> A x --> (f x)=(g x)"
   937                ==> A x --> (f x)=(g x)"
   941 apply (case_tac "Forall Q x")
   938 apply (case_tac "Forall Q x")
   942 apply (auto dest!: divide_Seq3)
   939 apply (auto dest!: divide_Seq3)
   943 apply (rule seq.take_lemma)
   940 apply (rule seq.take_lemma)
   944 apply auto
   941 apply auto
   954          has to be used in the trivial direction afterwards for the (Forall Q x) case.  *)
   951          has to be used in the trivial direction afterwards for the (Forall Q x) case.  *)
   955 
   952 
   956 lemma take_lemma_induct:
   953 lemma take_lemma_induct:
   957 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   954 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   958          !! s1 s2 y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t);
   955          !! s1 s2 y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t);
   959                           Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2) |]
   956                           Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2) |]
   960                           ==>   seq_take (Suc n)$(f (s1 @@ y>>s2))
   957                           ==>   seq_take (Suc n)$(f (s1 @@ y\<leadsto>s2))
   961                               = seq_take (Suc n)$(g (s1 @@ y>>s2)) |]
   958                               = seq_take (Suc n)$(g (s1 @@ y\<leadsto>s2)) |]
   962                ==> A x --> (f x)=(g x)"
   959                ==> A x --> (f x)=(g x)"
   963 apply (rule impI)
   960 apply (rule impI)
   964 apply (rule seq.take_lemma)
   961 apply (rule seq.take_lemma)
   965 apply (rule mp)
   962 apply (rule mp)
   966 prefer 2 apply assumption
   963 prefer 2 apply assumption
   975 
   972 
   976 
   973 
   977 lemma take_lemma_less_induct:
   974 lemma take_lemma_less_induct:
   978 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   975 "!! Q. [|!! s. [| Forall Q s; A s |] ==> (f s) = (g s) ;
   979         !! s1 s2 y n. [| ! t m. m < n --> A t --> seq_take m$(f t) = seq_take m$(g t);
   976         !! s1 s2 y n. [| ! t m. m < n --> A t --> seq_take m$(f t) = seq_take m$(g t);
   980                           Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y>>s2) |]
   977                           Forall Q s1; Finite s1; ~ Q y; A (s1 @@ y\<leadsto>s2) |]
   981                           ==>   seq_take n$(f (s1 @@ y>>s2))
   978                           ==>   seq_take n$(f (s1 @@ y\<leadsto>s2))
   982                               = seq_take n$(g (s1 @@ y>>s2)) |]
   979                               = seq_take n$(g (s1 @@ y\<leadsto>s2)) |]
   983                ==> A x --> (f x)=(g x)"
   980                ==> A x --> (f x)=(g x)"
   984 apply (rule impI)
   981 apply (rule impI)
   985 apply (rule seq.take_lemma)
   982 apply (rule seq.take_lemma)
   986 apply (rule mp)
   983 apply (rule mp)
   987 prefer 2 apply assumption
   984 prefer 2 apply assumption
   997 
   994 
   998 lemma take_lemma_in_eq_out:
   995 lemma take_lemma_in_eq_out:
   999 "!! Q. [| A UU  ==> (f UU) = (g UU) ;
   996 "!! Q. [| A UU  ==> (f UU) = (g UU) ;
  1000           A nil ==> (f nil) = (g nil) ;
   997           A nil ==> (f nil) = (g nil) ;
  1001           !! s y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t);
   998           !! s y n. [| ! t. A t --> seq_take n$(f t) = seq_take n$(g t);
  1002                      A (y>>s) |]
   999                      A (y\<leadsto>s) |]
  1003                      ==>   seq_take (Suc n)$(f (y>>s))
  1000                      ==>   seq_take (Suc n)$(f (y\<leadsto>s))
  1004                          = seq_take (Suc n)$(g (y>>s)) |]
  1001                          = seq_take (Suc n)$(g (y\<leadsto>s)) |]
  1005                ==> A x --> (f x)=(g x)"
  1002                ==> A x --> (f x)=(g x)"
  1006 apply (rule impI)
  1003 apply (rule impI)
  1007 apply (rule seq.take_lemma)
  1004 apply (rule seq.take_lemma)
  1008 apply (rule mp)
  1005 apply (rule mp)
  1009 prefer 2 apply assumption
  1006 prefer 2 apply assumption
  1082 
  1079 
  1083 fun Seq_case_tac ctxt s i =
  1080 fun Seq_case_tac ctxt s i =
  1084   Rule_Insts.res_inst_tac ctxt [((("x", 0), Position.none), s)] [] @{thm Seq_cases} i
  1081   Rule_Insts.res_inst_tac ctxt [((("x", 0), Position.none), s)] [] @{thm Seq_cases} i
  1085   THEN hyp_subst_tac ctxt i THEN hyp_subst_tac ctxt (i+1) THEN hyp_subst_tac ctxt (i+2);
  1082   THEN hyp_subst_tac ctxt i THEN hyp_subst_tac ctxt (i+1) THEN hyp_subst_tac ctxt (i+2);
  1086 
  1083 
  1087 (* on a>>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *)
  1084 (* on a\<leadsto>s only simp_tac, as full_simp_tac is uncomplete and often causes errors *)
  1088 fun Seq_case_simp_tac ctxt s i =
  1085 fun Seq_case_simp_tac ctxt s i =
  1089   Seq_case_tac ctxt s i
  1086   Seq_case_tac ctxt s i
  1090   THEN asm_simp_tac ctxt (i+2)
  1087   THEN asm_simp_tac ctxt (i+2)
  1091   THEN asm_full_simp_tac ctxt (i+1)
  1088   THEN asm_full_simp_tac ctxt (i+1)
  1092   THEN asm_full_simp_tac ctxt i;
  1089   THEN asm_full_simp_tac ctxt i;