139 None => (warning ("no equation for constructor " ^ quote cname ^ |
139 None => (warning ("no equation for constructor " ^ quote cname ^ |
140 "\nin definition of function " ^ quote fname); |
140 "\nin definition of function " ^ quote fname); |
141 (fnames', fnss', (Const ("arbitrary", dummyT))::fns)) |
141 (fnames', fnss', (Const ("arbitrary", dummyT))::fns)) |
142 | Some (ls, cargs', rs, rhs, eq) => |
142 | Some (ls, cargs', rs, rhs, eq) => |
143 let |
143 let |
144 fun rec_index (DtRec k) = k |
|
145 | rec_index (DtType ("fun", [_, DtRec k])) = k; |
|
146 |
|
147 val recs = filter (is_rec_type o snd) (cargs' ~~ cargs); |
144 val recs = filter (is_rec_type o snd) (cargs' ~~ cargs); |
148 val rargs = map fst recs; |
145 val rargs = map fst recs; |
149 val subs = map (rpair dummyT o fst) |
146 val subs = map (rpair dummyT o fst) |
150 (rev (rename_wrt_term rhs rargs)); |
147 (rev (rename_wrt_term rhs rargs)); |
151 val ((fnames'', fnss''), rhs') = |
148 val ((fnames'', fnss''), rhs') = |
152 (subst (map (fn ((x, y), z) => |
149 (subst (map (fn ((x, y), z) => |
153 (Free x, (rec_index y, Free z))) |
150 (Free x, (body_index y, Free z))) |
154 (recs ~~ subs)) |
151 (recs ~~ subs)) |
155 ((fnames', fnss'), rhs)) |
152 ((fnames', fnss'), rhs)) |
156 handle RecError s => primrec_eq_err sign s eq |
153 handle RecError s => primrec_eq_err sign s eq |
157 in (fnames'', fnss'', |
154 in (fnames'', fnss'', |
158 (list_abs_free (cargs' @ subs @ ls @ rs, rhs'))::fns) |
155 (list_abs_free (cargs' @ subs @ ls @ rs, rhs'))::fns) |
255 if alt_name = "" then (space_implode "_" (map (Sign.base_name o #1) defs)) else alt_name; |
252 if alt_name = "" then (space_implode "_" (map (Sign.base_name o #1) defs)) else alt_name; |
256 val (thy', defs_thms') = thy |> Theory.add_path primrec_name |> |
253 val (thy', defs_thms') = thy |> Theory.add_path primrec_name |> |
257 (if eq_set (names1, names2) then (PureThy.add_defs_i false o map Thm.no_attributes) defs' |
254 (if eq_set (names1, names2) then (PureThy.add_defs_i false o map Thm.no_attributes) defs' |
258 else primrec_err ("functions " ^ commas_quote names2 ^ |
255 else primrec_err ("functions " ^ commas_quote names2 ^ |
259 "\nare not mutually recursive")); |
256 "\nare not mutually recursive")); |
260 val rewrites = o_def :: (map mk_meta_eq rec_rewrites) @ defs_thms'; |
257 val rewrites = (map mk_meta_eq rec_rewrites) @ defs_thms'; |
261 val _ = message ("Proving equations for primrec function(s) " ^ commas_quote names1 ^ " ..."); |
258 val _ = message ("Proving equations for primrec function(s) " ^ commas_quote names1 ^ " ..."); |
262 val simps = map (fn (_, t) => prove_goalw_cterm rewrites (cterm_of (Theory.sign_of thy') t) |
259 val simps = map (fn (_, t) => prove_goalw_cterm rewrites (cterm_of (Theory.sign_of thy') t) |
263 (fn _ => [rtac refl 1])) eqns; |
260 (fn _ => [rtac refl 1])) eqns; |
264 val (thy'', simps') = PureThy.add_thms ((map fst eqns ~~ simps) ~~ atts) thy'; |
261 val (thy'', simps') = PureThy.add_thms ((map fst eqns ~~ simps) ~~ atts) thy'; |
265 val thy''' = thy'' |
262 val thy''' = thy'' |