2089 in All (map dest_Free [r0, s']) (Logic.list_implies (seleqs, r0 === s')) end; |
2089 in All (map dest_Free [r0, s']) (Logic.list_implies (seleqs, r0 === s')) end; |
2090 |
2090 |
2091 |
2091 |
2092 (* 3rd stage: thms_thy *) |
2092 (* 3rd stage: thms_thy *) |
2093 |
2093 |
2094 val ss = get_simpset defs_thy; |
2094 val record_ss = get_simpset defs_thy; |
2095 val sel_upd_ss = ss addsimps (sel_defs @ accessor_thms @ upd_defs @ updator_thms); |
2095 val sel_upd_ss = record_ss addsimps (sel_defs @ accessor_thms @ upd_defs @ updator_thms); |
2096 |
2096 |
2097 val (sel_convs, upd_convs) = |
2097 val (sel_convs, upd_convs) = |
2098 timeit_msg ctxt "record sel_convs/upd_convs proof:" (fn () => |
2098 timeit_msg ctxt "record sel_convs/upd_convs proof:" (fn () => |
2099 Par_List.map (fn prop => |
2099 Par_List.map (fn prop => |
2100 Skip_Proof.prove_global defs_thy [] [] prop |
2100 Skip_Proof.prove_global defs_thy [] [] prop |
2175 (HOL_basic_ss addsimps |
2175 (HOL_basic_ss addsimps |
2176 (@{lemma "EX x. P x == ~ (ALL x. ~ P x)" by simp} :: |
2176 (@{lemma "EX x. P x == ~ (ALL x. ~ P x)" by simp} :: |
2177 @{thms not_not Not_eq_iff})) 1 THEN |
2177 @{thms not_not Not_eq_iff})) 1 THEN |
2178 rtac split_object 1)); |
2178 rtac split_object 1)); |
2179 |
2179 |
2180 fun equality_tac thms = |
|
2181 let |
|
2182 val s' :: s :: eqs = rev thms; |
|
2183 val ss' = ss addsimps (s' :: s :: sel_convs); |
|
2184 val eqs' = map (simplify ss') eqs; |
|
2185 in simp_tac (HOL_basic_ss addsimps (s' :: s :: eqs')) 1 end; |
|
2186 |
|
2187 val equality = timeit_msg ctxt "record equality proof:" (fn () => |
2180 val equality = timeit_msg ctxt "record equality proof:" (fn () => |
2188 Skip_Proof.prove_global defs_thy [] [] equality_prop (fn {context, ...} => |
2181 Skip_Proof.prove_global defs_thy [] [] equality_prop |
2189 fn st => |
2182 (fn _ => asm_full_simp_tac (record_ss addsimps (split_meta :: sel_convs)) 1)); |
2190 let val [s, s'] = map #1 (rev (Tactic.innermost_params 1 st)) in |
|
2191 st |> (res_inst_tac context [((rN, 0), s)] cases_scheme 1 THEN |
|
2192 res_inst_tac context [((rN, 0), s')] cases_scheme 1 THEN |
|
2193 Subgoal.FOCUS (fn {prems, ...} => equality_tac prems) context 1) |
|
2194 (*asm_full_simp_tac sel_upd_ss would also work but is less efficient*) |
|
2195 end)); |
|
2196 |
2183 |
2197 val ((([sel_convs', upd_convs', sel_defs', upd_defs', |
2184 val ((([sel_convs', upd_convs', sel_defs', upd_defs', |
2198 fold_congs', unfold_congs', |
2185 fold_congs', unfold_congs', |
2199 splits' as [split_meta', split_object', split_ex'], derived_defs'], |
2186 splits' as [split_meta', split_object', split_ex'], derived_defs'], |
2200 [surjective', equality']), |
2187 [surjective', equality']), |