src/HOL/Tools/record.ML
changeset 46053 e9d4241f7be9
parent 46052 badf0572e1bc
child 46054 3458b0e955ac
equal deleted inserted replaced
46052:badf0572e1bc 46053:e9d4241f7be9
   947 
   947 
   948 
   948 
   949 
   949 
   950 (** record simprocs **)
   950 (** record simprocs **)
   951 
   951 
   952 fun future_forward_prf thy prf prop =
       
   953   let val thm =
       
   954     if ! quick_and_dirty then Skip_Proof.make_thm thy prop
       
   955     else if Goal.future_enabled () then
       
   956       Goal.future_result (Proof_Context.init_global thy) (Goal.fork prf) prop
       
   957     else prf ()
       
   958   in Drule.export_without_context thm end;
       
   959 
       
   960 fun is_sel_upd_pair thy (Const (s, _)) (Const (u, t')) =
   952 fun is_sel_upd_pair thy (Const (s, _)) (Const (u, t')) =
   961   (case get_updates thy u of
   953   (case get_updates thy u of
   962     SOME u_name => u_name = s
   954     SOME u_name => u_name = s
   963   | NONE => raise TERM ("is_sel_upd_pair: not update", [Const (u, t')]));
   955   | NONE => raise TERM ("is_sel_upd_pair: not update", [Const (u, t')]));
   964 
   956 
  2063       let val args = map (fn (c, Free (_, T)) => mk_sel r0 (c, T)) all_named_vars_more
  2055       let val args = map (fn (c, Free (_, T)) => mk_sel r0 (c, T)) all_named_vars_more
  2064       in r0 === mk_rec args 0 end;
  2056       in r0 === mk_rec args 0 end;
  2065 
  2057 
  2066     (*cases*)
  2058     (*cases*)
  2067     val cases_scheme_prop =
  2059     val cases_scheme_prop =
  2068       (All (map dest_Free all_vars_more) ((r0 === r_rec0) ==> Trueprop C))
  2060       (All (map dest_Free all_vars_more) ((r0 === r_rec0) ==> Trueprop C), Trueprop C);
  2069         ==> Trueprop C;
       
  2070 
  2061 
  2071     val cases_prop =
  2062     val cases_prop =
  2072       (All (map dest_Free all_vars) ((r_unit0 === r_rec_unit0) ==> Trueprop C))
  2063       (All (map dest_Free all_vars) ((r_unit0 === r_rec_unit0) ==> Trueprop C))
  2073          ==> Trueprop C;
  2064          ==> Trueprop C;
  2074 
  2065 
  2126            [case parent_induct of NONE => all_tac | SOME ind => try_param_tac rN ind 1,
  2117            [case parent_induct of NONE => all_tac | SOME ind => try_param_tac rN ind 1,
  2127             try_param_tac rN ext_induct 1,
  2118             try_param_tac rN ext_induct 1,
  2128             asm_simp_tac HOL_basic_ss 1]));
  2119             asm_simp_tac HOL_basic_ss 1]));
  2129 
  2120 
  2130     val induct = timeit_msg ctxt "record induct proof:" (fn () =>
  2121     val induct = timeit_msg ctxt "record induct proof:" (fn () =>
  2131       let val (assm, concl) = induct_prop in
  2122       Skip_Proof.prove_global defs_thy [] [#1 induct_prop] (#2 induct_prop) (fn {prems, ...} =>
  2132         Skip_Proof.prove_global defs_thy [] [assm] concl (fn {prems, ...} =>
  2123         try_param_tac rN induct_scheme 1
  2133           try_param_tac rN induct_scheme 1
  2124         THEN try_param_tac "more" @{thm unit.induct} 1
  2134           THEN try_param_tac "more" @{thm unit.induct} 1
  2125         THEN resolve_tac prems 1));
  2135           THEN resolve_tac prems 1)
       
  2136       end);
       
  2137 
       
  2138     fun cases_scheme_prf () =
       
  2139       let
       
  2140         val _ $ (Pvar $ _) = concl_of induct_scheme;
       
  2141         val ind =
       
  2142           cterm_instantiate
       
  2143             [(cterm_of defs_thy Pvar, cterm_of defs_thy
       
  2144               (lambda w (HOLogic.imp $ HOLogic.mk_eq (r0, w) $ C)))]
       
  2145             induct_scheme;
       
  2146         in Object_Logic.rulify (mp OF [ind, refl]) end;
       
  2147 
       
  2148     val cases_scheme = timeit_msg ctxt "record cases_scheme proof:" (fn () =>
       
  2149       future_forward_prf defs_thy cases_scheme_prf cases_scheme_prop);
       
  2150 
       
  2151     val cases = timeit_msg ctxt "record cases proof:" (fn () =>
       
  2152       Skip_Proof.prove_global defs_thy [] [] cases_prop
       
  2153         (fn _ =>
       
  2154           try_param_tac rN cases_scheme 1 THEN
       
  2155           ALLGOALS (asm_full_simp_tac (HOL_basic_ss addsimps [@{thm unit_all_eq1}]))));
       
  2156 
  2126 
  2157     val surjective = timeit_msg ctxt "record surjective proof:" (fn () =>
  2127     val surjective = timeit_msg ctxt "record surjective proof:" (fn () =>
  2158       let
  2128       let
  2159         val leaf_ss =
  2129         val leaf_ss =
  2160           get_sel_upd_defs defs_thy addsimps (sel_defs @ @{thms o_assoc id_apply id_o o_id});
  2130           get_sel_upd_defs defs_thy addsimps (sel_defs @ @{thms o_assoc id_apply id_o o_id});
  2167               simp_tac init_ss 1,
  2137               simp_tac init_ss 1,
  2168               REPEAT
  2138               REPEAT
  2169                 (Iso_Tuple_Support.iso_tuple_intros_tac 1 ORELSE
  2139                 (Iso_Tuple_Support.iso_tuple_intros_tac 1 ORELSE
  2170                   (rtac surject_assistI 1 THEN simp_tac leaf_ss 1))])
  2140                   (rtac surject_assistI 1 THEN simp_tac leaf_ss 1))])
  2171       end);
  2141       end);
       
  2142 
       
  2143     val cases_scheme = timeit_msg ctxt "record cases_scheme proof:" (fn () =>
       
  2144       Skip_Proof.prove_global defs_thy [] [#1 cases_scheme_prop] (#2 cases_scheme_prop)
       
  2145         (fn {prems, ...} =>
       
  2146           resolve_tac prems 1 THEN
       
  2147           rtac surjective 1));
       
  2148 
       
  2149     val cases = timeit_msg ctxt "record cases proof:" (fn () =>
       
  2150       Skip_Proof.prove_global defs_thy [] [] cases_prop
       
  2151         (fn _ =>
       
  2152           try_param_tac rN cases_scheme 1 THEN
       
  2153           ALLGOALS (asm_full_simp_tac (HOL_basic_ss addsimps @{thms unit_all_eq1}))));
  2172 
  2154 
  2173     val split_meta = timeit_msg ctxt "record split_meta proof:" (fn () =>
  2155     val split_meta = timeit_msg ctxt "record split_meta proof:" (fn () =>
  2174       Skip_Proof.prove_global defs_thy [] [] split_meta_prop
  2156       Skip_Proof.prove_global defs_thy [] [] split_meta_prop
  2175         (fn _ =>
  2157         (fn _ =>
  2176           EVERY1
  2158           EVERY1