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 |