src/HOL/Nominal/nominal_primrec.ML
changeset 30223 24d975352879
parent 29581 b3b33e0298eb
child 30251 7aec011818e0
equal deleted inserted replaced
30222:4102bbf2af21 30223:24d975352879
   208     val raw_rhs = list_abs_free (frees,
   208     val raw_rhs = list_abs_free (frees,
   209       list_comb (Const (rec_name, dummyT), fs @ [Free x]))
   209       list_comb (Const (rec_name, dummyT), fs @ [Free x]))
   210     val def_name = Thm.def_name (Sign.base_name fname);
   210     val def_name = Thm.def_name (Sign.base_name fname);
   211     val rhs = singleton (Syntax.check_terms ctxt) raw_rhs;
   211     val rhs = singleton (Syntax.check_terms ctxt) raw_rhs;
   212     val SOME var = get_first (fn ((b, _), mx) =>
   212     val SOME var = get_first (fn ((b, _), mx) =>
   213       if Binding.base_name b = fname then SOME (b, mx) else NONE) fixes;
   213       if Binding.name_of b = fname then SOME (b, mx) else NONE) fixes;
   214   in
   214   in
   215     ((var, ((Binding.name def_name, []), rhs)),
   215     ((var, ((Binding.name def_name, []), rhs)),
   216      subst_bounds (rev (map Free frees), strip_abs_body rhs))
   216      subst_bounds (rev (map Free frees), strip_abs_body rhs))
   217   end;
   217   end;
   218 
   218 
   246     val (fixes', spec) = prepare_spec prep_spec lthy (raw_fixes @ raw_params) raw_spec;
   246     val (fixes', spec) = prepare_spec prep_spec lthy (raw_fixes @ raw_params) raw_spec;
   247     val fixes = List.take (fixes', length raw_fixes);
   247     val fixes = List.take (fixes', length raw_fixes);
   248     val (names_atts, spec') = split_list spec;
   248     val (names_atts, spec') = split_list spec;
   249     val eqns' = map unquantify spec'
   249     val eqns' = map unquantify spec'
   250     val eqns = fold_rev (process_eqn lthy (fn v => Variable.is_fixed lthy v
   250     val eqns = fold_rev (process_eqn lthy (fn v => Variable.is_fixed lthy v
   251       orelse exists (fn ((w, _), _) => v = Binding.base_name w) fixes)) spec' [];
   251       orelse exists (fn ((w, _), _) => v = Binding.name_of w) fixes)) spec' [];
   252     val dt_info = NominalPackage.get_nominal_datatypes (ProofContext.theory_of lthy);
   252     val dt_info = NominalPackage.get_nominal_datatypes (ProofContext.theory_of lthy);
   253     val lsrs :: lsrss = maps (fn (_, (_, _, eqns)) =>
   253     val lsrs :: lsrss = maps (fn (_, (_, _, eqns)) =>
   254       map (fn (_, (ls, _, rs, _, _)) => ls @ rs) eqns) eqns
   254       map (fn (_, (ls, _, rs, _, _)) => ls @ rs) eqns) eqns
   255     val _ =
   255     val _ =
   256       (if forall (curry eq_set lsrs) lsrss andalso forall
   256       (if forall (curry eq_set lsrs) lsrss andalso forall
   283         "\nare not mutually recursive");
   283         "\nare not mutually recursive");
   284     val (defs_thms, lthy') = lthy |>
   284     val (defs_thms, lthy') = lthy |>
   285       set_group ? LocalTheory.set_group (serial_string ()) |>
   285       set_group ? LocalTheory.set_group (serial_string ()) |>
   286       fold_map (apfst (snd o snd) oo
   286       fold_map (apfst (snd o snd) oo
   287         LocalTheory.define Thm.definitionK o fst) defs';
   287         LocalTheory.define Thm.definitionK o fst) defs';
   288     val qualify = Binding.qualify
   288     val qualify = Binding.qualify false
   289       (space_implode "_" (map (Sign.base_name o #1) defs));
   289       (space_implode "_" (map (Sign.base_name o #1) defs));
   290     val names_atts' = map (apfst qualify) names_atts;
   290     val names_atts' = map (apfst qualify) names_atts;
   291     val cert = cterm_of (ProofContext.theory_of lthy');
   291     val cert = cterm_of (ProofContext.theory_of lthy');
   292 
   292 
   293     fun mk_idx eq =
   293     fun mk_idx eq =