| author | haftmann | 
| Tue, 13 Oct 2015 09:21:14 +0200 | |
| changeset 61422 | 0dfcd0fb4172 | 
| parent 61348 | d7215449be83 | 
| child 61761 | 164eeb2ab675 | 
| permissions | -rw-r--r-- | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 1 | (* Title: HOL/Tools/Transfer/transfer_bnf.ML | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 2 | Author: Ondrej Kuncar, TU Muenchen | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 3 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 4 | Setup for Transfer for types that are BNF. | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 5 | *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 6 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 7 | signature TRANSFER_BNF = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 8 | sig | 
| 59823 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 9 | exception NO_PRED_DATA of unit | 
| 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 10 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 11 | val base_name_of_bnf: BNF_Def.bnf -> binding | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 12 | val type_name_of_bnf: BNF_Def.bnf -> string | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 13 | val lookup_defined_pred_data: Proof.context -> string -> Transfer.pred_data | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 14 | val bnf_only_type_ctr: (BNF_Def.bnf -> 'a -> 'a) -> BNF_Def.bnf -> 'a -> 'a | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 15 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 16 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 17 | structure Transfer_BNF : TRANSFER_BNF = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 18 | struct | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 19 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 20 | open BNF_Util | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 21 | open BNF_Def | 
| 56651 | 22 | open BNF_FP_Util | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 23 | open BNF_FP_Def_Sugar | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 24 | |
| 59823 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 25 | exception NO_PRED_DATA of unit | 
| 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 26 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 27 | (* util functions *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 28 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 29 | fun base_name_of_bnf bnf = Binding.name (Binding.name_of (name_of_bnf bnf)) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 30 | fun mk_Frees_free x Ts ctxt = Variable.variant_frees ctxt [] (mk_names (length Ts) x ~~ Ts) |> map Free | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 31 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 32 | fun mk_Domainp P = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 33 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 34 | val PT = fastype_of P | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 35 | val argT = hd (binder_types PT) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 36 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 37 |     Const (@{const_name Domainp}, PT --> argT --> HOLogic.boolT) $ P
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 38 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 39 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 40 | fun mk_pred pred_def args T = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 41 | let | 
| 59582 | 42 | val pred_name = pred_def |> Thm.prop_of |> HOLogic.dest_Trueprop |> fst o HOLogic.dest_eq | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 43 | |> head_of |> fst o dest_Const | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 44 | val argsT = map fastype_of args | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 45 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 46 | list_comb (Const (pred_name, argsT ---> (T --> HOLogic.boolT)), args) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 47 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 48 | |
| 57399 | 49 | fun mk_eq_onp arg = | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 50 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 51 | val argT = domain_type (fastype_of arg) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 52 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 53 |     Const (@{const_name eq_onp}, (argT --> HOLogic.boolT) --> argT --> argT --> HOLogic.boolT)
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 54 | $ arg | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 55 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 56 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 57 | fun subst_conv thm = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 58 |   Conv.top_sweep_conv (K (Conv.rewr_conv (safe_mk_meta_eq thm))) @{context}
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 59 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 60 | fun type_name_of_bnf bnf = T_of_bnf bnf |> dest_Type |> fst | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 61 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 62 | fun is_Type (Type _) = true | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 63 | | is_Type _ = false | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 64 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 65 | fun bnf_only_type_ctr f bnf = if is_Type (T_of_bnf bnf) then f bnf else I | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 66 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 67 | fun bnf_of_fp_sugar (fp_sugar:fp_sugar) = nth (#bnfs (#fp_res fp_sugar)) (#fp_res_index fp_sugar) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 68 | |
| 56648 
2ffa440b3074
manual merge + added 'rel_distincts' field to record for symmetry
 blanchet parents: 
56538diff
changeset | 69 | fun fp_sugar_only_type_ctr f fp_sugars = | 
| 
2ffa440b3074
manual merge + added 'rel_distincts' field to record for symmetry
 blanchet parents: 
56538diff
changeset | 70 | (case filter (is_Type o T_of_bnf o bnf_of_fp_sugar) fp_sugars of | 
| 
2ffa440b3074
manual merge + added 'rel_distincts' field to record for symmetry
 blanchet parents: 
56538diff
changeset | 71 | [] => I | 
| 
2ffa440b3074
manual merge + added 'rel_distincts' field to record for symmetry
 blanchet parents: 
56538diff
changeset | 72 | | fp_sugars' => f fp_sugars') | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 73 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 74 | (* relation constraints - bi_total & co. *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 75 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 76 | fun mk_relation_constraint name arg = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 77 | (Const (name, fastype_of arg --> HOLogic.boolT)) $ arg | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 78 | |
| 57399 | 79 | fun side_constraint_tac bnf constr_defs ctxt i = | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 80 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 81 | val thms = constr_defs @ map mk_sym [rel_eq_of_bnf bnf, rel_conversep_of_bnf bnf, | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 82 | rel_OO_of_bnf bnf] | 
| 57399 | 83 | in | 
| 60728 | 84 | (SELECT_GOAL (Local_Defs.unfold_tac ctxt thms) THEN' rtac ctxt (rel_mono_of_bnf bnf) | 
| 58963 
26bf09b95dda
proper context for assume_tac (atac remains as fall-back without context);
 wenzelm parents: 
58782diff
changeset | 85 | THEN_ALL_NEW assume_tac ctxt) i | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 86 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 87 | |
| 57399 | 88 | fun bi_constraint_tac constr_iff sided_constr_intros ctxt i = | 
| 89 | (SELECT_GOAL (Local_Defs.unfold_tac ctxt [constr_iff]) THEN' | |
| 60728 | 90 | CONJ_WRAP' (fn thm => rtac ctxt thm THEN_ALL_NEW | 
| 91 | (REPEAT_DETERM o etac ctxt conjE THEN' assume_tac ctxt)) sided_constr_intros) i | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 92 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 93 | fun generate_relation_constraint_goal ctxt bnf constraint_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 94 | let | 
| 59582 | 95 | val constr_name = | 
| 96 | constraint_def |> Thm.prop_of |> HOLogic.dest_Trueprop |> fst o HOLogic.dest_eq | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 97 | |> head_of |> fst o dest_Const | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 98 | val live = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 99 | val (((As, Bs), Ds), ctxt) = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 100 | |> mk_TFrees live | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 101 | ||>> mk_TFrees live | 
| 60207 | 102 | ||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf)) | 
| 57399 | 103 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 104 | val relator = mk_rel_of_bnf Ds As Bs bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 105 | val relsT = map2 mk_pred2T As Bs | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 106 | val (args, ctxt) = Ctr_Sugar_Util.mk_Frees "R" relsT ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 107 | val concl = HOLogic.mk_Trueprop (mk_relation_constraint constr_name (list_comb (relator, args))) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 108 | val assms = map (HOLogic.mk_Trueprop o (mk_relation_constraint constr_name)) args | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 109 | val goal = Logic.list_implies (assms, concl) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 110 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 111 | (goal, ctxt) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 112 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 113 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 114 | fun prove_relation_side_constraint ctxt bnf constraint_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 115 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 116 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 117 | val (goal, ctxt) = generate_relation_constraint_goal ctxt bnf constraint_def | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 118 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 119 |       (fn {context = ctxt, prems = _} => side_constraint_tac bnf [constraint_def] ctxt 1)
 | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 120 | |> Thm.close_derivation | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 121 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 122 | Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 123 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 124 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 125 | fun prove_relation_bi_constraint ctxt bnf constraint_def side_constraints = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 126 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 127 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 128 | val (goal, ctxt) = generate_relation_constraint_goal ctxt bnf constraint_def | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 129 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 130 |       (fn {context = ctxt, prems = _} => bi_constraint_tac constraint_def side_constraints ctxt 1)
 | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 131 | |> Thm.close_derivation | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 132 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 133 | Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 134 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 135 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 136 | val defs = [("left_total_rel", @{thm left_total_alt_def}), ("right_total_rel", @{thm right_total_alt_def}),
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 137 |   ("left_unique_rel", @{thm left_unique_alt_def}), ("right_unique_rel", @{thm right_unique_alt_def})]
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 138 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 139 | fun prove_relation_constraints bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 140 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 141 |     val transfer_attr = @{attributes [transfer_rule]}
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 142 | val Tname = base_name_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 143 | fun qualify suffix = Binding.qualified true suffix Tname | 
| 57399 | 144 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 145 | val defs = map (apsnd (prove_relation_side_constraint lthy bnf)) defs | 
| 57399 | 146 |     val bi_total = prove_relation_bi_constraint lthy bnf @{thm bi_total_alt_def}
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 147 | [snd (nth defs 0), snd (nth defs 1)] | 
| 57399 | 148 |     val bi_unique = prove_relation_bi_constraint lthy bnf @{thm bi_unique_alt_def}
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 149 | [snd (nth defs 2), snd (nth defs 3)] | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 150 |     val defs = ("bi_total_rel", bi_total) :: ("bi_unique_rel", bi_unique) :: defs
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 151 | val notes = maps (fn (name, thm) => [((qualify name, []), [([thm], transfer_attr)])]) defs | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 152 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 153 | notes | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 154 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 155 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 156 | (* relator_eq *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 157 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 158 | fun relator_eq bnf = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 159 |   [((Binding.empty, []), [([rel_eq_of_bnf bnf], @{attributes [relator_eq]})])]
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 160 | |
| 58722 | 161 | (* transfer rules *) | 
| 162 | ||
| 163 | fun bnf_transfer_rules bnf = | |
| 164 | let | |
| 165 | val transfer_rules = map_transfer_of_bnf bnf :: rel_transfer_of_bnf bnf | |
| 166 | :: set_transfer_of_bnf bnf | |
| 167 |     val transfer_attr = @{attributes [transfer_rule]}
 | |
| 168 | in | |
| 169 | map (fn thm => ((Binding.empty,[]),[([thm],transfer_attr)])) transfer_rules | |
| 170 | end | |
| 171 | ||
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 172 | (* predicator definition and Domainp and eq_onp theorem *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 173 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 174 | fun define_pred bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 175 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 176 | fun mk_pred_name c = Binding.prefix_name "pred_" c | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 177 | val live = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 178 | val Tname = base_name_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 179 | val ((As, Ds), lthy) = lthy | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 180 | |> mk_TFrees live | 
| 60207 | 181 | ||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf)) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 182 | val T = mk_T_of_bnf Ds As bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 183 | val sets = mk_sets_of_bnf (replicate live Ds) (replicate live As) bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 184 | val argTs = map mk_pred1T As | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 185 | val args = mk_Frees_free "P" argTs lthy | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 186 | val conjs = map (fn (set, arg) => mk_Ball (set $ Bound 0) arg) (sets ~~ args) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 187 |     val rhs = Abs ("x", T, foldr1 HOLogic.mk_conj conjs)
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 188 | val pred_name = mk_pred_name Tname | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 189 | val headT = argTs ---> (T --> HOLogic.boolT) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 190 | val head = Free (Binding.name_of pred_name, headT) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 191 | val lhs = list_comb (head, args) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 192 | val def = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) | 
| 57399 | 193 | val ((_, (_, pred_def)), lthy) = Specification.definition ((SOME (pred_name, SOME headT, NoSyn)), | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 194 | ((Binding.empty, []), def)) lthy | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 195 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 196 | (pred_def, lthy) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 197 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 198 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 199 | fun Domainp_tac bnf pred_def ctxt i = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 200 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 201 | val n = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 202 | val set_map's = set_map_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 203 | in | 
| 60728 | 204 |     EVERY' [rtac ctxt ext, SELECT_GOAL (Local_Defs.unfold_tac ctxt [@{thm Domainp.simps},
 | 
| 205 | in_rel_of_bnf bnf, pred_def]), rtac ctxt iffI, | |
| 59498 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 wenzelm parents: 
59276diff
changeset | 206 | REPEAT_DETERM o eresolve_tac ctxt [exE, conjE, CollectE], hyp_subst_tac ctxt, | 
| 60728 | 207 | CONJ_WRAP' (fn set_map => EVERY' [rtac ctxt ballI, dtac ctxt (set_map RS equalityD1 RS set_mp), | 
| 208 | etac ctxt imageE, dtac ctxt set_rev_mp, assume_tac ctxt, | |
| 59498 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 wenzelm parents: 
59276diff
changeset | 209 |           REPEAT_DETERM o eresolve_tac ctxt [CollectE, @{thm case_prodE}],
 | 
| 60728 | 210 |           hyp_subst_tac ctxt, rtac ctxt @{thm iffD2[OF arg_cong2[of _ _ _ _ Domainp, OF refl fst_conv]]},
 | 
| 211 |           etac ctxt @{thm DomainPI}]) set_map's,
 | |
| 212 | REPEAT_DETERM o etac ctxt conjE, | |
| 59498 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 wenzelm parents: 
59276diff
changeset | 213 | REPEAT_DETERM o resolve_tac ctxt [exI, (refl RS conjI), rotate_prems 1 conjI], | 
| 60728 | 214 | rtac ctxt refl, rtac ctxt (box_equals OF [map_cong0_of_bnf bnf, map_comp_of_bnf bnf RS sym, | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 215 | map_id_of_bnf bnf]), | 
| 60728 | 216 |         REPEAT_DETERM_N n o (EVERY' [rtac ctxt @{thm box_equals[OF _ sym[OF o_apply] sym[OF id_apply]]},
 | 
| 217 |           rtac ctxt @{thm fst_conv}]), rtac ctxt CollectI,
 | |
| 218 |         CONJ_WRAP' (fn set_map => EVERY' [rtac ctxt (set_map RS @{thm ord_eq_le_trans}),
 | |
| 59498 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 wenzelm parents: 
59276diff
changeset | 219 |           REPEAT_DETERM o resolve_tac ctxt [@{thm image_subsetI}, CollectI, @{thm case_prodI}],
 | 
| 60728 | 220 | dtac ctxt (rotate_prems 1 bspec), assume_tac ctxt, | 
| 221 |           etac ctxt @{thm DomainpE}, etac ctxt @{thm someI}]) set_map's
 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 222 | ] i | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 223 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 224 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 225 | fun prove_Domainp_rel ctxt bnf pred_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 226 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 227 | val live = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 228 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 229 | val (((As, Bs), Ds), ctxt) = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 230 | |> mk_TFrees live | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 231 | ||>> mk_TFrees live | 
| 60207 | 232 | ||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf)) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 233 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 234 | val relator = mk_rel_of_bnf Ds As Bs bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 235 | val relsT = map2 mk_pred2T As Bs | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 236 | val T = mk_T_of_bnf Ds As bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 237 | val (args, ctxt) = Ctr_Sugar_Util.mk_Frees "R" relsT ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 238 | val lhs = mk_Domainp (list_comb (relator, args)) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 239 | val rhs = mk_pred pred_def (map mk_Domainp args) T | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 240 | val goal = HOLogic.mk_eq (lhs, rhs) |> HOLogic.mk_Trueprop | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 241 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 242 |       (fn {context = ctxt, prems = _} => Domainp_tac bnf pred_def ctxt 1)
 | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 243 | |> Thm.close_derivation | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 244 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 245 | Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 246 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 247 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 248 | fun pred_eq_onp_tac bnf pred_def ctxt i = | 
| 57399 | 249 |   (SELECT_GOAL (Local_Defs.unfold_tac ctxt [@{thm eq_onp_Grp},
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 250 |     @{thm Ball_Collect}, pred_def]) THEN' CONVERSION (subst_conv (map_id0_of_bnf bnf RS sym))
 | 
| 60728 | 251 | THEN' rtac ctxt (rel_Grp_of_bnf bnf)) i | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 252 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 253 | fun prove_rel_eq_onp ctxt bnf pred_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 254 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 255 | val live = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 256 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 257 | val ((As, Ds), ctxt) = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 258 | |> mk_TFrees live | 
| 60207 | 259 | ||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf)) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 260 | val T = mk_T_of_bnf Ds As bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 261 | val argTs = map mk_pred1T As | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 262 | val (args, ctxt) = mk_Frees "P" argTs ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 263 | val relator = mk_rel_of_bnf Ds As As bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 264 | val lhs = list_comb (relator, map mk_eq_onp args) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 265 | val rhs = mk_eq_onp (mk_pred pred_def args T) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 266 | val goal = HOLogic.mk_eq (lhs, rhs) |> HOLogic.mk_Trueprop | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 267 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 268 |       (fn {context = ctxt, prems = _} => pred_eq_onp_tac bnf pred_def ctxt 1)
 | 
| 57890 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 traytel parents: 
57399diff
changeset | 269 | |> Thm.close_derivation | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 270 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 271 | Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 272 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 273 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 274 | fun predicator bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 275 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 276 | val (pred_def, lthy) = define_pred bnf lthy | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 277 | val pred_def = Morphism.thm (Local_Theory.target_morphism lthy) pred_def | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 278 | val Domainp_rel = prove_Domainp_rel lthy bnf pred_def | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 279 | val rel_eq_onp = prove_rel_eq_onp lthy bnf pred_def | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 280 | fun qualify defname suffix = Binding.qualified true suffix defname | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 281 | val Domainp_rel_thm_name = qualify (base_name_of_bnf bnf) "Domainp_rel" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 282 | val rel_eq_onp_thm_name = qualify (base_name_of_bnf bnf) "rel_eq_onp" | 
| 60220 | 283 | val pred_data = Transfer.mk_pred_data pred_def rel_eq_onp [] | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 284 | val type_name = type_name_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 285 |     val relator_domain_attr = @{attributes [relator_domain]}
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 286 | val notes = [((Domainp_rel_thm_name, []), [([Domainp_rel], relator_domain_attr)]), | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 287 | ((rel_eq_onp_thm_name, []), [([rel_eq_onp], [])])] | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 288 | in | 
| 58356 | 289 | lthy | 
| 290 | |> Local_Theory.notes notes | |
| 291 | |> snd | |
| 292 |     |> Local_Theory.declaration {syntax = false, pervasive = true}
 | |
| 293 | (fn phi => Transfer.update_pred_data type_name (Transfer.morph_pred_data phi pred_data)) | |
| 294 | |> Local_Theory.restore | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 295 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 296 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 297 | (* BNF interpretation *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 298 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 299 | fun transfer_bnf_interpretation bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 300 | let | 
| 58356 | 301 | val dead = dead_of_bnf bnf | 
| 302 | val constr_notes = if dead > 0 then [] else prove_relation_constraints bnf lthy | |
| 303 | val relator_eq_notes = if dead > 0 then [] else relator_eq bnf | |
| 58722 | 304 | val transfer_rule_notes = if dead > 0 then [] else bnf_transfer_rules bnf | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 305 | in | 
| 58356 | 306 | lthy | 
| 58722 | 307 | |> Local_Theory.notes (constr_notes @ relator_eq_notes @ transfer_rule_notes) | 
| 58356 | 308 | |> snd | 
| 309 | |> predicator bnf | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 310 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 311 | |
| 58659 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 312 | val _ = | 
| 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 313 | Theory.setup | 
| 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 314 | (bnf_interpretation transfer_plugin (bnf_only_type_ctr transfer_bnf_interpretation)) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 315 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 316 | (* simplification rules for the predicator *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 317 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 318 | fun lookup_defined_pred_data lthy name = | 
| 59823 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 319 | case Transfer.lookup_pred_data lthy name of | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 320 | SOME data => data | 
| 59823 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 321 | | NONE => raise NO_PRED_DATA () | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 322 | |
| 58782 | 323 | fun lives_of_fp (fp_sugar: fp_sugar) = | 
| 58721 | 324 | let | 
| 325 | val As = snd (dest_Type (#T fp_sugar)) | |
| 326 | val liveness = liveness_of_fp_bnf (length As) (hd (#bnfs (#fp_res fp_sugar))); | |
| 327 | in | |
| 328 | map_filter (uncurry (fn true => SOME | false => K NONE)) (liveness ~~ As) | |
| 329 | end | |
| 330 | ||
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 331 | fun prove_pred_inject lthy (fp_sugar:fp_sugar) = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 332 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 333 | val involved_types = distinct op= ( | 
| 57399 | 334 | map type_name_of_bnf (#fp_nesting_bnfs fp_sugar) | 
| 335 | @ map type_name_of_bnf (#live_nesting_bnfs fp_sugar) | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 336 | @ map type_name_of_bnf (#bnfs (#fp_res fp_sugar))) | 
| 60216 | 337 | val eq_onps = map (Transfer.rel_eq_onp_with_tops o lookup_defined_pred_data lthy) involved_types | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 338 | val old_lthy = lthy | 
| 60207 | 339 | val (As, lthy) = mk_TFrees' (map Type.sort_of_atyp (lives_of_fp fp_sugar)) lthy | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 340 | val predTs = map mk_pred1T As | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 341 | val (preds, lthy) = mk_Frees "P" predTs lthy | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 342 | val args = map mk_eq_onp preds | 
| 59621 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 343 | val cTs = map (SOME o Thm.ctyp_of lthy) (maps (replicate 2) As) | 
| 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 344 | val cts = map (SOME o Thm.cterm_of lthy) args | 
| 59582 | 345 | fun get_rhs thm = thm |> Thm.concl_of |> HOLogic.dest_Trueprop |> HOLogic.dest_eq |> snd | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 346 | fun is_eqn thm = can get_rhs thm | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 347 | fun rel2pred_massage thm = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 348 | let | 
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 349 |         val live_step = @{lemma "x = y \<Longrightarrow> (eq_onp P a a \<and> x) = (P a \<and> y)" by (simp only: eq_onp_same_args)}
 | 
| 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 350 |         val kill_top1 = @{lemma "(top x \<and> P) = P" by blast}
 | 
| 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 351 |         val kill_top2 = @{lemma "(P \<and> top x) = P" by blast}
 | 
| 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 352 | fun pred_eq_onp_conj conjs = List.foldr (fn (_, thm) => thm RS live_step) | 
| 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 353 |           @{thm refl[of True]} conjs
 | 
| 56538 
7c3b6b799b94
observe also DEADID BNFs and associate the conjunction in rel_inject to the right
 kuncar parents: 
56524diff
changeset | 354 | val conjuncts = if is_eqn thm then thm |> get_rhs |> HOLogic.dest_conj else [] | 
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 355 | val kill_top = Local_Defs.unfold lthy [kill_top2] #> Local_Defs.unfold lthy [kill_top1] | 
| 56538 
7c3b6b799b94
observe also DEADID BNFs and associate the conjunction in rel_inject to the right
 kuncar parents: 
56524diff
changeset | 356 |         val kill_True = Local_Defs.unfold lthy [@{thm HOL.simp_thms(21)}]
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 357 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 358 | thm | 
| 60801 | 359 | |> Thm.instantiate' cTs cts | 
| 57399 | 360 | |> Conv.fconv_rule (HOLogic.Trueprop_conv (Conv.arg_conv | 
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 361 |           (Raw_Simplifier.rewrite lthy false @{thms eq_onp_top_eq_eq[symmetric, THEN eq_reflection]})))
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 362 | |> Local_Defs.unfold lthy eq_onps | 
| 57399 | 363 |         |> (fn thm => if conjuncts <> [] then @{thm box_equals}
 | 
| 56538 
7c3b6b799b94
observe also DEADID BNFs and associate the conjunction in rel_inject to the right
 kuncar parents: 
56524diff
changeset | 364 |               OF [thm, @{thm eq_onp_same_args}, pred_eq_onp_conj conjuncts |> kill_True]
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 365 |             else thm RS (@{thm eq_onp_same_args} RS iffD1))
 | 
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 366 | |> kill_top | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 367 | end | 
| 58458 | 368 | val rel_injects = #rel_injects (#fp_bnf_sugar fp_sugar) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 369 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 370 | rel_injects | 
| 56538 
7c3b6b799b94
observe also DEADID BNFs and associate the conjunction in rel_inject to the right
 kuncar parents: 
56524diff
changeset | 371 |     |> map (Local_Defs.unfold lthy [@{thm conj_assoc}])
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 372 | |> map rel2pred_massage | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 373 | |> Variable.export lthy old_lthy | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 374 | |> map Drule.zero_var_indexes | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 375 | end | 
| 59823 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 376 | handle NO_PRED_DATA () => [] | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 377 | |
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 378 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 379 | (* fp_sugar interpretation *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 380 | |
| 58722 | 381 | fun fp_sugar_transfer_rules (fp_sugar:fp_sugar) = | 
| 382 | let | |
| 383 | val fp_ctr_sugar = #fp_ctr_sugar fp_sugar | |
| 384 | val transfer_rules = #ctr_transfers fp_ctr_sugar @ #case_transfers fp_ctr_sugar | |
| 385 | @ #disc_transfers fp_ctr_sugar @ #sel_transfers fp_ctr_sugar | |
| 386 | @ (#co_rec_transfers o #fp_co_induct_sugar) fp_sugar | |
| 387 |     val transfer_attr = @{attributes [transfer_rule]}
 | |
| 388 | in | |
| 389 | map (fn thm => ((Binding.empty, []), [([thm], transfer_attr)])) transfer_rules | |
| 390 | end | |
| 391 | ||
| 392 | fun pred_injects fp_sugar lthy = | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 393 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 394 | val pred_injects = prove_pred_inject lthy fp_sugar | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 395 | fun qualify defname suffix = Binding.qualified true suffix defname | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 396 | val pred_inject_thm_name = qualify (base_name_of_bnf (bnf_of_fp_sugar fp_sugar)) "pred_inject" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 397 |     val simp_attrs = @{attributes [simp]}
 | 
| 60220 | 398 | val type_name = type_name_of_bnf (#fp_bnf fp_sugar) | 
| 399 | val pred_data = lookup_defined_pred_data lthy type_name | |
| 400 | |> Transfer.update_pred_simps pred_injects | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 401 | in | 
| 60220 | 402 | lthy | 
| 403 | |> Local_Theory.note ((pred_inject_thm_name, simp_attrs), pred_injects) | |
| 404 | |> snd | |
| 405 |     |> Local_Theory.declaration {syntax = false, pervasive = true}
 | |
| 406 | (fn phi => Transfer.update_pred_data type_name (Transfer.morph_pred_data phi pred_data)) | |
| 407 | |> Local_Theory.restore | |
| 58722 | 408 | end | 
| 409 | ||
| 410 | ||
| 411 | fun transfer_fp_sugars_interpretation fp_sugar lthy = | |
| 412 | let | |
| 60220 | 413 | val lthy = pred_injects fp_sugar lthy | 
| 58722 | 414 | val transfer_rules_notes = fp_sugar_transfer_rules fp_sugar | 
| 415 | in | |
| 416 | lthy | |
| 60220 | 417 | |> Local_Theory.notes transfer_rules_notes | 
| 58722 | 418 | |> snd | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 419 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 420 | |
| 58659 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 421 | val _ = | 
| 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 422 | Theory.setup (fp_sugars_interpretation transfer_plugin | 
| 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 423 | (fp_sugar_only_type_ctr (fold transfer_fp_sugars_interpretation))) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 424 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 425 | end |