src/HOL/Tools/Datatype/datatype_realizer.ML
changeset 37236 739d8b9c59da
parent 37132 e0c9d3e49e15
parent 37233 b78f31ca4675
child 39028 848be46708dc
     1.1 --- a/src/HOL/Tools/Datatype/datatype_realizer.ML	Tue Jun 01 11:18:51 2010 +0200
     1.2 +++ b/src/HOL/Tools/Datatype/datatype_realizer.ML	Tue Jun 01 11:30:57 2010 +0200
     1.3 @@ -22,10 +22,6 @@
     1.4      in map (fn ks => i::ks) is @ is end
     1.5    else [[]];
     1.6  
     1.7 -fun forall_intr_prf (t, prf) =
     1.8 -  let val (a, T) = (case t of Var ((a, _), T) => (a, T) | Free p => p)
     1.9 -  in Abst (a, SOME T, Proofterm.prf_abstract_over t prf) end;
    1.10 -
    1.11  fun prf_of thm =
    1.12    Reconstruct.reconstruct_proof (Thm.theory_of_thm thm) (Thm.prop_of thm) (Thm.proof_of thm);
    1.13  
    1.14 @@ -130,12 +126,12 @@
    1.15  
    1.16      val ivs = rev (Term.add_vars (Logic.varify_global (Datatype_Prop.make_ind [descr] sorts)) []);
    1.17      val rvs = rev (Thm.fold_terms Term.add_vars thm' []);
    1.18 -    val ivs1 = map Var (filter_out (fn (_, T) =>  (* FIXME set (!??) *)
    1.19 -      member (op =) [@{type_abbrev set}, @{type_name bool}] (tname_of (body_type T))) ivs);
    1.20 +    val ivs1 = map Var (filter_out (fn (_, T) =>
    1.21 +      @{type_name bool} = tname_of (body_type T)) ivs);
    1.22      val ivs2 = map (fn (ixn, _) => Var (ixn, the (AList.lookup (op =) rvs ixn))) ivs;
    1.23  
    1.24      val prf =
    1.25 -      List.foldr forall_intr_prf
    1.26 +      Extraction.abs_corr_shyps thy' induct vs ivs2
    1.27          (fold_rev (fn (f, p) => fn prf =>
    1.28            (case head_of (strip_abs_body f) of
    1.29               Free (s, T) =>
    1.30 @@ -145,7 +141,7 @@
    1.31                 end
    1.32            | _ => AbsP ("H", SOME p, prf)))
    1.33              (rec_fns ~~ prems_of thm)
    1.34 -            (Proofterm.proof_combP (prf_of thm', map PBound (length prems - 1 downto 0)))) ivs2;
    1.35 +            (Proofterm.proof_combP (prf_of thm', map PBound (length prems - 1 downto 0))));
    1.36  
    1.37      val r' =
    1.38        if null is then r
    1.39 @@ -198,18 +194,21 @@
    1.40        ||> Sign.restore_naming thy;
    1.41  
    1.42      val P = Var (("P", 0), rT' --> HOLogic.boolT);
    1.43 -    val prf = forall_intr_prf (y, forall_intr_prf (P,
    1.44 -      fold_rev (fn (p, r) => fn prf =>
    1.45 -          forall_intr_prf (Logic.varify_global r, AbsP ("H", SOME (Logic.varify_global p), prf)))
    1.46 +    val prf = Extraction.abs_corr_shyps thy' exhaust ["P"] [y, P]
    1.47 +      (fold_rev (fn (p, r) => fn prf =>
    1.48 +          Proofterm.forall_intr_proof' (Logic.varify_global r)
    1.49 +            (AbsP ("H", SOME (Logic.varify_global p), prf)))
    1.50          (prems ~~ rs)
    1.51 -        (Proofterm.proof_combP (prf_of thm', map PBound (length prems - 1 downto 0)))));
    1.52 +        (Proofterm.proof_combP (prf_of thm', map PBound (length prems - 1 downto 0))));
    1.53 +    val prf' = Extraction.abs_corr_shyps thy' exhaust []
    1.54 +      (map Var (Term.add_vars (prop_of exhaust) [])) (prf_of exhaust);
    1.55      val r' = Logic.varify_global (Abs ("y", T,
    1.56        list_abs (map dest_Free rs, list_comb (r,
    1.57          map Bound ((length rs - 1 downto 0) @ [length rs])))));
    1.58  
    1.59    in Extraction.add_realizers_i
    1.60      [(exh_name, (["P"], r', prf)),
    1.61 -     (exh_name, ([], Extraction.nullt, prf_of exhaust))] thy'
    1.62 +     (exh_name, ([], Extraction.nullt, prf'))] thy'
    1.63    end;
    1.64  
    1.65  fun add_dt_realizers config names thy =