47 in strip_all' (s'::used) names' (subst_bound (Free (s', T), t)) end |
47 in strip_all' (s'::used) names' (subst_bound (Free (s', T), t)) end |
48 | strip_all' used names ((t as Const ("==>", _) $ P) $ Q) = |
48 | strip_all' used names ((t as Const ("==>", _) $ P) $ Q) = |
49 t $ strip_all' used names Q |
49 t $ strip_all' used names Q |
50 | strip_all' _ _ t = t; |
50 | strip_all' _ _ t = t; |
51 |
51 |
52 fun strip_all t = strip_all' (add_term_free_names (t, [])) [] t; |
52 fun strip_all t = strip_all' (OldTerm.add_term_free_names (t, [])) [] t; |
53 |
53 |
54 fun strip_one name (Const ("all", _) $ Abs (s, T, Const ("==>", _) $ P $ Q)) = |
54 fun strip_one name (Const ("all", _) $ Abs (s, T, Const ("==>", _) $ P $ Q)) = |
55 (subst_bound (Free (name, T), P), subst_bound (Free (name, T), Q)) |
55 (subst_bound (Free (name, T), P), subst_bound (Free (name, T), Q)) |
56 | strip_one _ (Const ("==>", _) $ P $ Q) = (P, Q); |
56 | strip_one _ (Const ("==>", _) $ P $ Q) = (P, Q); |
57 |
57 |
61 | _ => vs) |
61 | _ => vs) |
62 | (_, vs) => vs) [] (OldTerm.term_vars prop); |
62 | (_, vs) => vs) [] (OldTerm.term_vars prop); |
63 |
63 |
64 fun dt_of_intrs thy vs nparms intrs = |
64 fun dt_of_intrs thy vs nparms intrs = |
65 let |
65 let |
66 val iTs = term_tvars (prop_of (hd intrs)); |
66 val iTs = OldTerm.term_tvars (prop_of (hd intrs)); |
67 val Tvs = map TVar iTs; |
67 val Tvs = map TVar iTs; |
68 val (Const (s, _), ts) = strip_comb (HOLogic.dest_Trueprop |
68 val (Const (s, _), ts) = strip_comb (HOLogic.dest_Trueprop |
69 (Logic.strip_imp_concl (prop_of (hd intrs)))); |
69 (Logic.strip_imp_concl (prop_of (hd intrs)))); |
70 val params = map dest_Var (Library.take (nparms, ts)); |
70 val params = map dest_Var (Library.take (nparms, ts)); |
71 val tname = space_implode "_" (Sign.base_name s ^ "T" :: vs); |
71 val tname = space_implode "_" (Sign.base_name s ^ "T" :: vs); |
98 | gen_rvar _ t = t; |
98 | gen_rvar _ t = t; |
99 |
99 |
100 fun mk_realizes_eqn n vs nparms intrs = |
100 fun mk_realizes_eqn n vs nparms intrs = |
101 let |
101 let |
102 val concl = HOLogic.dest_Trueprop (concl_of (hd intrs)); |
102 val concl = HOLogic.dest_Trueprop (concl_of (hd intrs)); |
103 val iTs = term_tvars concl; |
103 val iTs = OldTerm.term_tvars concl; |
104 val Tvs = map TVar iTs; |
104 val Tvs = map TVar iTs; |
105 val (h as Const (s, T), us) = strip_comb concl; |
105 val (h as Const (s, T), us) = strip_comb concl; |
106 val params = List.take (us, nparms); |
106 val params = List.take (us, nparms); |
107 val elTs = List.drop (binder_types T, nparms); |
107 val elTs = List.drop (binder_types T, nparms); |
108 val predT = elTs ---> HOLogic.boolT; |
108 val predT = elTs ---> HOLogic.boolT; |
144 (Term.add_vars (prop_of intr) [] \\ params); |
144 (Term.add_vars (prop_of intr) [] \\ params); |
145 val rule' = strip_all rule; |
145 val rule' = strip_all rule; |
146 val conclT = Extraction.etype_of thy vs [] (Logic.strip_imp_concl rule'); |
146 val conclT = Extraction.etype_of thy vs [] (Logic.strip_imp_concl rule'); |
147 val used = map (fst o dest_Free) args; |
147 val used = map (fst o dest_Free) args; |
148 |
148 |
149 fun is_rec t = not (null (term_consts t inter rsets)); |
149 val is_rec = exists_Const (fn (c, _) => member (op =) rsets c); |
150 |
150 |
151 fun is_meta (Const ("all", _) $ Abs (s, _, P)) = is_meta P |
151 fun is_meta (Const ("all", _) $ Abs (s, _, P)) = is_meta P |
152 | is_meta (Const ("==>", _) $ _ $ Q) = is_meta Q |
152 | is_meta (Const ("==>", _) $ _ $ Q) = is_meta Q |
153 | is_meta (Const ("Trueprop", _) $ t) = (case head_of t of |
153 | is_meta (Const ("Trueprop", _) $ t) = (case head_of t of |
154 Const (s, _) => can (InductivePackage.the_inductive ctxt) s |
154 Const (s, _) => can (InductivePackage.the_inductive ctxt) s |
273 |
273 |
274 fun add_ind_realizer rsets intrs induct raw_induct elims (thy, vs) = |
274 fun add_ind_realizer rsets intrs induct raw_induct elims (thy, vs) = |
275 let |
275 let |
276 val qualifier = NameSpace.qualifier (name_of_thm induct); |
276 val qualifier = NameSpace.qualifier (name_of_thm induct); |
277 val inducts = PureThy.get_thms thy (NameSpace.qualified qualifier "inducts"); |
277 val inducts = PureThy.get_thms thy (NameSpace.qualified qualifier "inducts"); |
278 val iTs = term_tvars (prop_of (hd intrs)); |
278 val iTs = OldTerm.term_tvars (prop_of (hd intrs)); |
279 val ar = length vs + length iTs; |
279 val ar = length vs + length iTs; |
280 val params = InductivePackage.params_of raw_induct; |
280 val params = InductivePackage.params_of raw_induct; |
281 val arities = InductivePackage.arities_of raw_induct; |
281 val arities = InductivePackage.arities_of raw_induct; |
282 val nparms = length params; |
282 val nparms = length params; |
283 val params' = map dest_Var params; |
283 val params' = map dest_Var params; |
368 (hd (prems_of (hd inducts))))), nparms))) vs; |
368 (hd (prems_of (hd inducts))))), nparms))) vs; |
369 val rs = indrule_realizer thy induct raw_induct rsets params' |
369 val rs = indrule_realizer thy induct raw_induct rsets params' |
370 (vs' @ Ps) rec_names rss' intrs dummies; |
370 (vs' @ Ps) rec_names rss' intrs dummies; |
371 val rlzs = map (fn (r, ind) => Extraction.realizes_of thy (vs' @ Ps) r |
371 val rlzs = map (fn (r, ind) => Extraction.realizes_of thy (vs' @ Ps) r |
372 (prop_of ind)) (rs ~~ inducts); |
372 (prop_of ind)) (rs ~~ inducts); |
373 val used = foldr add_term_free_names [] rlzs; |
373 val used = foldr OldTerm.add_term_free_names [] rlzs; |
374 val rnames = Name.variant_list used (replicate (length inducts) "r"); |
374 val rnames = Name.variant_list used (replicate (length inducts) "r"); |
375 val rnames' = Name.variant_list |
375 val rnames' = Name.variant_list |
376 (used @ rnames) (replicate (length intrs) "s"); |
376 (used @ rnames) (replicate (length intrs) "s"); |
377 val rlzs' as (prems, _, _) :: _ = map (fn (rlz, name) => |
377 val rlzs' as (prems, _, _) :: _ = map (fn (rlz, name) => |
378 let |
378 let |