src/HOL/Tools/inductive_realizer.ML
changeset 14888 99ac3eb0f84e
parent 13928 d572aeea3ff3
child 14981 e73f8140af78
equal deleted inserted replaced
14887:4938ce4ef295 14888:99ac3eb0f84e
   232     in
   232     in
   233       if length concls = 1 then lambda x r' else r'
   233       if length concls = 1 then lambda x r' else r'
   234     end
   234     end
   235   end;
   235   end;
   236 
   236 
   237 val nonempty_msg = explode "Nonemptiness check failed for datatype ";
       
   238 
       
   239 fun add_dummy name dname (x as (_, (vs, s, mfx, cs))) =
   237 fun add_dummy name dname (x as (_, (vs, s, mfx, cs))) =
   240   if name = s then (true, (vs, s, mfx, (dname, [HOLogic.unitT], NoSyn) :: cs))
   238   if name = s then (true, (vs, s, mfx, (dname, [HOLogic.unitT], NoSyn) :: cs))
   241   else x;
   239   else x;
   242 
   240 
   243 fun add_dummies f dts used thy =
   241 fun add_dummies f dts used thy =
   244   apsnd (pair (map fst dts)) (transform_error (f (map snd dts)) thy)
   242   apsnd (pair (map fst dts)) (f (map snd dts) thy)
   245   handle ERROR_MESSAGE msg => if nonempty_msg prefix explode msg then
   243   handle DatatypeAux.Datatype_Empty name' =>
   246       let
   244       let
   247         val name = Sign.base_name
   245         val name = Sign.base_name name';
   248           (implode (drop (length nonempty_msg, explode msg)));
       
   249         val dname = variant used "Dummy"
   246         val dname = variant used "Dummy"
   250       in add_dummies f (map (add_dummy name dname) dts) (dname :: used) thy
   247       in add_dummies f (map (add_dummy name dname) dts) (dname :: used) thy
   251       end
   248       end;
   252     else error msg;
       
   253 
   249 
   254 fun mk_realizer thy vs params ((rule, rrule), rt) =
   250 fun mk_realizer thy vs params ((rule, rrule), rt) =
   255   let
   251   let
   256     val prems = prems_of rule ~~ prems_of rrule;
   252     val prems = prems_of rule ~~ prems_of rrule;
   257     val rvs = map fst (relevant_vars (prop_of rule));
   253     val rvs = map fst (relevant_vars (prop_of rule));
   310 
   306 
   311     (** datatype representing computational content of inductive set **)
   307     (** datatype representing computational content of inductive set **)
   312 
   308 
   313     val (thy2, (dummies, dt_info)) = thy1 |>
   309     val (thy2, (dummies, dt_info)) = thy1 |>
   314       (if null dts then rpair ([], None) else
   310       (if null dts then rpair ([], None) else
   315         apsnd (apsnd Some) o add_dummies (DatatypePackage.add_datatype_i false
   311         apsnd (apsnd Some) o add_dummies (DatatypePackage.add_datatype_i false false
   316           (map #2 dts)) (map (pair false) dts) []) |>>
   312           (map #2 dts)) (map (pair false) dts) []) |>>
   317       Extraction.add_typeof_eqns_i ty_eqs |>>
   313       Extraction.add_typeof_eqns_i ty_eqs |>>
   318       Extraction.add_realizes_eqns_i rlz_eqs;
   314       Extraction.add_realizes_eqns_i rlz_eqs;
   319     fun get f x = if_none (apsome f x) [];
   315     fun get f x = if_none (apsome f x) [];
   320     val rec_names = distinct (map (fst o dest_Const o head_of o fst o
   316     val rec_names = distinct (map (fst o dest_Const o head_of o fst o