src/HOL/Tools/inductive_realizer.ML
changeset 29271 1d685baea08e
parent 29265 5b4247055bd7
child 29281 b22ccb3998db
equal deleted inserted replaced
29270:0eade173f77e 29271:1d685baea08e
    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