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 = |