src/HOL/Nominal/nominal_primrec.ML
changeset 33038 8f9594c31de4
parent 33037 b22e44496dc2
child 33040 cffdb7b28498
equal deleted inserted replaced
33037:b22e44496dc2 33038:8f9594c31de4
   226 fun find_dts (dt_info : NominalDatatype.nominal_datatype_info Symtab.table) _ [] = []
   226 fun find_dts (dt_info : NominalDatatype.nominal_datatype_info Symtab.table) _ [] = []
   227   | find_dts dt_info tnames' (tname::tnames) =
   227   | find_dts dt_info tnames' (tname::tnames) =
   228       (case Symtab.lookup dt_info tname of
   228       (case Symtab.lookup dt_info tname of
   229           NONE => primrec_err (quote tname ^ " is not a nominal datatype")
   229           NONE => primrec_err (quote tname ^ " is not a nominal datatype")
   230         | SOME dt =>
   230         | SOME dt =>
   231             if gen_subset (op =) (tnames', map (#1 o snd) (#descr dt)) then
   231             if subset (op =) (tnames', map (#1 o snd) (#descr dt)) then
   232               (tname, dt)::(find_dts dt_info tnames' tnames)
   232               (tname, dt)::(find_dts dt_info tnames' tnames)
   233             else find_dts dt_info tnames' tnames);
   233             else find_dts dt_info tnames' tnames);
   234 
   234 
   235 fun common_prefix eq ([], _) = []
   235 fun common_prefix eq ([], _) = []
   236   | common_prefix eq (_, []) = []
   236   | common_prefix eq (_, []) = []
   249       orelse exists (fn ((w, _), _) => v = Binding.name_of w) fixes)) spec' [];
   249       orelse exists (fn ((w, _), _) => v = Binding.name_of w) fixes)) spec' [];
   250     val dt_info = NominalDatatype.get_nominal_datatypes (ProofContext.theory_of lthy);
   250     val dt_info = NominalDatatype.get_nominal_datatypes (ProofContext.theory_of lthy);
   251     val lsrs :: lsrss = maps (fn (_, (_, _, eqns)) =>
   251     val lsrs :: lsrss = maps (fn (_, (_, _, eqns)) =>
   252       map (fn (_, (ls, _, rs, _, _)) => ls @ rs) eqns) eqns
   252       map (fn (_, (ls, _, rs, _, _)) => ls @ rs) eqns) eqns
   253     val _ =
   253     val _ =
   254       (if forall (curry (gen_eq_set (op =)) lsrs) lsrss andalso forall
   254       (if forall (curry (eq_set (op =)) lsrs) lsrss andalso forall
   255          (fn (_, (_, _, (_, (ls, _, rs, _, _)) :: eqns)) =>
   255          (fn (_, (_, _, (_, (ls, _, rs, _, _)) :: eqns)) =>
   256                forall (fn (_, (ls', _, rs', _, _)) =>
   256                forall (fn (_, (ls', _, rs', _, _)) =>
   257                  ls = ls' andalso rs = rs') eqns
   257                  ls = ls' andalso rs = rs') eqns
   258            | _ => true) eqns
   258            | _ => true) eqns
   259        then () else primrec_err param_err);
   259        then () else primrec_err param_err);
   274     val (fnames, fnss) = fold_rev (process_fun lthy descr eqns) main_fns ([], []);
   274     val (fnames, fnss) = fold_rev (process_fun lthy descr eqns) main_fns ([], []);
   275     val (fs, defs) = fold_rev (get_fns fnss) (descr ~~ rec_names) ([], []);
   275     val (fs, defs) = fold_rev (get_fns fnss) (descr ~~ rec_names) ([], []);
   276     val defs' = map (make_def lthy fixes fs) defs;
   276     val defs' = map (make_def lthy fixes fs) defs;
   277     val names1 = map snd fnames;
   277     val names1 = map snd fnames;
   278     val names2 = map fst eqns;
   278     val names2 = map fst eqns;
   279     val _ = if gen_eq_set (op =) (names1, names2) then ()
   279     val _ = if eq_set (op =) (names1, names2) then ()
   280       else primrec_err ("functions " ^ commas_quote names2 ^
   280       else primrec_err ("functions " ^ commas_quote names2 ^
   281         "\nare not mutually recursive");
   281         "\nare not mutually recursive");
   282     val (defs_thms, lthy') = lthy |>
   282     val (defs_thms, lthy') = lthy |>
   283       set_group ? LocalTheory.set_group (serial_string ()) |>
   283       set_group ? LocalTheory.set_group (serial_string ()) |>
   284       fold_map (apfst (snd o snd) oo
   284       fold_map (apfst (snd o snd) oo