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 |