src/HOL/Codatatype/Tools/bnf_def.ML
changeset 49460 4dd451a075ce
parent 49459 3f8e2b5249ec
child 49461 de07eecb2664
equal deleted inserted replaced
49459:3f8e2b5249ec 49460:4dd451a075ce
    75 
    75 
    76   val mk_witness: int list * term -> thm list -> nonemptiness_witness
    76   val mk_witness: int list * term -> thm list -> nonemptiness_witness
    77   val minimize_wits: (''a list * 'b) list -> (''a list * 'b) list
    77   val minimize_wits: (''a list * 'b) list -> (''a list * 'b) list
    78   val wits_of_bnf: BNF -> nonemptiness_witness list
    78   val wits_of_bnf: BNF -> nonemptiness_witness list
    79 
    79 
    80   val filter_out_refl: thm list -> thm list
    80   val no_reflexive: thm list -> thm list
    81   val zip_goals: 'a -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a -> 'a list
    81   val zip_axioms: 'a -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a list -> 'a -> 'a -> 'a -> 'a list
    82 
    82 
    83   datatype const_policy = Dont_Inline | Hardly_Inline | Smart_Inline | Do_Inline
    83   datatype const_policy = Dont_Inline | Hardly_Inline | Smart_Inline | Do_Inline
    84   datatype fact_policy =
    84   datatype fact_policy =
    85     Derive_Some_Facts | Derive_All_Facts | Derive_All_Facts_Note_Most | Note_All_Facts_and_Axioms
    85     Derive_Some_Facts | Derive_All_Facts | Derive_All_Facts_Note_Most | Note_All_Facts_and_Axioms
    86   val bnf_note_all: bool Config.T
    86   val bnf_note_all: bool Config.T
   132   ||>> dest_cons
   132   ||>> dest_cons
   133   ||>> dest_cons
   133   ||>> dest_cons
   134   ||> the_single
   134   ||> the_single
   135   |> mk_axioms';
   135   |> mk_axioms';
   136 
   136 
       
   137 fun zip_axioms mid mcomp mcong snat bdco bdinf sbd inbd wpull rel =
       
   138   [mid, mcomp, mcong] @ snat @ [bdco, bdinf] @ sbd @ [inbd, wpull, rel];
       
   139 
   137 fun dest_axioms {map_id, map_comp, map_cong, set_natural, bd_card_order, bd_cinfinite, set_bd,
   140 fun dest_axioms {map_id, map_comp, map_cong, set_natural, bd_card_order, bd_cinfinite, set_bd,
   138   in_bd, map_wpull, rel_O_Gr} =
   141   in_bd, map_wpull, rel_O_Gr} =
   139   [map_id, map_comp, map_cong] @ set_natural @ [bd_card_order, bd_cinfinite] @
   142   zip_axioms map_id map_comp map_cong set_natural bd_card_order bd_cinfinite set_bd in_bd map_wpull
   140   set_bd @ [in_bd, map_wpull, rel_O_Gr];
   143   rel_O_Gr;
   141 
   144 
   142 fun map_axioms f
   145 fun map_axioms f
   143   {map_id = map_id, map_comp = map_comp, map_cong = map_cong, set_natural = set_natural,
   146   {map_id = map_id, map_comp = map_comp, map_cong = map_cong, set_natural = set_natural,
   144    bd_card_order = bd_card_order, bd_cinfinite = bd_cinfinite, set_bd = set_bd, in_bd = in_bd,
   147    bd_card_order = bd_card_order, bd_cinfinite = bd_cinfinite, set_bd = set_bd, in_bd = in_bd,
   145    map_wpull = map_wpull, rel_O_Gr} =
   148    map_wpull = map_wpull, rel_O_Gr} =
   511 fun user_policy policy ctxt =
   514 fun user_policy policy ctxt =
   512   if Config.get ctxt bnf_note_all then Note_All_Facts_and_Axioms else policy;
   515   if Config.get ctxt bnf_note_all then Note_All_Facts_and_Axioms else policy;
   513 
   516 
   514 val smart_max_inline_size = 25; (*FUDGE*)
   517 val smart_max_inline_size = 25; (*FUDGE*)
   515 
   518 
   516 val no_def = Drule.reflexive_thm;
   519 fun is_refl thm =
   517 val no_fact = refl;
   520   op aconv (HOLogic.dest_eq (HOLogic.dest_Trueprop (Thm.prop_of thm)))
   518 
   521   handle TERM _ => false;
   519 fun is_reflexive th =
   522 
   520   let val t = Thm.prop_of th;
   523 val no_refl = filter_out is_refl;
   521   in
   524 val no_reflexive = filter_out Thm.is_reflexive;
   522     op aconv (Logic.dest_equals t)
       
   523     handle TERM _ => op aconv (HOLogic.dest_eq (HOLogic.dest_Trueprop t))
       
   524       handle TERM _ => false
       
   525   end;
       
   526 
       
   527 val filter_out_refl = filter_out is_reflexive;
       
   528 
       
   529 fun zip_goals mid mcomp mcong snat bdco bdinf sbd inbd wpull rel =
       
   530   [mid, mcomp, mcong] @ snat @ [bdco, bdinf] @ sbd @ [inbd, wpull, rel];
       
   531 
   525 
   532 
   526 
   533 (* Define new BNFs *)
   527 (* Define new BNFs *)
   534 
   528 
   535 fun prepare_def const_policy mk_fact_policy qualify prep_term Ds_opt
   529 fun prepare_def const_policy mk_fact_policy qualify prep_term Ds_opt
   567           | Hardly_Inline => Term.is_Free rhs orelse Term.is_Const rhs
   561           | Hardly_Inline => Term.is_Free rhs orelse Term.is_Const rhs
   568           | Smart_Inline => Term.size_of_term rhs <= smart_max_inline_size
   562           | Smart_Inline => Term.size_of_term rhs <= smart_max_inline_size
   569           | Do_Inline => true)
   563           | Do_Inline => true)
   570       in
   564       in
   571         if inline then
   565         if inline then
   572           ((rhs, no_def), lthy)
   566           ((rhs, Drule.reflexive_thm), lthy)
   573         else
   567         else
   574           let val b = b () in
   568           let val b = b () in
   575             apfst (apsnd snd) (Local_Theory.define ((b, NoSyn), ((Thm.def_binding b, []), rhs))
   569             apfst (apsnd snd) (Local_Theory.define ((b, NoSyn), ((Thm.def_binding b, []), rhs))
   576               lthy)
   570               lthy)
   577           end
   571           end
   731       lthy
   725       lthy
   732       |> maybe_define rel_bind_def
   726       |> maybe_define rel_bind_def
   733       ||> `(maybe_restore lthy);
   727       ||> `(maybe_restore lthy);
   734 
   728 
   735     val phi = Proof_Context.export_morphism lthy_old lthy;
   729     val phi = Proof_Context.export_morphism lthy_old lthy;
   736 
       
   737     val bnf_rel_def = Morphism.thm phi raw_rel_def;
   730     val bnf_rel_def = Morphism.thm phi raw_rel_def;
   738 
       
   739     val bnf_rel = Morphism.term phi bnf_rel_term;
   731     val bnf_rel = Morphism.term phi bnf_rel_term;
   740 
   732 
   741     fun mk_bnf_rel setRTs CA' CB' = normalize_rel lthy setRTs CA' CB' bnf_rel;
   733     fun mk_bnf_rel setRTs CA' CB' = normalize_rel lthy setRTs CA' CB' bnf_rel;
   742 
   734 
   743     val relAsBs = mk_bnf_rel setRTs CA' CB';
   735     val relAsBs = mk_bnf_rel setRTs CA' CB';
   752       lthy
   744       lthy
   753       |> maybe_define pred_bind_def
   745       |> maybe_define pred_bind_def
   754       ||> `(maybe_restore lthy);
   746       ||> `(maybe_restore lthy);
   755 
   747 
   756     val phi = Proof_Context.export_morphism lthy_old lthy;
   748     val phi = Proof_Context.export_morphism lthy_old lthy;
   757 
   749     val bnf_pred_def = Morphism.thm phi raw_pred_def;
   758     val bnf_pred_def =
       
   759       if fact_policy <> Derive_Some_Facts then
       
   760         mk_unabs_def (live + 2) (Morphism.thm phi raw_pred_def RS meta_eq_to_obj_eq)
       
   761       else
       
   762         no_fact;
       
   763 
       
   764     val bnf_pred = Morphism.term phi bnf_pred_term;
   750     val bnf_pred = Morphism.term phi bnf_pred_term;
   765 
   751 
   766     fun mk_bnf_pred QTs CA' CB' = normalize_pred lthy QTs CA' CB' bnf_pred;
   752     fun mk_bnf_pred QTs CA' CB' = normalize_pred lthy QTs CA' CB' bnf_pred;
   767 
   753 
   768     val pred = mk_bnf_pred QTs CA' CB';
   754     val pred = mk_bnf_pred QTs CA' CB';
   769 
   755 
   770     val _ = case filter_out_refl (raw_map_def :: raw_set_defs @ [raw_bd_def] @
   756     val _ = case no_reflexive (raw_map_def :: raw_set_defs @ [raw_bd_def] @
   771         raw_wit_defs @ [raw_rel_def, raw_pred_def]) of
   757         raw_wit_defs @ [raw_rel_def, raw_pred_def]) of
   772         [] => ()
   758         [] => ()
   773       | defs => Proof_Display.print_consts true lthy_old (K false)
   759       | defs => Proof_Display.print_consts true lthy_old (K false)
   774           (map (dest_Free o fst o Logic.dest_equals o prop_of) defs);
   760           (map (dest_Free o fst o Logic.dest_equals o prop_of) defs);
   775 
   761 
   866       end;
   852       end;
   867 
   853 
   868     val rel_O_Gr_goal =
   854     val rel_O_Gr_goal =
   869       fold_rev Logic.all Rs (mk_Trueprop_eq (Term.list_comb (relAsBs, Rs), rel_O_Gr_rhs));
   855       fold_rev Logic.all Rs (mk_Trueprop_eq (Term.list_comb (relAsBs, Rs), rel_O_Gr_rhs));
   870 
   856 
   871     val goals = zip_goals map_id_goal map_comp_goal map_cong_goal set_naturals_goal
   857     val goals = zip_axioms map_id_goal map_comp_goal map_cong_goal set_naturals_goal
   872       card_order_bd_goal cinfinite_bd_goal set_bds_goal in_bd_goal map_wpull_goal rel_O_Gr_goal;
   858       card_order_bd_goal cinfinite_bd_goal set_bds_goal in_bd_goal map_wpull_goal rel_O_Gr_goal;
   873 
   859 
   874     fun mk_wit_goals (I, wit) =
   860     fun mk_wit_goals (I, wit) =
   875       let
   861       let
   876         val xs = map (nth bs) I;
   862         val xs = map (nth bs) I;
   988               (fn _ => mk_map_wppull_tac (#map_id axioms) (#map_cong axioms)
   974               (fn _ => mk_map_wppull_tac (#map_id axioms) (#map_cong axioms)
   989                 (#map_wpull axioms) (Lazy.force map_comp') (map Lazy.force set_natural'))
   975                 (#map_wpull axioms) (Lazy.force map_comp') (map Lazy.force set_natural'))
   990             |> Thm.close_derivation
   976             |> Thm.close_derivation
   991           end;
   977           end;
   992 
   978 
   993         val rel_O_Gr = #rel_O_Gr axioms;
   979         val rel_O_Grs = no_refl [#rel_O_Gr axioms];
   994 
   980 
   995         val map_wppull = mk_lazy mk_map_wppull;
   981         val map_wppull = mk_lazy mk_map_wppull;
   996 
   982 
   997         fun mk_rel_Gr () =
   983         fun mk_rel_Gr () =
   998           let
   984           let
   999             val lhs = Term.list_comb (relAsBs, map2 mk_Gr As fs);
   985             val lhs = Term.list_comb (relAsBs, map2 mk_Gr As fs);
  1000             val rhs = mk_Gr (mk_in As bnf_sets_As CA') (Term.list_comb (bnf_map_AsBs, fs));
   986             val rhs = mk_Gr (mk_in As bnf_sets_As CA') (Term.list_comb (bnf_map_AsBs, fs));
  1001             val goal = fold_rev Logic.all (As @ fs) (mk_Trueprop_eq (lhs, rhs));
   987             val goal = fold_rev Logic.all (As @ fs) (mk_Trueprop_eq (lhs, rhs));
  1002           in
   988           in
  1003             Skip_Proof.prove lthy [] [] goal
   989             Skip_Proof.prove lthy [] [] goal
  1004               (mk_rel_Gr_tac rel_O_Gr (#map_id axioms) (#map_cong axioms)
   990               (mk_rel_Gr_tac rel_O_Grs (#map_id axioms) (#map_cong axioms)
  1005                 (#map_wpull axioms) (Lazy.force in_cong) (Lazy.force map_id')
   991                 (#map_wpull axioms) (Lazy.force in_cong) (Lazy.force map_id')
  1006                 (Lazy.force map_comp') (map Lazy.force set_natural'))
   992                 (Lazy.force map_comp') (map Lazy.force set_natural'))
  1007             |> Thm.close_derivation
   993             |> Thm.close_derivation
  1008           end;
   994           end;
  1009 
   995 
  1018             val mono_prems = mk_rel_prems mk_subset;
  1004             val mono_prems = mk_rel_prems mk_subset;
  1019             val mono_concl = mk_rel_concl (uncurry mk_subset);
  1005             val mono_concl = mk_rel_concl (uncurry mk_subset);
  1020           in
  1006           in
  1021             Skip_Proof.prove lthy [] []
  1007             Skip_Proof.prove lthy [] []
  1022               (fold_rev Logic.all (Rs @ Rs_copy) (Logic.list_implies (mono_prems, mono_concl)))
  1008               (fold_rev Logic.all (Rs @ Rs_copy) (Logic.list_implies (mono_prems, mono_concl)))
  1023               (mk_rel_mono_tac rel_O_Gr (Lazy.force in_mono))
  1009               (mk_rel_mono_tac rel_O_Grs (Lazy.force in_mono))
  1024             |> Thm.close_derivation
  1010             |> Thm.close_derivation
  1025           end;
  1011           end;
  1026 
  1012 
  1027         fun mk_rel_cong () =
  1013         fun mk_rel_cong () =
  1028           let
  1014           let
  1054             val relBsAs = mk_bnf_rel setRT's CB' CA';
  1040             val relBsAs = mk_bnf_rel setRT's CB' CA';
  1055             val lhs = Term.list_comb (relBsAs, map mk_converse Rs);
  1041             val lhs = Term.list_comb (relBsAs, map mk_converse Rs);
  1056             val rhs = mk_converse (Term.list_comb (relAsBs, Rs));
  1042             val rhs = mk_converse (Term.list_comb (relAsBs, Rs));
  1057             val le_goal = fold_rev Logic.all Rs (HOLogic.mk_Trueprop (mk_subset lhs rhs));
  1043             val le_goal = fold_rev Logic.all Rs (HOLogic.mk_Trueprop (mk_subset lhs rhs));
  1058             val le_thm = Skip_Proof.prove lthy [] [] le_goal
  1044             val le_thm = Skip_Proof.prove lthy [] [] le_goal
  1059               (mk_rel_converse_le_tac rel_O_Gr (Lazy.force rel_Id) (#map_cong axioms)
  1045               (mk_rel_converse_le_tac rel_O_Grs (Lazy.force rel_Id) (#map_cong axioms)
  1060                 (Lazy.force map_comp') (map Lazy.force set_natural'))
  1046                 (Lazy.force map_comp') (map Lazy.force set_natural'))
  1061               |> Thm.close_derivation
  1047               |> Thm.close_derivation
  1062             val goal = fold_rev Logic.all Rs (mk_Trueprop_eq (lhs, rhs));
  1048             val goal = fold_rev Logic.all Rs (mk_Trueprop_eq (lhs, rhs));
  1063           in
  1049           in
  1064             Skip_Proof.prove lthy [] [] goal (fn _ => mk_rel_converse_tac le_thm)
  1050             Skip_Proof.prove lthy [] [] goal (fn _ => mk_rel_converse_tac le_thm)
  1074             val lhs = Term.list_comb (relAsCs, map2 (curry mk_rel_comp) Rs Ss);
  1060             val lhs = Term.list_comb (relAsCs, map2 (curry mk_rel_comp) Rs Ss);
  1075             val rhs = mk_rel_comp (Term.list_comb (relAsBs, Rs), Term.list_comb (relBsCs, Ss));
  1061             val rhs = mk_rel_comp (Term.list_comb (relAsBs, Rs), Term.list_comb (relBsCs, Ss));
  1076             val goal = fold_rev Logic.all (Rs @ Ss) (mk_Trueprop_eq (lhs, rhs));
  1062             val goal = fold_rev Logic.all (Rs @ Ss) (mk_Trueprop_eq (lhs, rhs));
  1077           in
  1063           in
  1078             Skip_Proof.prove lthy [] [] goal
  1064             Skip_Proof.prove lthy [] [] goal
  1079               (mk_rel_O_tac rel_O_Gr (Lazy.force rel_Id) (#map_cong axioms)
  1065               (mk_rel_O_tac rel_O_Grs (Lazy.force rel_Id) (#map_cong axioms)
  1080                 (Lazy.force map_wppull) (Lazy.force map_comp') (map Lazy.force set_natural'))
  1066                 (Lazy.force map_wppull) (Lazy.force map_comp') (map Lazy.force set_natural'))
  1081             |> Thm.close_derivation
  1067             |> Thm.close_derivation
  1082           end;
  1068           end;
  1083 
  1069 
  1084         val rel_O = mk_lazy mk_rel_O;
  1070         val rel_O = mk_lazy mk_rel_O;
  1095               HOLogic.mk_exists (fst z', snd z', HOLogic.mk_conj (HOLogic.mk_mem (z, bnf_in),
  1081               HOLogic.mk_exists (fst z', snd z', HOLogic.mk_conj (HOLogic.mk_mem (z, bnf_in),
  1096                 HOLogic.mk_conj (map_fst_eq, map_snd_eq)));
  1082                 HOLogic.mk_conj (map_fst_eq, map_snd_eq)));
  1097             val goal =
  1083             val goal =
  1098               fold_rev Logic.all (x :: y :: Rs) (mk_Trueprop_eq (lhs, rhs));
  1084               fold_rev Logic.all (x :: y :: Rs) (mk_Trueprop_eq (lhs, rhs));
  1099           in
  1085           in
  1100             Skip_Proof.prove lthy [] [] goal (mk_in_rel_tac rel_O_Gr (length bnf_sets))
  1086             Skip_Proof.prove lthy [] [] goal (mk_in_rel_tac rel_O_Grs (length bnf_sets))
  1101             |> Thm.close_derivation
  1087             |> Thm.close_derivation
  1102           end;
  1088           end;
  1103 
  1089 
  1104         val in_rel = mk_lazy mk_in_rel;
  1090         val in_rel = mk_lazy mk_in_rel;
  1105 
  1091 
  1150           |> (if fact_policy = Note_All_Facts_and_Axioms orelse
  1136           |> (if fact_policy = Note_All_Facts_and_Axioms orelse
  1151                  fact_policy = Derive_All_Facts_Note_Most then
  1137                  fact_policy = Derive_All_Facts_Note_Most then
  1152                 let
  1138                 let
  1153                   val notes =
  1139                   val notes =
  1154                     [(map_congN, [#map_cong axioms]),
  1140                     [(map_congN, [#map_cong axioms]),
  1155                     (rel_O_GrN, [rel_O_Gr]),
  1141                     (rel_O_GrN, rel_O_Grs),
  1156                     (rel_IdN, [Lazy.force (#rel_Id facts)]),
  1142                     (rel_IdN, [Lazy.force (#rel_Id facts)]),
  1157                     (rel_GrN, [Lazy.force (#rel_Gr facts)]),
  1143                     (rel_GrN, [Lazy.force (#rel_Gr facts)]),
  1158                     (rel_converseN, [Lazy.force (#rel_converse facts)]),
  1144                     (rel_converseN, [Lazy.force (#rel_converse facts)]),
  1159                     (rel_monoN, [Lazy.force (#rel_mono facts)]),
  1145                     (rel_monoN, [Lazy.force (#rel_mono facts)]),
  1160                     (rel_ON, [Lazy.force (#rel_O facts)]),
  1146                     (rel_ON, [Lazy.force (#rel_O facts)]),
  1161                     (map_id'N, [Lazy.force (#map_id' facts)]),
  1147                     (map_id'N, [Lazy.force (#map_id' facts)]),
  1162                     (map_comp'N, [Lazy.force (#map_comp' facts)]),
  1148                     (map_comp'N, [Lazy.force (#map_comp' facts)]),
  1163                     (set_natural'N, map Lazy.force (#set_natural' facts))]
  1149                     (set_natural'N, map Lazy.force (#set_natural' facts))]
       
  1150                     |> filter_out (null o #2)
  1164                     |> map (fn (thmN, thms) =>
  1151                     |> map (fn (thmN, thms) =>
  1165                       ((qualify (Binding.qualify true (Binding.name_of b) (Binding.name thmN)), []),
  1152                       ((qualify (Binding.qualify true (Binding.name_of b) (Binding.name thmN)), []),
  1166                       [(thms, [])]));
  1153                       [(thms, [])]));
  1167                 in
  1154                 in
  1168                   Local_Theory.notes notes #> snd
  1155                   Local_Theory.notes notes #> snd
  1170               else
  1157               else
  1171                 I))
  1158                 I))
  1172       end;
  1159       end;
  1173 
  1160 
  1174     val one_step_defs =
  1161     val one_step_defs =
  1175       filter_out_refl (bnf_map_def :: bnf_bd_def :: bnf_set_defs @ bnf_wit_defs @ [bnf_rel_def]);
  1162       no_reflexive (bnf_map_def :: bnf_bd_def :: bnf_set_defs @ bnf_wit_defs @ [bnf_rel_def]);
  1176   in
  1163   in
  1177     (key, goals, wit_goalss, after_qed, lthy, one_step_defs)
  1164     (key, goals, wit_goalss, after_qed, lthy, one_step_defs)
  1178   end;
  1165   end;
  1179 
  1166 
  1180 fun register_bnf key (bnf, lthy) =
  1167 fun register_bnf key (bnf, lthy) =