src/HOL/Nominal/nominal_primrec.ML
changeset 58112 8081087096ad
parent 58002 0ed1e999a0fb
child 58956 a816aa3ff391
equal deleted inserted replaced
58111:82db9ad610b9 58112:8081087096ad
   152           NONE => (warning ("No equation for constructor " ^ quote cname ^
   152           NONE => (warning ("No equation for constructor " ^ quote cname ^
   153             "\nin definition of function " ^ quote fname);
   153             "\nin definition of function " ^ quote fname);
   154               (fnames', fnss', (Const (@{const_name undefined}, dummyT))::fns))
   154               (fnames', fnss', (Const (@{const_name undefined}, dummyT))::fns))
   155         | SOME (ls, cargs', rs, rhs, eq) =>
   155         | SOME (ls, cargs', rs, rhs, eq) =>
   156             let
   156             let
   157               val recs = filter (Datatype_Aux.is_rec_type o snd) (cargs' ~~ cargs);
   157               val recs = filter (Old_Datatype_Aux.is_rec_type o snd) (cargs' ~~ cargs);
   158               val rargs = map fst recs;
   158               val rargs = map fst recs;
   159               val subs = map (rpair dummyT o fst)
   159               val subs = map (rpair dummyT o fst)
   160                 (rev (Term.rename_wrt_term rhs rargs));
   160                 (rev (Term.rename_wrt_term rhs rargs));
   161               val (rhs', (fnames'', fnss'')) = subst (map2 (fn (x, y) => fn z =>
   161               val (rhs', (fnames'', fnss'')) = subst (map2 (fn (x, y) => fn z =>
   162                 (Free x, (Datatype_Aux.body_index y, Free z))) recs subs) rhs (fnames', fnss')
   162                 (Free x, (Old_Datatype_Aux.body_index y, Free z))) recs subs) rhs (fnames', fnss')
   163                   handle RecError s => primrec_eq_err lthy s eq
   163                   handle RecError s => primrec_eq_err lthy s eq
   164             in (fnames'', fnss'', fold_rev absfree (cargs' @ subs) rhs' :: fns)
   164             in (fnames'', fnss'', fold_rev absfree (cargs' @ subs) rhs' :: fns)
   165             end)
   165             end)
   166 
   166 
   167   in (case AList.lookup (op =) fnames i of
   167   in (case AList.lookup (op =) fnames i of
   188 fun get_fns fns ((i : int, (tname, _, constrs)), rec_name) (fs, defs) =
   188 fun get_fns fns ((i : int, (tname, _, constrs)), rec_name) (fs, defs) =
   189   case AList.lookup (op =) fns i of
   189   case AList.lookup (op =) fns i of
   190      NONE =>
   190      NONE =>
   191        let
   191        let
   192          val dummy_fns = map (fn (_, cargs) => Const (@{const_name undefined},
   192          val dummy_fns = map (fn (_, cargs) => Const (@{const_name undefined},
   193            replicate (length cargs + length (filter Datatype_Aux.is_rec_type cargs))
   193            replicate (length cargs + length (filter Old_Datatype_Aux.is_rec_type cargs))
   194              dummyT ---> HOLogic.unitT)) constrs;
   194              dummyT ---> HOLogic.unitT)) constrs;
   195          val _ = warning ("No function definition for datatype " ^ quote tname)
   195          val _ = warning ("No function definition for datatype " ^ quote tname)
   196        in
   196        in
   197          (dummy_fns @ fs, defs)
   197          (dummy_fns @ fs, defs)
   198        end
   198        end