src/HOL/DSequence.thy
changeset 34953 a053ad2a7a72
parent 34948 2d5f2a9f7601
child 36024 c1ce2f60b0f2
equal deleted inserted replaced
34952:bd7e347eb768 34953:a053ad2a7a72
    41       None => None
    41       None => None
    42     | Some yq => (case map_seq f xq' i pol of
    42     | Some yq => (case map_seq f xq' i pol of
    43         None => None
    43         None => None
    44       | Some zq => Some (Lazy_Sequence.append yq zq))))"
    44       | Some zq => Some (Lazy_Sequence.append yq zq))))"
    45 
    45 
    46 fun bind :: "'a dseq => ('a => 'b dseq) => 'b dseq"
    46 definition bind :: "'a dseq => ('a => 'b dseq) => 'b dseq"
    47 where
    47 where
    48   "bind x f = (%i pol. 
    48   "bind x f = (%i pol. 
    49      if i = 0 then
    49      if i = 0 then
    50        (if pol then Some Lazy_Sequence.empty else None)
    50        (if pol then Some Lazy_Sequence.empty else None)
    51      else
    51      else
    52        (case x (i - 1) pol of
    52        (case x (i - 1) pol of
    53          None => None
    53          None => None
    54        | Some xq => map_seq f xq i pol))"
    54        | Some xq => map_seq f xq i pol))"
    55 
    55 
    56 fun union :: "'a dseq => 'a dseq => 'a dseq"
    56 definition union :: "'a dseq => 'a dseq => 'a dseq"
    57 where
    57 where
    58   "union x y = (%i pol. case (x i pol, y i pol) of
    58   "union x y = (%i pol. case (x i pol, y i pol) of
    59       (Some xq, Some yq) => Some (Lazy_Sequence.append xq yq)
    59       (Some xq, Some yq) => Some (Lazy_Sequence.append xq yq)
    60     | _ => None)"
    60     | _ => None)"
    61 
    61 
    62 definition if_seq :: "bool => unit dseq"
    62 definition if_seq :: "bool => unit dseq"
    63 where
    63 where
    64   "if_seq b = (if b then single () else empty)"
    64   "if_seq b = (if b then single () else empty)"
    65 
    65 
    66 fun not_seq :: "unit dseq => unit dseq"
    66 definition not_seq :: "unit dseq => unit dseq"
    67 where
    67 where
    68   "not_seq x = (%i pol. case x i (\<not>pol) of
    68   "not_seq x = (%i pol. case x i (\<not>pol) of
    69     None => Some Lazy_Sequence.empty
    69     None => Some Lazy_Sequence.empty
    70   | Some xq => (case Lazy_Sequence.yield xq of
    70   | Some xq => (case Lazy_Sequence.yield xq of
    71       None => Some (Lazy_Sequence.single ())
    71       None => Some (Lazy_Sequence.single ())
    72     | Some _ => Some (Lazy_Sequence.empty)))"
    72     | Some _ => Some (Lazy_Sequence.empty)))"
    73 
    73 
    74 fun map :: "('a => 'b) => 'a dseq => 'b dseq"
    74 definition map :: "('a => 'b) => 'a dseq => 'b dseq"
    75 where
    75 where
    76   "map f g = (%i pol. case g i pol of
    76   "map f g = (%i pol. case g i pol of
    77      None => None
    77      None => None
    78    | Some xq => Some (Lazy_Sequence.map f xq))"
    78    | Some xq => Some (Lazy_Sequence.map f xq))"
    79 
    79 
   104 
   104 
   105 hide const Sequence.Seq Sequence.yield Sequence.yieldn Sequence.empty Sequence.single
   105 hide const Sequence.Seq Sequence.yield Sequence.yieldn Sequence.empty Sequence.single
   106   Sequence.append Sequence.flat Sequence.map Sequence.bind Sequence.ifpred Sequence.not_seq
   106   Sequence.append Sequence.flat Sequence.map Sequence.bind Sequence.ifpred Sequence.not_seq
   107 *)
   107 *)
   108 hide (open) const empty single eval map_seq bind union if_seq not_seq map
   108 hide (open) const empty single eval map_seq bind union if_seq not_seq map
   109 hide (open) fact empty_def single_def eval.simps map_seq.simps bind.simps union.simps
   109 hide (open) fact empty_def single_def eval.simps map_seq.simps bind_def union_def
   110   if_seq_def not_seq.simps map.simps
   110   if_seq_def not_seq_def map_def
   111 
   111 
   112 end
   112 end