src/HOLCF/IOA/meta_theory/Seq.thy
changeset 23778 18f426a137a9
parent 22808 a7daa74e2980
child 25803 230c9c87d739
equal deleted inserted replaced
23777:60b7800338d5 23778:18f426a137a9
    32 
    32 
    33 abbreviation
    33 abbreviation
    34   sconc_syn :: "'a seq => 'a seq => 'a seq"  (infixr "@@" 65) where
    34   sconc_syn :: "'a seq => 'a seq => 'a seq"  (infixr "@@" 65) where
    35   "xs @@ ys == sconc $ xs $ ys"
    35   "xs @@ ys == sconc $ xs $ ys"
    36 
    36 
    37 abbreviation
    37 inductive
    38   Finite :: "'a seq => bool" where
    38   Finite :: "'a seq => bool"
    39   "Finite x == x:sfinite"
    39   where
       
    40     sfinite_0:  "Finite nil"
       
    41   | sfinite_n:  "[| Finite tr; a~=UU |] ==> Finite (a##tr)"
    40 
    42 
    41 defs
    43 defs
    42 
    44 
    43 (* f not possible at lhs, as "pattern matching" only for % x arguments,
    45 (* f not possible at lhs, as "pattern matching" only for % x arguments,
    44    f cannot be written at rhs in front, as fix_eq3 does not apply later *)
    46    f cannot be written at rhs in front, as fix_eq3 does not apply later *)
   106 
   108 
   107 Infinite_def:
   109 Infinite_def:
   108   "Infinite x == ~(seq_finite x)"
   110   "Infinite x == ~(seq_finite x)"
   109 
   111 
   110 
   112 
   111 inductive "sfinite"
   113 declare Finite.intros [simp]
   112    intros
       
   113     sfinite_0:  "nil:sfinite"
       
   114     sfinite_n:  "[|tr:sfinite;a~=UU|] ==> (a##tr) : sfinite"
       
   115 
       
   116 declare sfinite.intros [simp]
       
   117 declare seq.rews [simp]
   114 declare seq.rews [simp]
   118 
   115 
   119 
   116 
   120 subsection {* recursive equations of operators *}
   117 subsection {* recursive equations of operators *}
   121 
   118 
   435 (* 3. a~=UU==> Finite(a##x)=Finite(x)                  *)
   432 (* 3. a~=UU==> Finite(a##x)=Finite(x)                  *)
   436 (* ----------------------------------------------------  *)
   433 (* ----------------------------------------------------  *)
   437 
   434 
   438 lemma Finite_UU_a: "Finite x --> x~=UU"
   435 lemma Finite_UU_a: "Finite x --> x~=UU"
   439 apply (rule impI)
   436 apply (rule impI)
   440 apply (erule sfinite.induct)
   437 apply (erule Finite.induct)
   441  apply simp
   438  apply simp
   442 apply simp
   439 apply simp
   443 done
   440 done
   444 
   441 
   445 lemma Finite_UU [simp]: "~(Finite UU)"
   442 lemma Finite_UU [simp]: "~(Finite UU)"
   447 apply fast
   444 apply fast
   448 done
   445 done
   449 
   446 
   450 lemma Finite_cons_a: "Finite x --> a~=UU --> x=a##xs --> Finite xs"
   447 lemma Finite_cons_a: "Finite x --> a~=UU --> x=a##xs --> Finite xs"
   451 apply (intro strip)
   448 apply (intro strip)
   452 apply (erule sfinite.elims)
   449 apply (erule Finite.cases)
   453 apply fastsimp
   450 apply fastsimp
   454 apply (simp add: seq.injects)
   451 apply (simp add: seq.injects)
   455 done
   452 done
   456 
   453 
   457 lemma Finite_cons: "a~=UU ==>(Finite (a##x)) = (Finite x)"
   454 lemma Finite_cons: "a~=UU ==>(Finite (a##x)) = (Finite x)"