src/HOL/Tools/record.ML
changeset 46054 3458b0e955ac
parent 46053 e9d4241f7be9
child 46055 20e5060ab75c
equal deleted inserted replaced
46053:e9d4241f7be9 46054:3458b0e955ac
  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']),