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 |