src/HOL/Tools/Predicate_Compile/predicate_compile_compilations.ML
changeset 45461 130c90bb80b4
parent 45450 dc2236b19a3d
child 45750 17100f4ce0b5
equal deleted inserted replaced
45452:414732ebf891 45461:130c90bb80b4
     5 *)
     5 *)
     6 
     6 
     7 structure Predicate_Comp_Funs =
     7 structure Predicate_Comp_Funs =
     8 struct
     8 struct
     9 
     9 
    10 fun mk_predT T = Type (@{type_name Predicate.pred}, [T])
    10 fun mk_monadT T = Type (@{type_name Predicate.pred}, [T])
    11 
    11 
    12 fun dest_predT (Type (@{type_name Predicate.pred}, [T])) = T
    12 fun dest_monadT (Type (@{type_name Predicate.pred}, [T])) = T
    13   | dest_predT T = raise TYPE ("dest_predT", [T], []);
    13   | dest_monadT T = raise TYPE ("dest_monadT", [T], []);
    14 
    14 
    15 fun mk_bot T = Const (@{const_name Orderings.bot}, mk_predT T);
    15 fun mk_empty T = Const (@{const_name Orderings.bot}, mk_monadT T);
    16 
    16 
    17 fun mk_single t =
    17 fun mk_single t =
    18   let val T = fastype_of t
    18   let val T = fastype_of t
    19   in Const(@{const_name Predicate.single}, T --> mk_predT T) $ t end;
    19   in Const(@{const_name Predicate.single}, T --> mk_monadT T) $ t end;
    20 
    20 
    21 fun mk_bind (x, f) =
    21 fun mk_bind (x, f) =
    22   let val T as Type ("fun", [_, U]) = fastype_of f
    22   let val T as Type ("fun", [_, U]) = fastype_of f
    23   in
    23   in
    24     Const (@{const_name Predicate.bind}, fastype_of x --> T --> U) $ x $ f
    24     Const (@{const_name Predicate.bind}, fastype_of x --> T --> U) $ x $ f
    25   end;
    25   end;
    26 
    26 
    27 val mk_sup = HOLogic.mk_binop @{const_name sup};
    27 val mk_plus = HOLogic.mk_binop @{const_name sup};
    28 
    28 
    29 fun mk_if cond = Const (@{const_name Predicate.if_pred},
    29 fun mk_if cond = Const (@{const_name Predicate.if_pred},
    30   HOLogic.boolT --> mk_predT HOLogic.unitT) $ cond;
    30   HOLogic.boolT --> mk_monadT HOLogic.unitT) $ cond;
    31 
    31 
    32 fun mk_iterate_upto T (f, from, to) =
    32 fun mk_iterate_upto T (f, from, to) =
    33   list_comb (Const (@{const_name Code_Numeral.iterate_upto},
    33   list_comb (Const (@{const_name Code_Numeral.iterate_upto},
    34       [@{typ code_numeral} --> T, @{typ code_numeral}, @{typ code_numeral}] ---> mk_predT T),
    34       [@{typ code_numeral} --> T, @{typ code_numeral}, @{typ code_numeral}] ---> mk_monadT T),
    35     [f, from, to])
    35     [f, from, to])
    36 
    36 
    37 fun mk_not t =
    37 fun mk_not t =
    38   let
    38   let
    39     val T = mk_predT HOLogic.unitT
    39     val T = mk_monadT HOLogic.unitT
    40   in Const (@{const_name Predicate.not_pred}, T --> T) $ t end
    40   in Const (@{const_name Predicate.not_pred}, T --> T) $ t end
    41 
    41 
    42 fun mk_Enum f =
    42 fun mk_Enum f =
    43   let val T as Type ("fun", [T', _]) = fastype_of f
    43   let val T as Type ("fun", [T', _]) = fastype_of f
    44   in
    44   in
    45     Const (@{const_name Predicate.Pred}, T --> mk_predT T') $ f    
    45     Const (@{const_name Predicate.Pred}, T --> mk_monadT T') $ f    
    46   end;
    46   end;
    47 
    47 
    48 fun mk_Eval (f, x) =
    48 fun mk_Eval (f, x) =
    49   let
    49   let
    50     val T = dest_predT (fastype_of f)
    50     val T = dest_monadT (fastype_of f)
    51   in
    51   in
    52     Const (@{const_name Predicate.eval}, mk_predT T --> T --> HOLogic.boolT) $ f $ x
    52     Const (@{const_name Predicate.eval}, mk_monadT T --> T --> HOLogic.boolT) $ f $ x
    53   end;
    53   end;
    54 
    54 
    55 fun dest_Eval (Const (@{const_name Predicate.eval}, _) $ f $ x) = (f, x)
    55 fun dest_Eval (Const (@{const_name Predicate.eval}, _) $ f $ x) = (f, x)
    56 
    56 
    57 fun mk_map T1 T2 tf tp = Const (@{const_name Predicate.map},
    57 fun mk_map T1 T2 tf tp = Const (@{const_name Predicate.map},
    58   (T1 --> T2) --> mk_predT T1 --> mk_predT T2) $ tf $ tp;
    58   (T1 --> T2) --> mk_monadT T1 --> mk_monadT T2) $ tf $ tp;
    59 
    59 
    60 val compfuns = Predicate_Compile_Aux.CompilationFuns
    60 val compfuns = Predicate_Compile_Aux.CompilationFuns
    61     {mk_predT = mk_predT, dest_predT = dest_predT, mk_bot = mk_bot,
    61     {mk_monadT = mk_monadT, dest_monadT = dest_monadT, mk_empty = mk_empty,
    62     mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
    62     mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
    63     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
    63     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
    64 
    64 
    65 end;
    65 end;
    66 
    66 
    67 structure CPS_Comp_Funs =
    67 structure CPS_Comp_Funs =
    68 struct
    68 struct
    69 
    69 
    70 fun mk_predT T = (T --> @{typ "Code_Evaluation.term list option"}) --> @{typ "Code_Evaluation.term list option"}
    70 fun mk_monadT T = (T --> @{typ "Code_Evaluation.term list option"}) --> @{typ "Code_Evaluation.term list option"}
    71 
    71 
    72 fun dest_predT (Type ("fun", [Type ("fun", [T, @{typ "term list option"}]), @{typ "term list option"}])) = T
    72 fun dest_monadT (Type ("fun", [Type ("fun", [T, @{typ "term list option"}]), @{typ "term list option"}])) = T
    73   | dest_predT T = raise TYPE ("dest_predT", [T], []);
    73   | dest_monadT T = raise TYPE ("dest_monadT", [T], []);
    74 
    74 
    75 fun mk_bot T = Const (@{const_name Quickcheck_Exhaustive.cps_empty}, mk_predT T);
    75 fun mk_empty T = Const (@{const_name Quickcheck_Exhaustive.cps_empty}, mk_monadT T);
    76 
    76 
    77 fun mk_single t =
    77 fun mk_single t =
    78   let val T = fastype_of t
    78   let val T = fastype_of t
    79   in Const(@{const_name Quickcheck_Exhaustive.cps_single}, T --> mk_predT T) $ t end;
    79   in Const(@{const_name Quickcheck_Exhaustive.cps_single}, T --> mk_monadT T) $ t end;
    80 
    80 
    81 fun mk_bind (x, f) =
    81 fun mk_bind (x, f) =
    82   let val T as Type ("fun", [_, U]) = fastype_of f
    82   let val T as Type ("fun", [_, U]) = fastype_of f
    83   in
    83   in
    84     Const (@{const_name Quickcheck_Exhaustive.cps_bind}, fastype_of x --> T --> U) $ x $ f
    84     Const (@{const_name Quickcheck_Exhaustive.cps_bind}, fastype_of x --> T --> U) $ x $ f
    85   end;
    85   end;
    86 
    86 
    87 val mk_sup = HOLogic.mk_binop @{const_name Quickcheck_Exhaustive.cps_plus};
    87 val mk_plus = HOLogic.mk_binop @{const_name Quickcheck_Exhaustive.cps_plus};
    88 
    88 
    89 fun mk_if cond = Const (@{const_name Quickcheck_Exhaustive.cps_if},
    89 fun mk_if cond = Const (@{const_name Quickcheck_Exhaustive.cps_if},
    90   HOLogic.boolT --> mk_predT HOLogic.unitT) $ cond;
    90   HOLogic.boolT --> mk_monadT HOLogic.unitT) $ cond;
    91 
    91 
    92 fun mk_iterate_upto T (f, from, to) = error "not implemented yet"
    92 fun mk_iterate_upto T (f, from, to) = error "not implemented yet"
    93 
    93 
    94 fun mk_not t =
    94 fun mk_not t =
    95   let
    95   let
    96     val T = mk_predT HOLogic.unitT
    96     val T = mk_monadT HOLogic.unitT
    97   in Const (@{const_name Quickcheck_Exhaustive.cps_not}, T --> T) $ t end
    97   in Const (@{const_name Quickcheck_Exhaustive.cps_not}, T --> T) $ t end
    98 
    98 
    99 fun mk_Enum f = error "not implemented"
    99 fun mk_Enum f = error "not implemented"
   100 
   100 
   101 fun mk_Eval (f, x) = error "not implemented"
   101 fun mk_Eval (f, x) = error "not implemented"
   103 fun dest_Eval t = error "not implemented"
   103 fun dest_Eval t = error "not implemented"
   104 
   104 
   105 fun mk_map T1 T2 tf tp = error "not implemented"
   105 fun mk_map T1 T2 tf tp = error "not implemented"
   106 
   106 
   107 val compfuns = Predicate_Compile_Aux.CompilationFuns
   107 val compfuns = Predicate_Compile_Aux.CompilationFuns
   108     {mk_predT = mk_predT, dest_predT = dest_predT, mk_bot = mk_bot,
   108     {mk_monadT = mk_monadT, dest_monadT = dest_monadT, mk_empty = mk_empty,
   109     mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   109     mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   110     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   110     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   111 
   111 
   112 end;
   112 end;
   113 
   113 
   114 structure Pos_Bounded_CPS_Comp_Funs =
   114 structure Pos_Bounded_CPS_Comp_Funs =
   115 struct
   115 struct
   116 
   116 
   117 fun mk_predT T = (T --> @{typ "Code_Evaluation.term list option"}) --> @{typ "code_numeral => Code_Evaluation.term list option"}
   117 fun mk_monadT T = (T --> @{typ "Code_Evaluation.term list option"}) --> @{typ "code_numeral => Code_Evaluation.term list option"}
   118 
   118 
   119 fun dest_predT (Type ("fun", [Type ("fun", [T, @{typ "term list option"}]), @{typ "code_numeral => term list option"}])) = T
   119 fun dest_monadT (Type ("fun", [Type ("fun", [T, @{typ "term list option"}]), @{typ "code_numeral => term list option"}])) = T
   120   | dest_predT T = raise TYPE ("dest_predT", [T], []);
   120   | dest_monadT T = raise TYPE ("dest_monadT", [T], []);
   121 
   121 
   122 fun mk_bot T = Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_empty}, mk_predT T);
   122 fun mk_empty T = Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_empty}, mk_monadT T);
   123 
   123 
   124 fun mk_single t =
   124 fun mk_single t =
   125   let val T = fastype_of t
   125   let val T = fastype_of t
   126   in Const(@{const_name Quickcheck_Exhaustive.pos_bound_cps_single}, T --> mk_predT T) $ t end;
   126   in Const(@{const_name Quickcheck_Exhaustive.pos_bound_cps_single}, T --> mk_monadT T) $ t end;
   127 
   127 
   128 fun mk_bind (x, f) =
   128 fun mk_bind (x, f) =
   129   let val T as Type ("fun", [_, U]) = fastype_of f
   129   let val T as Type ("fun", [_, U]) = fastype_of f
   130   in
   130   in
   131     Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_bind}, fastype_of x --> T --> U) $ x $ f
   131     Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_bind}, fastype_of x --> T --> U) $ x $ f
   132   end;
   132   end;
   133 
   133 
   134 val mk_sup = HOLogic.mk_binop @{const_name Quickcheck_Exhaustive.pos_bound_cps_plus};
   134 val mk_plus = HOLogic.mk_binop @{const_name Quickcheck_Exhaustive.pos_bound_cps_plus};
   135 
   135 
   136 fun mk_if cond = Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_if},
   136 fun mk_if cond = Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_if},
   137   HOLogic.boolT --> mk_predT HOLogic.unitT) $ cond;
   137   HOLogic.boolT --> mk_monadT HOLogic.unitT) $ cond;
   138 
   138 
   139 fun mk_iterate_upto T (f, from, to) = error "not implemented yet"
   139 fun mk_iterate_upto T (f, from, to) = error "not implemented yet"
   140 
   140 
   141 fun mk_not t =
   141 fun mk_not t =
   142   let
   142   let
   143     val nT = @{typ "(unit Quickcheck_Exhaustive.unknown =>
   143     val nT = @{typ "(unit Quickcheck_Exhaustive.unknown =>
   144       Code_Evaluation.term list Quickcheck_Exhaustive.three_valued) => code_numeral =>
   144       Code_Evaluation.term list Quickcheck_Exhaustive.three_valued) => code_numeral =>
   145       Code_Evaluation.term list Quickcheck_Exhaustive.three_valued"}
   145       Code_Evaluation.term list Quickcheck_Exhaustive.three_valued"}
   146     val T = mk_predT HOLogic.unitT
   146     val T = mk_monadT HOLogic.unitT
   147   in Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_not}, nT --> T) $ t end
   147   in Const (@{const_name Quickcheck_Exhaustive.pos_bound_cps_not}, nT --> T) $ t end
   148 
   148 
   149 fun mk_Enum f = error "not implemented"
   149 fun mk_Enum f = error "not implemented"
   150 
   150 
   151 fun mk_Eval (f, x) = error "not implemented"
   151 fun mk_Eval (f, x) = error "not implemented"
   153 fun dest_Eval t = error "not implemented"
   153 fun dest_Eval t = error "not implemented"
   154 
   154 
   155 fun mk_map T1 T2 tf tp = error "not implemented"
   155 fun mk_map T1 T2 tf tp = error "not implemented"
   156 
   156 
   157 val compfuns = Predicate_Compile_Aux.CompilationFuns
   157 val compfuns = Predicate_Compile_Aux.CompilationFuns
   158     {mk_predT = mk_predT, dest_predT = dest_predT, mk_bot = mk_bot,
   158     {mk_monadT = mk_monadT, dest_monadT = dest_monadT, mk_empty = mk_empty,
   159     mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   159     mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   160     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   160     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   161 
   161 
   162 end;
   162 end;
   163 
   163 
   164 structure Neg_Bounded_CPS_Comp_Funs =
   164 structure Neg_Bounded_CPS_Comp_Funs =
   165 struct
   165 struct
   166 
   166 
   167 fun mk_predT T =
   167 fun mk_monadT T =
   168   (Type (@{type_name "Quickcheck_Exhaustive.unknown"}, [T])
   168   (Type (@{type_name "Quickcheck_Exhaustive.unknown"}, [T])
   169     --> @{typ "Code_Evaluation.term list Quickcheck_Exhaustive.three_valued"})
   169     --> @{typ "Code_Evaluation.term list Quickcheck_Exhaustive.three_valued"})
   170     --> @{typ "code_numeral => Code_Evaluation.term list Quickcheck_Exhaustive.three_valued"}
   170     --> @{typ "code_numeral => Code_Evaluation.term list Quickcheck_Exhaustive.three_valued"}
   171 
   171 
   172 fun dest_predT (Type ("fun", [Type ("fun", [Type (@{type_name "Quickcheck_Exhaustive.unknown"}, [T]),
   172 fun dest_monadT (Type ("fun", [Type ("fun", [Type (@{type_name "Quickcheck_Exhaustive.unknown"}, [T]),
   173     @{typ "term list Quickcheck_Exhaustive.three_valued"}]),
   173     @{typ "term list Quickcheck_Exhaustive.three_valued"}]),
   174     @{typ "code_numeral => term list Quickcheck_Exhaustive.three_valued"}])) = T
   174     @{typ "code_numeral => term list Quickcheck_Exhaustive.three_valued"}])) = T
   175   | dest_predT T = raise TYPE ("dest_predT", [T], []);
   175   | dest_monadT T = raise TYPE ("dest_monadT", [T], []);
   176 
   176 
   177 fun mk_bot T = Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_empty}, mk_predT T);
   177 fun mk_empty T = Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_empty}, mk_monadT T);
   178 
   178 
   179 fun mk_single t =
   179 fun mk_single t =
   180   let val T = fastype_of t
   180   let val T = fastype_of t
   181   in Const(@{const_name Quickcheck_Exhaustive.neg_bound_cps_single}, T --> mk_predT T) $ t end;
   181   in Const(@{const_name Quickcheck_Exhaustive.neg_bound_cps_single}, T --> mk_monadT T) $ t end;
   182 
   182 
   183 fun mk_bind (x, f) =
   183 fun mk_bind (x, f) =
   184   let val T as Type ("fun", [_, U]) = fastype_of f
   184   let val T as Type ("fun", [_, U]) = fastype_of f
   185   in
   185   in
   186     Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_bind}, fastype_of x --> T --> U) $ x $ f
   186     Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_bind}, fastype_of x --> T --> U) $ x $ f
   187   end;
   187   end;
   188 
   188 
   189 val mk_sup = HOLogic.mk_binop @{const_name Quickcheck_Exhaustive.neg_bound_cps_plus};
   189 val mk_plus = HOLogic.mk_binop @{const_name Quickcheck_Exhaustive.neg_bound_cps_plus};
   190 
   190 
   191 fun mk_if cond = Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_if},
   191 fun mk_if cond = Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_if},
   192   HOLogic.boolT --> mk_predT HOLogic.unitT) $ cond;
   192   HOLogic.boolT --> mk_monadT HOLogic.unitT) $ cond;
   193 
   193 
   194 fun mk_iterate_upto T (f, from, to) = error "not implemented"
   194 fun mk_iterate_upto T (f, from, to) = error "not implemented"
   195 
   195 
   196 fun mk_not t =
   196 fun mk_not t =
   197   let
   197   let
   198     val T = mk_predT HOLogic.unitT
   198     val T = mk_monadT HOLogic.unitT
   199     val pT = @{typ "(unit => Code_Evaluation.term list option) => code_numeral => Code_Evaluation.term list option"}
   199     val pT = @{typ "(unit => Code_Evaluation.term list option) => code_numeral => Code_Evaluation.term list option"}
   200   in Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_not}, pT --> T) $ t end
   200   in Const (@{const_name Quickcheck_Exhaustive.neg_bound_cps_not}, pT --> T) $ t end
   201 
   201 
   202 fun mk_Enum f = error "not implemented"
   202 fun mk_Enum f = error "not implemented"
   203 
   203 
   206 fun dest_Eval t = error "not implemented"
   206 fun dest_Eval t = error "not implemented"
   207 
   207 
   208 fun mk_map T1 T2 tf tp = error "not implemented"
   208 fun mk_map T1 T2 tf tp = error "not implemented"
   209 
   209 
   210 val compfuns = Predicate_Compile_Aux.CompilationFuns
   210 val compfuns = Predicate_Compile_Aux.CompilationFuns
   211     {mk_predT = mk_predT, dest_predT = dest_predT, mk_bot = mk_bot,
   211     {mk_monadT = mk_monadT, dest_monadT = dest_monadT, mk_empty = mk_empty,
   212     mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   212     mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   213     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   213     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   214 
   214 
   215 end;
   215 end;
   216 
   216 
   217 
   217 
   218 structure RandomPredCompFuns =
   218 structure RandomPredCompFuns =
   219 struct
   219 struct
   220 
   220 
   221 fun mk_randompredT T =
   221 fun mk_randompredT T =
   222   @{typ Random.seed} --> HOLogic.mk_prodT (Predicate_Comp_Funs.mk_predT T, @{typ Random.seed})
   222   @{typ Random.seed} --> HOLogic.mk_prodT (Predicate_Comp_Funs.mk_monadT T, @{typ Random.seed})
   223 
   223 
   224 fun dest_randompredT (Type ("fun", [@{typ Random.seed}, Type (@{type_name Product_Type.prod},
   224 fun dest_randompredT (Type ("fun", [@{typ Random.seed}, Type (@{type_name Product_Type.prod},
   225   [Type (@{type_name "Predicate.pred"}, [T]), @{typ Random.seed}])])) = T
   225   [Type (@{type_name "Predicate.pred"}, [T]), @{typ Random.seed}])])) = T
   226   | dest_randompredT T = raise TYPE ("dest_randompredT", [T], []);
   226   | dest_randompredT T = raise TYPE ("dest_randompredT", [T], []);
   227 
   227 
   228 fun mk_bot T = Const(@{const_name Quickcheck.empty}, mk_randompredT T)
   228 fun mk_empty T = Const(@{const_name Quickcheck.empty}, mk_randompredT T)
   229 
   229 
   230 fun mk_single t =
   230 fun mk_single t =
   231   let               
   231   let               
   232     val T = fastype_of t
   232     val T = fastype_of t
   233   in
   233   in
   239     val T as (Type ("fun", [_, U])) = fastype_of f
   239     val T as (Type ("fun", [_, U])) = fastype_of f
   240   in
   240   in
   241     Const (@{const_name Quickcheck.bind}, fastype_of x --> T --> U) $ x $ f
   241     Const (@{const_name Quickcheck.bind}, fastype_of x --> T --> U) $ x $ f
   242   end
   242   end
   243 
   243 
   244 val mk_sup = HOLogic.mk_binop @{const_name Quickcheck.union}
   244 val mk_plus = HOLogic.mk_binop @{const_name Quickcheck.union}
   245 
   245 
   246 fun mk_if cond = Const (@{const_name Quickcheck.if_randompred},
   246 fun mk_if cond = Const (@{const_name Quickcheck.if_randompred},
   247   HOLogic.boolT --> mk_randompredT HOLogic.unitT) $ cond;
   247   HOLogic.boolT --> mk_randompredT HOLogic.unitT) $ cond;
   248 
   248 
   249 fun mk_iterate_upto T (f, from, to) =
   249 fun mk_iterate_upto T (f, from, to) =
   258 
   258 
   259 fun mk_map T1 T2 tf tp = Const (@{const_name Quickcheck.map},
   259 fun mk_map T1 T2 tf tp = Const (@{const_name Quickcheck.map},
   260   (T1 --> T2) --> mk_randompredT T1 --> mk_randompredT T2) $ tf $ tp
   260   (T1 --> T2) --> mk_randompredT T1 --> mk_randompredT T2) $ tf $ tp
   261 
   261 
   262 val compfuns = Predicate_Compile_Aux.CompilationFuns
   262 val compfuns = Predicate_Compile_Aux.CompilationFuns
   263     {mk_predT = mk_randompredT, dest_predT = dest_randompredT,
   263     {mk_monadT = mk_randompredT, dest_monadT = dest_randompredT,
   264     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   264     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   265     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   265     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map};
   266 
   266 
   267 end;
   267 end;
   268 
   268 
   269 structure DSequence_CompFuns =
   269 structure DSequence_CompFuns =
   274 
   274 
   275 fun dest_dseqT (Type ("fun", [@{typ code_numeral}, Type ("fun", [@{typ bool},
   275 fun dest_dseqT (Type ("fun", [@{typ code_numeral}, Type ("fun", [@{typ bool},
   276   Type (@{type_name Option.option}, [Type (@{type_name Lazy_Sequence.lazy_sequence}, [T])])])])) = T
   276   Type (@{type_name Option.option}, [Type (@{type_name Lazy_Sequence.lazy_sequence}, [T])])])])) = T
   277   | dest_dseqT T = raise TYPE ("dest_dseqT", [T], []);
   277   | dest_dseqT T = raise TYPE ("dest_dseqT", [T], []);
   278 
   278 
   279 fun mk_bot T = Const (@{const_name DSequence.empty}, mk_dseqT T);
   279 fun mk_empty T = Const (@{const_name DSequence.empty}, mk_dseqT T);
   280 
   280 
   281 fun mk_single t =
   281 fun mk_single t =
   282   let val T = fastype_of t
   282   let val T = fastype_of t
   283   in Const(@{const_name DSequence.single}, T --> mk_dseqT T) $ t end;
   283   in Const(@{const_name DSequence.single}, T --> mk_dseqT T) $ t end;
   284 
   284 
   286   let val T as Type ("fun", [_, U]) = fastype_of f
   286   let val T as Type ("fun", [_, U]) = fastype_of f
   287   in
   287   in
   288     Const (@{const_name DSequence.bind}, fastype_of x --> T --> U) $ x $ f
   288     Const (@{const_name DSequence.bind}, fastype_of x --> T --> U) $ x $ f
   289   end;
   289   end;
   290 
   290 
   291 val mk_sup = HOLogic.mk_binop @{const_name DSequence.union};
   291 val mk_plus = HOLogic.mk_binop @{const_name DSequence.union};
   292 
   292 
   293 fun mk_if cond = Const (@{const_name DSequence.if_seq},
   293 fun mk_if cond = Const (@{const_name DSequence.if_seq},
   294   HOLogic.boolT --> mk_dseqT HOLogic.unitT) $ cond;
   294   HOLogic.boolT --> mk_dseqT HOLogic.unitT) $ cond;
   295 
   295 
   296 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   296 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   300 
   300 
   301 fun mk_map T1 T2 tf tp = Const (@{const_name DSequence.map},
   301 fun mk_map T1 T2 tf tp = Const (@{const_name DSequence.map},
   302   (T1 --> T2) --> mk_dseqT T1 --> mk_dseqT T2) $ tf $ tp
   302   (T1 --> T2) --> mk_dseqT T1 --> mk_dseqT T2) $ tf $ tp
   303 
   303 
   304 val compfuns = Predicate_Compile_Aux.CompilationFuns
   304 val compfuns = Predicate_Compile_Aux.CompilationFuns
   305     {mk_predT = mk_dseqT, dest_predT = dest_dseqT,
   305     {mk_monadT = mk_dseqT, dest_monadT = dest_dseqT,
   306     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   306     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   307     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   307     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   308 
   308 
   309 end;
   309 end;
   310 
   310 
   311 structure New_Pos_DSequence_CompFuns =
   311 structure New_Pos_DSequence_CompFuns =
   316 
   316 
   317 fun dest_pos_dseqT (Type ("fun", [@{typ code_numeral},
   317 fun dest_pos_dseqT (Type ("fun", [@{typ code_numeral},
   318     Type (@{type_name Lazy_Sequence.lazy_sequence}, [T])])) = T
   318     Type (@{type_name Lazy_Sequence.lazy_sequence}, [T])])) = T
   319   | dest_pos_dseqT T = raise TYPE ("dest_pos_dseqT", [T], []);
   319   | dest_pos_dseqT T = raise TYPE ("dest_pos_dseqT", [T], []);
   320 
   320 
   321 fun mk_bot T = Const (@{const_name New_DSequence.pos_empty}, mk_pos_dseqT T);
   321 fun mk_empty T = Const (@{const_name New_DSequence.pos_empty}, mk_pos_dseqT T);
   322 
   322 
   323 fun mk_single t =
   323 fun mk_single t =
   324   let
   324   let
   325     val T = fastype_of t
   325     val T = fastype_of t
   326   in Const(@{const_name New_DSequence.pos_single}, T --> mk_pos_dseqT T) $ t end;
   326   in Const(@{const_name New_DSequence.pos_single}, T --> mk_pos_dseqT T) $ t end;
   337     val T as Type ("fun", [_, U]) = fastype_of f
   337     val T as Type ("fun", [_, U]) = fastype_of f
   338   in
   338   in
   339     Const (@{const_name New_DSequence.pos_decr_bind}, fastype_of x --> T --> U) $ x $ f
   339     Const (@{const_name New_DSequence.pos_decr_bind}, fastype_of x --> T --> U) $ x $ f
   340   end;
   340   end;
   341 
   341 
   342 val mk_sup = HOLogic.mk_binop @{const_name New_DSequence.pos_union};
   342 val mk_plus = HOLogic.mk_binop @{const_name New_DSequence.pos_union};
   343 
   343 
   344 fun mk_if cond = Const (@{const_name New_DSequence.pos_if_seq},
   344 fun mk_if cond = Const (@{const_name New_DSequence.pos_if_seq},
   345   HOLogic.boolT --> mk_pos_dseqT HOLogic.unitT) $ cond;
   345   HOLogic.boolT --> mk_pos_dseqT HOLogic.unitT) $ cond;
   346 
   346 
   347 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   347 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   356 
   356 
   357 fun mk_map T1 T2 tf tp = Const (@{const_name New_DSequence.pos_map},
   357 fun mk_map T1 T2 tf tp = Const (@{const_name New_DSequence.pos_map},
   358   (T1 --> T2) --> mk_pos_dseqT T1 --> mk_pos_dseqT T2) $ tf $ tp
   358   (T1 --> T2) --> mk_pos_dseqT T1 --> mk_pos_dseqT T2) $ tf $ tp
   359 
   359 
   360 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   360 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   361     {mk_predT = mk_pos_dseqT, dest_predT = dest_pos_dseqT,
   361     {mk_monadT = mk_pos_dseqT, dest_monadT = dest_pos_dseqT,
   362     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_decr_bind, mk_sup = mk_sup, mk_if = mk_if,
   362     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_decr_bind, mk_plus = mk_plus, mk_if = mk_if,
   363     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   363     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   364 
   364 
   365 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   365 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   366     {mk_predT = mk_pos_dseqT, dest_predT = dest_pos_dseqT,
   366     {mk_monadT = mk_pos_dseqT, dest_monadT = dest_pos_dseqT,
   367     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   367     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   368     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   368     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   369 
   369 
   370 end;
   370 end;
   371 
   371 
   372 structure New_Neg_DSequence_CompFuns =
   372 structure New_Neg_DSequence_CompFuns =
   377 
   377 
   378 fun dest_neg_dseqT (Type ("fun", [@{typ code_numeral},
   378 fun dest_neg_dseqT (Type ("fun", [@{typ code_numeral},
   379     Type (@{type_name Lazy_Sequence.lazy_sequence}, [Type (@{type_name Option.option}, [T])])])) = T
   379     Type (@{type_name Lazy_Sequence.lazy_sequence}, [Type (@{type_name Option.option}, [T])])])) = T
   380   | dest_neg_dseqT T = raise TYPE ("dest_neg_dseqT", [T], []);
   380   | dest_neg_dseqT T = raise TYPE ("dest_neg_dseqT", [T], []);
   381 
   381 
   382 fun mk_bot T = Const (@{const_name New_DSequence.neg_empty}, mk_neg_dseqT T);
   382 fun mk_empty T = Const (@{const_name New_DSequence.neg_empty}, mk_neg_dseqT T);
   383 
   383 
   384 fun mk_single t =
   384 fun mk_single t =
   385   let
   385   let
   386     val T = fastype_of t
   386     val T = fastype_of t
   387   in Const(@{const_name New_DSequence.neg_single}, T --> mk_neg_dseqT T) $ t end;
   387   in Const(@{const_name New_DSequence.neg_single}, T --> mk_neg_dseqT T) $ t end;
   398     val T as Type ("fun", [_, U]) = fastype_of f
   398     val T as Type ("fun", [_, U]) = fastype_of f
   399   in
   399   in
   400     Const (@{const_name New_DSequence.neg_decr_bind}, fastype_of x --> T --> U) $ x $ f
   400     Const (@{const_name New_DSequence.neg_decr_bind}, fastype_of x --> T --> U) $ x $ f
   401   end;
   401   end;
   402 
   402 
   403 val mk_sup = HOLogic.mk_binop @{const_name New_DSequence.neg_union};
   403 val mk_plus = HOLogic.mk_binop @{const_name New_DSequence.neg_union};
   404 
   404 
   405 fun mk_if cond = Const (@{const_name New_DSequence.neg_if_seq},
   405 fun mk_if cond = Const (@{const_name New_DSequence.neg_if_seq},
   406   HOLogic.boolT --> mk_neg_dseqT HOLogic.unitT) $ cond;
   406   HOLogic.boolT --> mk_neg_dseqT HOLogic.unitT) $ cond;
   407 
   407 
   408 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   408 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   417 
   417 
   418 fun mk_map T1 T2 tf tp = Const (@{const_name New_DSequence.neg_map},
   418 fun mk_map T1 T2 tf tp = Const (@{const_name New_DSequence.neg_map},
   419   (T1 --> T2) --> mk_neg_dseqT T1 --> mk_neg_dseqT T2) $ tf $ tp
   419   (T1 --> T2) --> mk_neg_dseqT T1 --> mk_neg_dseqT T2) $ tf $ tp
   420 
   420 
   421 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   421 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   422     {mk_predT = mk_neg_dseqT, dest_predT = dest_neg_dseqT,
   422     {mk_monadT = mk_neg_dseqT, dest_monadT = dest_neg_dseqT,
   423     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_decr_bind, mk_sup = mk_sup, mk_if = mk_if,
   423     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_decr_bind, mk_plus = mk_plus, mk_if = mk_if,
   424     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   424     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   425 
   425 
   426 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   426 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   427     {mk_predT = mk_neg_dseqT, dest_predT = dest_neg_dseqT,
   427     {mk_monadT = mk_neg_dseqT, dest_monadT = dest_neg_dseqT,
   428     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   428     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   429     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   429     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   430 
   430 
   431 end;
   431 end;
   432 
   432 
   433 structure New_Pos_Random_Sequence_CompFuns =
   433 structure New_Pos_Random_Sequence_CompFuns =
   440 fun dest_pos_random_dseqT (Type ("fun", [@{typ code_numeral}, Type ("fun", [@{typ code_numeral},
   440 fun dest_pos_random_dseqT (Type ("fun", [@{typ code_numeral}, Type ("fun", [@{typ code_numeral},
   441     Type ("fun", [@{typ Random.seed}, Type ("fun", [@{typ code_numeral},
   441     Type ("fun", [@{typ Random.seed}, Type ("fun", [@{typ code_numeral},
   442     Type (@{type_name Lazy_Sequence.lazy_sequence}, [T])])])])])) = T
   442     Type (@{type_name Lazy_Sequence.lazy_sequence}, [T])])])])])) = T
   443   | dest_pos_random_dseqT T = raise TYPE ("dest_random_dseqT", [T], []);
   443   | dest_pos_random_dseqT T = raise TYPE ("dest_random_dseqT", [T], []);
   444 
   444 
   445 fun mk_bot T = Const (@{const_name New_Random_Sequence.pos_empty}, mk_pos_random_dseqT T);
   445 fun mk_empty T = Const (@{const_name New_Random_Sequence.pos_empty}, mk_pos_random_dseqT T);
   446 
   446 
   447 fun mk_single t =
   447 fun mk_single t =
   448   let
   448   let
   449     val T = fastype_of t
   449     val T = fastype_of t
   450   in Const(@{const_name New_Random_Sequence.pos_single}, T --> mk_pos_random_dseqT T) $ t end;
   450   in Const(@{const_name New_Random_Sequence.pos_single}, T --> mk_pos_random_dseqT T) $ t end;
   461     val T as Type ("fun", [_, U]) = fastype_of f
   461     val T as Type ("fun", [_, U]) = fastype_of f
   462   in
   462   in
   463     Const (@{const_name New_Random_Sequence.pos_decr_bind}, fastype_of x --> T --> U) $ x $ f
   463     Const (@{const_name New_Random_Sequence.pos_decr_bind}, fastype_of x --> T --> U) $ x $ f
   464   end;
   464   end;
   465 
   465 
   466 val mk_sup = HOLogic.mk_binop @{const_name New_Random_Sequence.pos_union};
   466 val mk_plus = HOLogic.mk_binop @{const_name New_Random_Sequence.pos_union};
   467 
   467 
   468 fun mk_if cond = Const (@{const_name New_Random_Sequence.pos_if_random_dseq},
   468 fun mk_if cond = Const (@{const_name New_Random_Sequence.pos_if_random_dseq},
   469   HOLogic.boolT --> mk_pos_random_dseqT HOLogic.unitT) $ cond;
   469   HOLogic.boolT --> mk_pos_random_dseqT HOLogic.unitT) $ cond;
   470 
   470 
   471 fun mk_iterate_upto T (f, from, to) =
   471 fun mk_iterate_upto T (f, from, to) =
   485 
   485 
   486 fun mk_map T1 T2 tf tp = Const (@{const_name New_Random_Sequence.pos_map},
   486 fun mk_map T1 T2 tf tp = Const (@{const_name New_Random_Sequence.pos_map},
   487   (T1 --> T2) --> mk_pos_random_dseqT T1 --> mk_pos_random_dseqT T2) $ tf $ tp
   487   (T1 --> T2) --> mk_pos_random_dseqT T1 --> mk_pos_random_dseqT T2) $ tf $ tp
   488 
   488 
   489 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   489 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   490     {mk_predT = mk_pos_random_dseqT, dest_predT = dest_pos_random_dseqT,
   490     {mk_monadT = mk_pos_random_dseqT, dest_monadT = dest_pos_random_dseqT,
   491     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_decr_bind, mk_sup = mk_sup, mk_if = mk_if,
   491     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_decr_bind, mk_plus = mk_plus, mk_if = mk_if,
   492     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   492     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   493 
   493 
   494 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   494 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   495     {mk_predT = mk_pos_random_dseqT, dest_predT = dest_pos_random_dseqT,
   495     {mk_monadT = mk_pos_random_dseqT, dest_monadT = dest_pos_random_dseqT,
   496     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   496     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   497     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   497     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   498 end;
   498 end;
   499 
   499 
   500 structure New_Neg_Random_Sequence_CompFuns =
   500 structure New_Neg_Random_Sequence_CompFuns =
   501 struct
   501 struct
   509     Type ("fun", [@{typ Random.seed}, Type ("fun", [@{typ code_numeral},
   509     Type ("fun", [@{typ Random.seed}, Type ("fun", [@{typ code_numeral},
   510       Type (@{type_name Lazy_Sequence.lazy_sequence},
   510       Type (@{type_name Lazy_Sequence.lazy_sequence},
   511         [Type (@{type_name Option.option}, [T])])])])])])) = T
   511         [Type (@{type_name Option.option}, [T])])])])])])) = T
   512   | dest_neg_random_dseqT T = raise TYPE ("dest_random_dseqT", [T], []);
   512   | dest_neg_random_dseqT T = raise TYPE ("dest_random_dseqT", [T], []);
   513 
   513 
   514 fun mk_bot T = Const (@{const_name New_Random_Sequence.neg_empty}, mk_neg_random_dseqT T);
   514 fun mk_empty T = Const (@{const_name New_Random_Sequence.neg_empty}, mk_neg_random_dseqT T);
   515 
   515 
   516 fun mk_single t =
   516 fun mk_single t =
   517   let
   517   let
   518     val T = fastype_of t
   518     val T = fastype_of t
   519   in Const(@{const_name New_Random_Sequence.neg_single}, T --> mk_neg_random_dseqT T) $ t end;
   519   in Const(@{const_name New_Random_Sequence.neg_single}, T --> mk_neg_random_dseqT T) $ t end;
   530     val T as Type ("fun", [_, U]) = fastype_of f
   530     val T as Type ("fun", [_, U]) = fastype_of f
   531   in
   531   in
   532     Const (@{const_name New_Random_Sequence.neg_decr_bind}, fastype_of x --> T --> U) $ x $ f
   532     Const (@{const_name New_Random_Sequence.neg_decr_bind}, fastype_of x --> T --> U) $ x $ f
   533   end;
   533   end;
   534 
   534 
   535 val mk_sup = HOLogic.mk_binop @{const_name New_Random_Sequence.neg_union};
   535 val mk_plus = HOLogic.mk_binop @{const_name New_Random_Sequence.neg_union};
   536 
   536 
   537 fun mk_if cond = Const (@{const_name New_Random_Sequence.neg_if_random_dseq},
   537 fun mk_if cond = Const (@{const_name New_Random_Sequence.neg_if_random_dseq},
   538   HOLogic.boolT --> mk_neg_random_dseqT HOLogic.unitT) $ cond;
   538   HOLogic.boolT --> mk_neg_random_dseqT HOLogic.unitT) $ cond;
   539 
   539 
   540 fun mk_iterate_upto T (f, from, to) =
   540 fun mk_iterate_upto T (f, from, to) =
   552 
   552 
   553 fun mk_map T1 T2 tf tp = Const (@{const_name New_Random_Sequence.neg_map},
   553 fun mk_map T1 T2 tf tp = Const (@{const_name New_Random_Sequence.neg_map},
   554   (T1 --> T2) --> mk_neg_random_dseqT T1 --> mk_neg_random_dseqT T2) $ tf $ tp
   554   (T1 --> T2) --> mk_neg_random_dseqT T1 --> mk_neg_random_dseqT T2) $ tf $ tp
   555 
   555 
   556 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   556 val depth_limited_compfuns = Predicate_Compile_Aux.CompilationFuns
   557     {mk_predT = mk_neg_random_dseqT, dest_predT = dest_neg_random_dseqT,
   557     {mk_monadT = mk_neg_random_dseqT, dest_monadT = dest_neg_random_dseqT,
   558     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_decr_bind, mk_sup = mk_sup, mk_if = mk_if,
   558     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_decr_bind, mk_plus = mk_plus, mk_if = mk_if,
   559     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   559     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   560 
   560 
   561 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   561 val depth_unlimited_compfuns = Predicate_Compile_Aux.CompilationFuns
   562     {mk_predT = mk_neg_random_dseqT, dest_predT = dest_neg_random_dseqT,
   562     {mk_monadT = mk_neg_random_dseqT, dest_monadT = dest_neg_random_dseqT,
   563     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   563     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   564     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   564     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   565 
   565 
   566 end;
   566 end;
   567 
   567 
   568 structure Random_Sequence_CompFuns =
   568 structure Random_Sequence_CompFuns =
   575 fun dest_random_dseqT (Type ("fun", [@{typ code_numeral}, Type ("fun", [@{typ code_numeral},
   575 fun dest_random_dseqT (Type ("fun", [@{typ code_numeral}, Type ("fun", [@{typ code_numeral},
   576   Type ("fun", [@{typ Random.seed},
   576   Type ("fun", [@{typ Random.seed},
   577   Type (@{type_name Product_Type.prod}, [T, @{typ Random.seed}])])])])) = DSequence_CompFuns.dest_dseqT T
   577   Type (@{type_name Product_Type.prod}, [T, @{typ Random.seed}])])])])) = DSequence_CompFuns.dest_dseqT T
   578   | dest_random_dseqT T = raise TYPE ("dest_random_dseqT", [T], []);
   578   | dest_random_dseqT T = raise TYPE ("dest_random_dseqT", [T], []);
   579 
   579 
   580 fun mk_bot T = Const (@{const_name Random_Sequence.empty}, mk_random_dseqT T);
   580 fun mk_empty T = Const (@{const_name Random_Sequence.empty}, mk_random_dseqT T);
   581 
   581 
   582 fun mk_single t =
   582 fun mk_single t =
   583   let
   583   let
   584     val T = fastype_of t
   584     val T = fastype_of t
   585   in Const(@{const_name Random_Sequence.single}, T --> mk_random_dseqT T) $ t end;
   585   in Const(@{const_name Random_Sequence.single}, T --> mk_random_dseqT T) $ t end;
   589     val T as Type ("fun", [_, U]) = fastype_of f
   589     val T as Type ("fun", [_, U]) = fastype_of f
   590   in
   590   in
   591     Const (@{const_name Random_Sequence.bind}, fastype_of x --> T --> U) $ x $ f
   591     Const (@{const_name Random_Sequence.bind}, fastype_of x --> T --> U) $ x $ f
   592   end;
   592   end;
   593 
   593 
   594 val mk_sup = HOLogic.mk_binop @{const_name Random_Sequence.union};
   594 val mk_plus = HOLogic.mk_binop @{const_name Random_Sequence.union};
   595 
   595 
   596 fun mk_if cond = Const (@{const_name Random_Sequence.if_random_dseq},
   596 fun mk_if cond = Const (@{const_name Random_Sequence.if_random_dseq},
   597   HOLogic.boolT --> mk_random_dseqT HOLogic.unitT) $ cond;
   597   HOLogic.boolT --> mk_random_dseqT HOLogic.unitT) $ cond;
   598 
   598 
   599 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   599 fun mk_iterate_upto T (f, from, to) = raise Fail "No iterate_upto compilation"
   605 
   605 
   606 fun mk_map T1 T2 tf tp = Const (@{const_name Random_Sequence.map},
   606 fun mk_map T1 T2 tf tp = Const (@{const_name Random_Sequence.map},
   607   (T1 --> T2) --> mk_random_dseqT T1 --> mk_random_dseqT T2) $ tf $ tp
   607   (T1 --> T2) --> mk_random_dseqT T1 --> mk_random_dseqT T2) $ tf $ tp
   608 
   608 
   609 val compfuns = Predicate_Compile_Aux.CompilationFuns
   609 val compfuns = Predicate_Compile_Aux.CompilationFuns
   610     {mk_predT = mk_random_dseqT, dest_predT = dest_random_dseqT,
   610     {mk_monadT = mk_random_dseqT, dest_monadT = dest_random_dseqT,
   611     mk_bot = mk_bot, mk_single = mk_single, mk_bind = mk_bind, mk_sup = mk_sup, mk_if = mk_if,
   611     mk_empty = mk_empty, mk_single = mk_single, mk_bind = mk_bind, mk_plus = mk_plus, mk_if = mk_if,
   612     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   612     mk_iterate_upto = mk_iterate_upto, mk_not = mk_not, mk_map = mk_map}
   613 
   613 
   614 end;
   614 end;
   615 
   615