| author | wenzelm | 
| Sun, 19 Mar 2017 14:43:54 +0100 | |
| changeset 65326 | cb7cb57c7ce1 | 
| parent 63859 | dca6fabd8060 | 
| child 67703 | 8c4806fe827f | 
| 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 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 31 | fun mk_Domainp P = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 32 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 33 | val PT = fastype_of P | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 34 | val argT = hd (binder_types PT) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 35 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 36 |     Const (@{const_name Domainp}, PT --> argT --> HOLogic.boolT) $ P
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 37 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 38 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 39 | 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 | 40 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 41 | fun is_Type (Type _) = true | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 42 | | is_Type _ = false | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 43 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 44 | 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 | 45 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 46 | 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 | 47 | |
| 61768 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 48 | fun fp_sugar_only_type_ctr f fp_sugars = | 
| 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 49 | (case filter (is_Type o T_of_bnf o bnf_of_fp_sugar) fp_sugars of | 
| 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 50 | [] => I | 
| 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 51 | | fp_sugars' => f fp_sugars') | 
| 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 52 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 53 | (* relation constraints - bi_total & co. *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 54 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 55 | fun mk_relation_constraint name arg = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 56 | (Const (name, fastype_of arg --> HOLogic.boolT)) $ arg | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 57 | |
| 62334 | 58 | fun side_constraint_tac bnf constr_defs ctxt = | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 59 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 60 | 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 | 61 | rel_OO_of_bnf bnf] | 
| 57399 | 62 | in | 
| 63170 | 63 | SELECT_GOAL (Local_Defs.unfold0_tac ctxt thms) THEN' rtac ctxt (rel_mono_of_bnf bnf) | 
| 62334 | 64 | THEN_ALL_NEW assume_tac ctxt | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 65 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 66 | |
| 62334 | 67 | fun bi_constraint_tac constr_iff sided_constr_intros ctxt = | 
| 63170 | 68 | SELECT_GOAL (Local_Defs.unfold0_tac ctxt [constr_iff]) THEN' | 
| 60728 | 69 | CONJ_WRAP' (fn thm => rtac ctxt thm THEN_ALL_NEW | 
| 62334 | 70 | (REPEAT_DETERM o etac ctxt conjE THEN' assume_tac ctxt)) sided_constr_intros | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 71 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 72 | fun generate_relation_constraint_goal ctxt bnf constraint_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 73 | let | 
| 59582 | 74 | val constr_name = | 
| 75 | 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 | 76 | |> head_of |> fst o dest_Const | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 77 | val live = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 78 | val (((As, Bs), Ds), ctxt) = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 79 | |> mk_TFrees live | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 80 | ||>> mk_TFrees live | 
| 60207 | 81 | ||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf)) | 
| 57399 | 82 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 83 | 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 | 84 | val relsT = map2 mk_pred2T As Bs | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 85 | 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 | 86 | 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 | 87 | 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 | 88 | val goal = Logic.list_implies (assms, concl) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 89 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 90 | (goal, ctxt) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 91 | end | 
| 
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 prove_relation_side_constraint ctxt bnf constraint_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 94 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 95 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 96 | 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 | 97 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 98 |       (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 | 99 | |> Thm.close_derivation | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 100 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 101 | 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 | 102 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 103 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 104 | 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 | 105 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 106 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 107 | 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 | 108 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 109 |       (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 | 110 | |> Thm.close_derivation | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 111 | in | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 112 | 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 | 113 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 114 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 115 | 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 | 116 |   ("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 | 117 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 118 | fun prove_relation_constraints bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 119 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 120 |     val transfer_attr = @{attributes [transfer_rule]}
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 121 | val Tname = base_name_of_bnf bnf | 
| 57399 | 122 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 123 | val defs = map (apsnd (prove_relation_side_constraint lthy bnf)) defs | 
| 57399 | 124 |     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 | 125 | [snd (nth defs 0), snd (nth defs 1)] | 
| 57399 | 126 |     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 | 127 | [snd (nth defs 2), snd (nth defs 3)] | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 128 |     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 | 129 | in | 
| 63003 | 130 | maps (fn (a, thm) => [((Binding.qualify_name true Tname a, []), [([thm], transfer_attr)])]) defs | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 131 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 132 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 133 | (* relator_eq *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 134 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 135 | fun relator_eq bnf = | 
| 63352 | 136 |   [(Binding.empty_atts, [([rel_eq_of_bnf bnf], @{attributes [relator_eq]})])]
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 137 | |
| 58722 | 138 | (* transfer rules *) | 
| 139 | ||
| 140 | fun bnf_transfer_rules bnf = | |
| 141 | let | |
| 62329 | 142 | val transfer_rules = map_transfer_of_bnf bnf :: pred_transfer_of_bnf bnf | 
| 143 | :: rel_transfer_of_bnf bnf :: set_transfer_of_bnf bnf | |
| 58722 | 144 |     val transfer_attr = @{attributes [transfer_rule]}
 | 
| 145 | in | |
| 63352 | 146 | map (fn thm => (Binding.empty_atts, [([thm],transfer_attr)])) transfer_rules | 
| 58722 | 147 | end | 
| 148 | ||
| 62324 | 149 | (* Domainp theorem for predicator *) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 150 | |
| 62334 | 151 | fun Domainp_tac bnf pred_def ctxt = | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 152 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 153 | val n = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 154 | val set_map's = set_map_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 155 | in | 
| 63170 | 156 |     EVERY' [rtac ctxt ext, SELECT_GOAL (Local_Defs.unfold0_tac ctxt [@{thm Domainp.simps},
 | 
| 60728 | 157 | 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 | 158 | REPEAT_DETERM o eresolve_tac ctxt [exE, conjE, CollectE], hyp_subst_tac ctxt, | 
| 60728 | 159 | CONJ_WRAP' (fn set_map => EVERY' [rtac ctxt ballI, dtac ctxt (set_map RS equalityD1 RS set_mp), | 
| 160 | 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 | 161 |           REPEAT_DETERM o eresolve_tac ctxt [CollectE, @{thm case_prodE}],
 | 
| 60728 | 162 |           hyp_subst_tac ctxt, rtac ctxt @{thm iffD2[OF arg_cong2[of _ _ _ _ Domainp, OF refl fst_conv]]},
 | 
| 163 |           etac ctxt @{thm DomainPI}]) set_map's,
 | |
| 164 | REPEAT_DETERM o etac ctxt conjE, | |
| 59498 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 wenzelm parents: 
59276diff
changeset | 165 | REPEAT_DETERM o resolve_tac ctxt [exI, (refl RS conjI), rotate_prems 1 conjI], | 
| 60728 | 166 | 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 | 167 | map_id_of_bnf bnf]), | 
| 60728 | 168 |         REPEAT_DETERM_N n o (EVERY' [rtac ctxt @{thm box_equals[OF _ sym[OF o_apply] sym[OF id_apply]]},
 | 
| 169 |           rtac ctxt @{thm fst_conv}]), rtac ctxt CollectI,
 | |
| 170 |         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 | 171 |           REPEAT_DETERM o resolve_tac ctxt [@{thm image_subsetI}, CollectI, @{thm case_prodI}],
 | 
| 60728 | 172 | dtac ctxt (rotate_prems 1 bspec), assume_tac ctxt, | 
| 173 |           etac ctxt @{thm DomainpE}, etac ctxt @{thm someI}]) set_map's
 | |
| 62334 | 174 | ] | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 175 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 176 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 177 | fun prove_Domainp_rel ctxt bnf pred_def = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 178 | let | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 179 | val live = live_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 180 | val old_ctxt = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 181 | val (((As, Bs), Ds), ctxt) = ctxt | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 182 | |> mk_TFrees live | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 183 | ||>> mk_TFrees live | 
| 60207 | 184 | ||>> 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 | 185 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 186 | 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 | 187 | val relsT = map2 mk_pred2T As Bs | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 188 | 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 | 189 | val lhs = mk_Domainp (list_comb (relator, args)) | 
| 62324 | 190 | val rhs = Term.list_comb (mk_pred_of_bnf Ds As bnf, map mk_Domainp args) | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 191 | 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 | 192 | val thm = Goal.prove_sorry ctxt [] [] goal | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 193 |       (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 | 194 | |> Thm.close_derivation | 
| 56524 
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 | 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 | 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 predicator bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 200 | let | 
| 62324 | 201 | val pred_def = pred_set_of_bnf bnf | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 202 | val Domainp_rel = prove_Domainp_rel lthy bnf pred_def | 
| 62324 | 203 | val rel_eq_onp = rel_eq_onp_of_bnf bnf | 
| 63003 | 204 | val Domainp_rel_thm_name = Binding.qualify_name true (base_name_of_bnf bnf) "Domainp_rel" | 
| 60220 | 205 | 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 | 206 | val type_name = type_name_of_bnf bnf | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 207 |     val relator_domain_attr = @{attributes [relator_domain]}
 | 
| 62324 | 208 | val notes = [((Domainp_rel_thm_name, []), [([Domainp_rel], relator_domain_attr)])] | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 209 | in | 
| 58356 | 210 | lthy | 
| 211 | |> Local_Theory.notes notes | |
| 212 | |> snd | |
| 213 |     |> Local_Theory.declaration {syntax = false, pervasive = true}
 | |
| 214 | (fn phi => Transfer.update_pred_data type_name (Transfer.morph_pred_data phi pred_data)) | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 215 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 216 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 217 | (* BNF interpretation *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 218 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 219 | fun transfer_bnf_interpretation bnf lthy = | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 220 | let | 
| 58356 | 221 | val dead = dead_of_bnf bnf | 
| 222 | val constr_notes = if dead > 0 then [] else prove_relation_constraints bnf lthy | |
| 223 | val relator_eq_notes = if dead > 0 then [] else relator_eq bnf | |
| 58722 | 224 | 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 | 225 | in | 
| 58356 | 226 | lthy | 
| 58722 | 227 | |> Local_Theory.notes (constr_notes @ relator_eq_notes @ transfer_rule_notes) | 
| 58356 | 228 | |> snd | 
| 229 | |> predicator bnf | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 230 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 231 | |
| 58659 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 232 | val _ = | 
| 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 233 | Theory.setup | 
| 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 234 | (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 | 235 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 236 | (* simplification rules for the predicator *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 237 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 238 | 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 | 239 | case Transfer.lookup_pred_data lthy name of | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 240 | SOME data => data | 
| 59823 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 blanchet parents: 
59621diff
changeset | 241 | | NONE => raise NO_PRED_DATA () | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 242 | |
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56651diff
changeset | 243 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 244 | (* fp_sugar interpretation *) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 245 | |
| 58722 | 246 | fun fp_sugar_transfer_rules (fp_sugar:fp_sugar) = | 
| 247 | let | |
| 248 | val fp_ctr_sugar = #fp_ctr_sugar fp_sugar | |
| 62531 | 249 | val transfer_rules = #ctr_transfers fp_ctr_sugar @ #case_transfers fp_ctr_sugar | 
| 250 | @ #disc_transfers fp_ctr_sugar @ #sel_transfers fp_ctr_sugar | |
| 63859 
dca6fabd8060
make (co)induct component of 'fp_sugar' optional, for the benefit of nonuniform (co)datatypes and other similar extensions
 blanchet parents: 
63352diff
changeset | 251 | @ these (Option.map #co_rec_transfers (#fp_co_induct_sugar fp_sugar)) | 
| 58722 | 252 |     val transfer_attr = @{attributes [transfer_rule]}
 | 
| 253 | in | |
| 63352 | 254 | map (fn thm => (Binding.empty_atts, [([thm], transfer_attr)])) transfer_rules | 
| 58722 | 255 | end | 
| 256 | ||
| 62335 | 257 | fun register_pred_injects fp_sugar lthy = | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 258 | let | 
| 62335 | 259 | val pred_injects = #pred_injects (#fp_bnf_sugar fp_sugar) | 
| 60220 | 260 | val type_name = type_name_of_bnf (#fp_bnf fp_sugar) | 
| 62531 | 261 | val pred_data = lookup_defined_pred_data lthy type_name | 
| 60220 | 262 | |> Transfer.update_pred_simps pred_injects | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 263 | in | 
| 62531 | 264 | lthy | 
| 60220 | 265 |     |> Local_Theory.declaration {syntax = false, pervasive = true}
 | 
| 62334 | 266 | (fn phi => Transfer.update_pred_data type_name (Transfer.morph_pred_data phi pred_data)) | 
| 58722 | 267 | end | 
| 268 | ||
| 269 | fun transfer_fp_sugars_interpretation fp_sugar lthy = | |
| 270 | let | |
| 62335 | 271 | val lthy = register_pred_injects fp_sugar lthy | 
| 58722 | 272 | val transfer_rules_notes = fp_sugar_transfer_rules fp_sugar | 
| 273 | in | |
| 274 | lthy | |
| 60220 | 275 | |> Local_Theory.notes transfer_rules_notes | 
| 58722 | 276 | |> snd | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 277 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 278 | |
| 58659 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 wenzelm parents: 
58458diff
changeset | 279 | val _ = | 
| 61768 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 280 | Theory.setup (fp_sugars_interpretation transfer_plugin | 
| 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 blanchet parents: 
61761diff
changeset | 281 | (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 | 282 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: diff
changeset | 283 | end |