--- a/src/HOL/Tools/Lifting/lifting_bnf.ML Sun May 03 00:01:10 2015 +0200
+++ b/src/HOL/Tools/Lifting/lifting_bnf.ML Tue Nov 18 16:19:51 2014 +0100
@@ -87,9 +87,8 @@
fun relator_eq_onp bnf ctxt =
let
- val relator_eq_onp_thm = lookup_defined_pred_data ctxt (type_name_of_bnf bnf)
- |> Transfer.rel_eq_onp |> Conv.fconv_rule (HOLogic.Trueprop_conv (Conv.arg1_conv
- (Raw_Simplifier.rewrite ctxt false @{thms eq_onp_top_eq_eq[THEN eq_reflection]})))
+ val relator_eq_onp_thm = lookup_defined_pred_data ctxt (type_name_of_bnf bnf)
+ |> Transfer.rel_eq_onp
in
[((Binding.empty, []), [([relator_eq_onp_thm], @{attributes [relator_eq_onp]})])]
end
--- a/src/HOL/Tools/Transfer/transfer.ML Sun May 03 00:01:10 2015 +0200
+++ b/src/HOL/Tools/Transfer/transfer.ML Tue Nov 18 16:19:51 2014 +0100
@@ -9,9 +9,12 @@
sig
type pred_data
val rel_eq_onp: pred_data -> thm
+ val rel_eq_onp_with_tops: pred_data -> thm
+ val pred_def: pred_data -> thm
val bottom_rewr_conv: thm list -> conv
val top_rewr_conv: thm list -> conv
+ val top_sweep_rewr_conv: thm list -> conv
val prep_conv: conv
val get_transfer_raw: Proof.context -> thm list
@@ -46,15 +49,23 @@
structure Transfer : TRANSFER =
struct
+fun bottom_rewr_conv rewrs = Conv.bottom_conv (K (Conv.try_conv (Conv.rewrs_conv rewrs))) @{context}
+fun top_rewr_conv rewrs = Conv.top_conv (K (Conv.try_conv (Conv.rewrs_conv rewrs))) @{context}
+fun top_sweep_rewr_conv rewrs = Conv.top_sweep_conv (K (Conv.rewrs_conv rewrs)) @{context}
+
(** Theory Data **)
val compound_xhs_empty_net = Item_Net.init (Thm.eq_thm_prop o apply2 snd) (single o fst);
val rewr_rules = Item_Net.init Thm.eq_thm_prop (single o fst o HOLogic.dest_eq
o HOLogic.dest_Trueprop o Thm.concl_of);
-type pred_data = {rel_eq_onp: thm}
+type pred_data = {pred_def:thm, rel_eq_onp: thm}
val rel_eq_onp: pred_data -> thm = #rel_eq_onp
+val rel_eq_onp_with_tops: pred_data -> thm = (Conv.fconv_rule (HOLogic.Trueprop_conv (Conv.arg1_conv
+ (top_sweep_rewr_conv @{thms eq_onp_top_eq_eq[symmetric, THEN eq_reflection]}))))
+ o #rel_eq_onp
+val pred_def: pred_data -> thm = #pred_def
structure Data = Generic_Data
(
@@ -182,9 +193,6 @@
(** Conversions **)
-fun bottom_rewr_conv rewrs = Conv.bottom_conv (K (Conv.try_conv (Conv.rewrs_conv rewrs))) @{context}
-fun top_rewr_conv rewrs = Conv.top_conv (K (Conv.try_conv (Conv.rewrs_conv rewrs))) @{context}
-
fun transfer_rel_conv conv =
Conv.concl_conv ~1 (HOLogic.Trueprop_conv (Conv.fun2_conv (Conv.arg_conv conv)))
@@ -788,7 +796,9 @@
val untransferred_attribute_parser =
Attrib.thms >> untransferred_attribute
-fun morph_pred_data phi {rel_eq_onp} = {rel_eq_onp = Morphism.thm phi rel_eq_onp}
+fun morph_pred_data phi {pred_def, rel_eq_onp} =
+ {pred_def = Morphism.thm phi pred_def,
+ rel_eq_onp = Morphism.thm phi rel_eq_onp}
fun lookup_pred_data ctxt type_name = Symtab.lookup (get_pred_data ctxt) type_name
|> Option.map (morph_pred_data (Morphism.transfer_morphism (Proof_Context.theory_of ctxt)))
--- a/src/HOL/Tools/Transfer/transfer_bnf.ML Sun May 03 00:01:10 2015 +0200
+++ b/src/HOL/Tools/Transfer/transfer_bnf.ML Tue Nov 18 16:19:51 2014 +0100
@@ -283,10 +283,7 @@
fun qualify defname suffix = Binding.qualified true suffix defname
val Domainp_rel_thm_name = qualify (base_name_of_bnf bnf) "Domainp_rel"
val rel_eq_onp_thm_name = qualify (base_name_of_bnf bnf) "rel_eq_onp"
- val rel_eq_onp_internal = Conv.fconv_rule (HOLogic.Trueprop_conv (Conv.arg1_conv
- (Raw_Simplifier.rewrite lthy false @{thms eq_onp_top_eq_eq[symmetric, THEN eq_reflection]})))
- rel_eq_onp
- val pred_data = {rel_eq_onp = rel_eq_onp_internal}
+ val pred_data = {pred_def = pred_def, rel_eq_onp = rel_eq_onp}
val type_name = type_name_of_bnf bnf
val relator_domain_attr = @{attributes [relator_domain]}
val notes = [((Domainp_rel_thm_name, []), [([Domainp_rel], relator_domain_attr)]),
@@ -340,7 +337,7 @@
map type_name_of_bnf (#fp_nesting_bnfs fp_sugar)
@ map type_name_of_bnf (#live_nesting_bnfs fp_sugar)
@ map type_name_of_bnf (#bnfs (#fp_res fp_sugar)))
- val eq_onps = map (Transfer.rel_eq_onp o lookup_defined_pred_data lthy) involved_types
+ val eq_onps = map (Transfer.rel_eq_onp_with_tops o lookup_defined_pred_data lthy) involved_types
val old_lthy = lthy
val (As, lthy) = mk_TFrees' (map Type.sort_of_atyp (lives_of_fp fp_sugar)) lthy
val predTs = map mk_pred1T As