src/HOL/Codatatype/Tools/bnf_fp_sugar.ML
changeset 50390 993677c1cf2a
parent 50387 c62165188971
child 50391 c6366fd0415a
     1.1 --- a/src/HOL/Codatatype/Tools/bnf_fp_sugar.ML	Fri Sep 14 21:26:01 2012 +0200
     1.2 +++ b/src/HOL/Codatatype/Tools/bnf_fp_sugar.ML	Fri Sep 14 22:23:10 2012 +0200
     1.3 @@ -546,7 +546,7 @@
     1.4                  Term.subst_atomic_types (Ts0 ~~ Ts) t
     1.5                end;
     1.6  
     1.7 -            fun mk_prem_prems names_lthy (x as Free (s, T as Type (T_name, Ts0))) =
     1.8 +            fun mk_raw_prem_prems names_lthy (x as Free (s, T as Type (T_name, Ts0))) =
     1.9                  (case find_index (curry (op =) T) fpTs of
    1.10                    ~1 =>
    1.11                    (case AList.lookup (op =) setss_nested T_name of
    1.12 @@ -557,47 +557,53 @@
    1.13                          split_list (filter (exists_fp_subtype o fst) (Ts0 ~~ raw_sets0));
    1.14                        val sets = map (mk_set Ts0) raw_sets;
    1.15                        val (ys, names_lthy') = names_lthy |> mk_Frees s Ts;
    1.16 -                      val heads =
    1.17 -                        map2 (fn y => fn set => HOLogic.mk_Trueprop (HOLogic.mk_mem (y, set $ x)))
    1.18 -                          ys sets;
    1.19 -                      val bodiess = map (mk_prem_prems names_lthy') ys;
    1.20 +                      val xysets = map (pair x) (ys ~~ sets);
    1.21 +                      val ppremss = map (mk_raw_prem_prems names_lthy') ys;
    1.22                      in
    1.23 -                      flat (map2 (map o curry Logic.mk_implies) heads bodiess)
    1.24 +                      flat (map2 (map o apfst o cons) xysets ppremss)
    1.25                      end)
    1.26 -                | i => [HOLogic.mk_Trueprop (nth phis i $ x)])
    1.27 -              | mk_prem_prems _ _ = [];
    1.28 +                | i => [([], (i, x))])
    1.29 +              | mk_raw_prem_prems _ _ = [];
    1.30  
    1.31 -            fun close_prem_prem (Free x') t =
    1.32 +            fun close_prem_prem x' t =
    1.33                fold_rev Logic.all
    1.34                  (map Free (drop (nn + 1) (rev (Term.add_frees t (x' :: phis'))))) t;
    1.35  
    1.36 +            fun mk_prem_prem x (xysets, (i, x')) =
    1.37 +              close_prem_prem (dest_Free x)
    1.38 +                (Logic.list_implies (map (fn (x'', (y, set)) =>
    1.39 +                     HOLogic.mk_Trueprop (HOLogic.mk_mem (y, set $ x''))) xysets,
    1.40 +                   HOLogic.mk_Trueprop (nth phis i $ x')));
    1.41 +
    1.42              fun mk_raw_prem phi ctr ctr_Ts =
    1.43                let
    1.44                  val (xs, names_lthy') = names_lthy |> mk_Frees "x" ctr_Ts;
    1.45 -                val prem_prems =
    1.46 -                  maps (fn x => map (close_prem_prem x) (mk_prem_prems names_lthy' x)) xs;
    1.47 +                val pprems =
    1.48 +                  maps (fn x => map (mk_prem_prem x) (mk_raw_prem_prems names_lthy' x)) xs;
    1.49                in
    1.50 -                (xs, prem_prems, HOLogic.mk_Trueprop (phi $ Term.list_comb (ctr, xs)))
    1.51 +                (xs, pprems, HOLogic.mk_Trueprop (phi $ Term.list_comb (ctr, xs)))
    1.52                end;
    1.53  
    1.54              val raw_premss = map3 (map2 o mk_raw_prem) phis ctrss ctr_Tsss;
    1.55  
    1.56 -            fun mk_prem (xs, prem_prems, concl) =
    1.57 -              fold_rev Logic.all xs (Logic.list_implies (prem_prems, concl));
    1.58 +            fun mk_prem (xs, pprems, concl) =
    1.59 +              fold_rev Logic.all xs (Logic.list_implies (pprems, concl));
    1.60  
    1.61              val goal =
    1.62                Library.foldr (Logic.list_implies o apfst (map mk_prem)) (raw_premss,
    1.63                  HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
    1.64                    (map2 (curry (op $)) phis vs)));
    1.65  
    1.66 +            (* ### WRONG *)
    1.67              val rss = map (map (length o #2)) raw_premss;
    1.68 +            val ppisss = map (map (fn r => map (pair r) (1 upto r))) rss;
    1.69  
    1.70              val fld_induct' = fp_induct OF (map mk_sumEN_tupled_balanced mss);
    1.71  
    1.72              val induct_thm =
    1.73                Skip_Proof.prove lthy [] [] goal (fn {context = ctxt, ...} =>
    1.74 -                mk_induct_tac ctxt ns mss rss (flat ctr_defss) fld_induct' pre_set_defss
    1.75 -                  nested_set_natural's)
    1.76 +                mk_induct_tac ctxt ns mss ppisss (flat ctr_defss) fld_induct' nested_set_natural's
    1.77 +                  pre_set_defss)
    1.78                |> singleton (Proof_Context.export names_lthy lthy)
    1.79            in
    1.80              `(conj_dests nn) induct_thm