src/HOL/Random_Sequence.thy
 author haftmann Mon Jun 05 15:59:41 2017 +0200 (2017-06-05) changeset 66010 2f7d39285a1a parent 60758 d8d85a8172b5 child 67091 1393c2340eec permissions -rw-r--r--
executable domain membership checks
```     1
```
```     2 (* Author: Lukas Bulwahn, TU Muenchen *)
```
```     3
```
```     4 section \<open>Various kind of sequences inside the random monad\<close>
```
```     5
```
```     6 theory Random_Sequence
```
```     7 imports Random_Pred
```
```     8 begin
```
```     9
```
```    10 type_synonym 'a random_dseq = "natural \<Rightarrow> natural \<Rightarrow> Random.seed \<Rightarrow> ('a Limited_Sequence.dseq \<times> Random.seed)"
```
```    11
```
```    12 definition empty :: "'a random_dseq"
```
```    13 where
```
```    14   "empty = (%nrandom size. Pair (Limited_Sequence.empty))"
```
```    15
```
```    16 definition single :: "'a => 'a random_dseq"
```
```    17 where
```
```    18   "single x = (%nrandom size. Pair (Limited_Sequence.single x))"
```
```    19
```
```    20 definition bind :: "'a random_dseq => ('a \<Rightarrow> 'b random_dseq) \<Rightarrow> 'b random_dseq"
```
```    21 where
```
```    22   "bind R f = (\<lambda>nrandom size s. let
```
```    23      (P, s') = R nrandom size s;
```
```    24      (s1, s2) = Random.split_seed s'
```
```    25   in (Limited_Sequence.bind P (%a. fst (f a nrandom size s1)), s2))"
```
```    26
```
```    27 definition union :: "'a random_dseq => 'a random_dseq => 'a random_dseq"
```
```    28 where
```
```    29   "union R1 R2 = (\<lambda>nrandom size s. let
```
```    30      (S1, s') = R1 nrandom size s; (S2, s'') = R2 nrandom size s'
```
```    31   in (Limited_Sequence.union S1 S2, s''))"
```
```    32
```
```    33 definition if_random_dseq :: "bool => unit random_dseq"
```
```    34 where
```
```    35   "if_random_dseq b = (if b then single () else empty)"
```
```    36
```
```    37 definition not_random_dseq :: "unit random_dseq => unit random_dseq"
```
```    38 where
```
```    39   "not_random_dseq R = (\<lambda>nrandom size s. let
```
```    40      (S, s') = R nrandom size s
```
```    41    in (Limited_Sequence.not_seq S, s'))"
```
```    42
```
```    43 definition map :: "('a => 'b) => 'a random_dseq => 'b random_dseq"
```
```    44 where
```
```    45   "map f P = bind P (single o f)"
```
```    46
```
```    47 fun Random :: "(natural \<Rightarrow> Random.seed \<Rightarrow> (('a \<times> (unit \<Rightarrow> term)) \<times> Random.seed)) \<Rightarrow> 'a random_dseq"
```
```    48 where
```
```    49   "Random g nrandom = (%size. if nrandom <= 0 then (Pair Limited_Sequence.empty) else
```
```    50      (scomp (g size) (%r. scomp (Random g (nrandom - 1) size) (%rs. Pair (Limited_Sequence.union (Limited_Sequence.single (fst r)) rs)))))"
```
```    51
```
```    52
```
```    53 type_synonym 'a pos_random_dseq = "natural \<Rightarrow> natural \<Rightarrow> Random.seed \<Rightarrow> 'a Limited_Sequence.pos_dseq"
```
```    54
```
```    55 definition pos_empty :: "'a pos_random_dseq"
```
```    56 where
```
```    57   "pos_empty = (%nrandom size seed. Limited_Sequence.pos_empty)"
```
```    58
```
```    59 definition pos_single :: "'a => 'a pos_random_dseq"
```
```    60 where
```
```    61   "pos_single x = (%nrandom size seed. Limited_Sequence.pos_single x)"
```
```    62
```
```    63 definition pos_bind :: "'a pos_random_dseq => ('a \<Rightarrow> 'b pos_random_dseq) \<Rightarrow> 'b pos_random_dseq"
```
```    64 where
```
```    65   "pos_bind R f = (\<lambda>nrandom size seed. Limited_Sequence.pos_bind (R nrandom size seed) (%a. f a nrandom size seed))"
```
```    66
```
```    67 definition pos_decr_bind :: "'a pos_random_dseq => ('a \<Rightarrow> 'b pos_random_dseq) \<Rightarrow> 'b pos_random_dseq"
```
```    68 where
```
```    69   "pos_decr_bind R f = (\<lambda>nrandom size seed. Limited_Sequence.pos_decr_bind (R nrandom size seed) (%a. f a nrandom size seed))"
```
```    70
```
```    71 definition pos_union :: "'a pos_random_dseq => 'a pos_random_dseq => 'a pos_random_dseq"
```
```    72 where
```
```    73   "pos_union R1 R2 = (\<lambda>nrandom size seed. Limited_Sequence.pos_union (R1 nrandom size seed) (R2 nrandom size seed))"
```
```    74
```
```    75 definition pos_if_random_dseq :: "bool => unit pos_random_dseq"
```
```    76 where
```
```    77   "pos_if_random_dseq b = (if b then pos_single () else pos_empty)"
```
```    78
```
```    79 definition pos_iterate_upto :: "(natural => 'a) => natural => natural => 'a pos_random_dseq"
```
```    80 where
```
```    81   "pos_iterate_upto f n m = (\<lambda>nrandom size seed. Limited_Sequence.pos_iterate_upto f n m)"
```
```    82
```
```    83 definition pos_map :: "('a => 'b) => 'a pos_random_dseq => 'b pos_random_dseq"
```
```    84 where
```
```    85   "pos_map f P = pos_bind P (pos_single o f)"
```
```    86
```
```    87 fun iter :: "(Random.seed \<Rightarrow> ('a \<times> (unit \<Rightarrow> term)) \<times> Random.seed)
```
```    88   \<Rightarrow> natural \<Rightarrow> Random.seed \<Rightarrow> 'a Lazy_Sequence.lazy_sequence"
```
```    89 where
```
```    90   "iter random nrandom seed =
```
```    91     (if nrandom = 0 then Lazy_Sequence.empty else Lazy_Sequence.Lazy_Sequence (%u. let ((x, _), seed') = random seed in Some (x, iter random (nrandom - 1) seed')))"
```
```    92
```
```    93 definition pos_Random :: "(natural \<Rightarrow> Random.seed \<Rightarrow> ('a \<times> (unit \<Rightarrow> term)) \<times> Random.seed)
```
```    94   \<Rightarrow> 'a pos_random_dseq"
```
```    95 where
```
```    96   "pos_Random g = (%nrandom size seed depth. iter (g size) nrandom seed)"
```
```    97
```
```    98
```
```    99 type_synonym 'a neg_random_dseq = "natural \<Rightarrow> natural \<Rightarrow> Random.seed \<Rightarrow> 'a Limited_Sequence.neg_dseq"
```
```   100
```
```   101 definition neg_empty :: "'a neg_random_dseq"
```
```   102 where
```
```   103   "neg_empty = (%nrandom size seed. Limited_Sequence.neg_empty)"
```
```   104
```
```   105 definition neg_single :: "'a => 'a neg_random_dseq"
```
```   106 where
```
```   107   "neg_single x = (%nrandom size seed. Limited_Sequence.neg_single x)"
```
```   108
```
```   109 definition neg_bind :: "'a neg_random_dseq => ('a \<Rightarrow> 'b neg_random_dseq) \<Rightarrow> 'b neg_random_dseq"
```
```   110 where
```
```   111   "neg_bind R f = (\<lambda>nrandom size seed. Limited_Sequence.neg_bind (R nrandom size seed) (%a. f a nrandom size seed))"
```
```   112
```
```   113 definition neg_decr_bind :: "'a neg_random_dseq => ('a \<Rightarrow> 'b neg_random_dseq) \<Rightarrow> 'b neg_random_dseq"
```
```   114 where
```
```   115   "neg_decr_bind R f = (\<lambda>nrandom size seed. Limited_Sequence.neg_decr_bind (R nrandom size seed) (%a. f a nrandom size seed))"
```
```   116
```
```   117 definition neg_union :: "'a neg_random_dseq => 'a neg_random_dseq => 'a neg_random_dseq"
```
```   118 where
```
```   119   "neg_union R1 R2 = (\<lambda>nrandom size seed. Limited_Sequence.neg_union (R1 nrandom size seed) (R2 nrandom size seed))"
```
```   120
```
```   121 definition neg_if_random_dseq :: "bool => unit neg_random_dseq"
```
```   122 where
```
```   123   "neg_if_random_dseq b = (if b then neg_single () else neg_empty)"
```
```   124
```
```   125 definition neg_iterate_upto :: "(natural => 'a) => natural => natural => 'a neg_random_dseq"
```
```   126 where
```
```   127   "neg_iterate_upto f n m = (\<lambda>nrandom size seed. Limited_Sequence.neg_iterate_upto f n m)"
```
```   128
```
```   129 definition neg_not_random_dseq :: "unit pos_random_dseq => unit neg_random_dseq"
```
```   130 where
```
```   131   "neg_not_random_dseq R = (\<lambda>nrandom size seed. Limited_Sequence.neg_not_seq (R nrandom size seed))"
```
```   132
```
```   133 definition neg_map :: "('a => 'b) => 'a neg_random_dseq => 'b neg_random_dseq"
```
```   134 where
```
```   135   "neg_map f P = neg_bind P (neg_single o f)"
```
```   136
```
```   137 definition pos_not_random_dseq :: "unit neg_random_dseq => unit pos_random_dseq"
```
```   138 where
```
```   139   "pos_not_random_dseq R = (\<lambda>nrandom size seed. Limited_Sequence.pos_not_seq (R nrandom size seed))"
```
```   140
```
```   141
```
```   142 hide_const (open)
```
```   143   empty single bind union if_random_dseq not_random_dseq map Random
```
```   144   pos_empty pos_single pos_bind pos_decr_bind pos_union pos_if_random_dseq pos_iterate_upto
```
```   145   pos_not_random_dseq pos_map iter pos_Random
```
```   146   neg_empty neg_single neg_bind neg_decr_bind neg_union neg_if_random_dseq neg_iterate_upto
```
```   147   neg_not_random_dseq neg_map
```
```   148
```
```   149 hide_fact (open) empty_def single_def bind_def union_def if_random_dseq_def not_random_dseq_def
```
```   150   map_def Random.simps
```
```   151   pos_empty_def pos_single_def pos_bind_def pos_decr_bind_def pos_union_def pos_if_random_dseq_def
```
```   152   pos_iterate_upto_def pos_not_random_dseq_def pos_map_def iter.simps pos_Random_def
```
```   153   neg_empty_def neg_single_def neg_bind_def neg_decr_bind_def neg_union_def neg_if_random_dseq_def
```
```   154   neg_iterate_upto_def neg_not_random_dseq_def neg_map_def
```
```   155
```
```   156 end
```
```   157
```