src/HOL/Tools/primrec_package.ML
changeset 13641 63d1790a43ed
parent 12876 a70df1e5bf10
child 14258 9bd184c007f0
equal deleted inserted replaced
13640:993576f4de30 13641:63d1790a43ed
   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''