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) = |