80 val no_reflexive: thm list -> thm list |
80 val no_reflexive: thm list -> thm list |
81 val zip_axioms: '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_Few_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 |
87 val user_policy: fact_policy -> Proof.context -> fact_policy |
87 val user_policy: fact_policy -> Proof.context -> fact_policy |
88 |
88 |
89 val print_bnfs: Proof.context -> unit |
89 val print_bnfs: Proof.context -> unit |
90 val bnf_def: const_policy -> (Proof.context -> fact_policy) -> (binding -> binding) -> |
90 val bnf_def: const_policy -> (Proof.context -> fact_policy) -> (binding -> binding) -> |
505 val set_bdN = "set_bd"; |
505 val set_bdN = "set_bd"; |
506 |
506 |
507 datatype const_policy = Dont_Inline | Hardly_Inline | Smart_Inline | Do_Inline; |
507 datatype const_policy = Dont_Inline | Hardly_Inline | Smart_Inline | Do_Inline; |
508 |
508 |
509 datatype fact_policy = |
509 datatype fact_policy = |
510 Derive_Some_Facts | Derive_All_Facts | Derive_All_Facts_Note_Most | Note_All_Facts_and_Axioms; |
510 Derive_Few_Facts | Derive_All_Facts | Derive_All_Facts_Note_Most | Note_All_Facts_and_Axioms; |
511 |
511 |
512 val bnf_note_all = Attrib.setup_config_bool @{binding bnf_note_all} (K false); |
512 val bnf_note_all = Attrib.setup_config_bool @{binding bnf_note_all} (K false); |
513 |
513 |
514 fun user_policy policy ctxt = |
514 fun user_policy policy ctxt = |
515 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; |
551 Type (C, Ts) => if forall (is_some o try dest_TFree) Ts |
551 Type (C, Ts) => if forall (is_some o try dest_TFree) Ts |
552 then (Binding.qualified_name C, C) else err bd_rhsT |
552 then (Binding.qualified_name C, C) else err bd_rhsT |
553 | T => err T) |
553 | T => err T) |
554 else (b, Local_Theory.full_name no_defs_lthy b); |
554 else (b, Local_Theory.full_name no_defs_lthy b); |
555 |
555 |
556 fun maybe_define (b, rhs) lthy = |
556 fun maybe_define needed_for_extra_facts (b, rhs) lthy = |
557 let |
557 let |
558 val inline = |
558 val inline = |
|
559 (not needed_for_extra_facts orelse fact_policy = Derive_Few_Facts) andalso |
559 (case const_policy of |
560 (case const_policy of |
560 Dont_Inline => false |
561 Dont_Inline => false |
561 | Hardly_Inline => Term.is_Free rhs orelse Term.is_Const rhs |
562 | Hardly_Inline => Term.is_Free rhs orelse Term.is_Const rhs |
562 | Smart_Inline => Term.size_of_term rhs <= smart_max_inline_size |
563 | Smart_Inline => Term.size_of_term rhs <= smart_max_inline_size |
563 | Do_Inline => true) |
564 | Do_Inline => true) |
590 val (((((bnf_map_term, raw_map_def), |
591 val (((((bnf_map_term, raw_map_def), |
591 (bnf_set_terms, raw_set_defs)), |
592 (bnf_set_terms, raw_set_defs)), |
592 (bnf_bd_term, raw_bd_def)), |
593 (bnf_bd_term, raw_bd_def)), |
593 (bnf_wit_terms, raw_wit_defs)), (lthy, lthy_old)) = |
594 (bnf_wit_terms, raw_wit_defs)), (lthy, lthy_old)) = |
594 no_defs_lthy |
595 no_defs_lthy |
595 |> maybe_define map_bind_def |
596 |> maybe_define false map_bind_def |
596 ||>> apfst split_list o fold_map maybe_define set_binds_defs |
597 ||>> apfst split_list o fold_map (maybe_define false) set_binds_defs |
597 ||>> maybe_define bd_bind_def |
598 ||>> maybe_define false bd_bind_def |
598 ||>> apfst split_list o fold_map maybe_define wit_binds_defs |
599 ||>> apfst split_list o fold_map (maybe_define false) wit_binds_defs |
599 ||> `(maybe_restore no_defs_lthy); |
600 ||> `(maybe_restore no_defs_lthy); |
600 |
601 |
601 val phi = Proof_Context.export_morphism lthy_old lthy; |
602 val phi = Proof_Context.export_morphism lthy_old lthy; |
602 |
603 |
603 val bnf_map_def = Morphism.thm phi raw_map_def; |
604 val bnf_map_def = Morphism.thm phi raw_map_def; |
721 |
722 |
722 val rel_bind_def = (fn () => Binding.suffix_name ("_" ^ relN) b, rel_rhs); |
723 val rel_bind_def = (fn () => Binding.suffix_name ("_" ^ relN) b, rel_rhs); |
723 |
724 |
724 val ((bnf_rel_term, raw_rel_def), (lthy, lthy_old)) = |
725 val ((bnf_rel_term, raw_rel_def), (lthy, lthy_old)) = |
725 lthy |
726 lthy |
726 |> maybe_define rel_bind_def |
727 |> maybe_define false rel_bind_def |
727 ||> `(maybe_restore lthy); |
728 ||> `(maybe_restore lthy); |
728 |
729 |
729 val phi = Proof_Context.export_morphism lthy_old lthy; |
730 val phi = Proof_Context.export_morphism lthy_old lthy; |
730 val bnf_rel_def = Morphism.thm phi raw_rel_def; |
731 val bnf_rel_def = Morphism.thm phi raw_rel_def; |
731 val bnf_rel = Morphism.term phi bnf_rel_term; |
732 val bnf_rel = Morphism.term phi bnf_rel_term; |
740 Qs As' Bs'))); |
741 Qs As' Bs'))); |
741 val pred_bind_def = (fn () => Binding.suffix_name ("_" ^ predN) b, pred_rhs); |
742 val pred_bind_def = (fn () => Binding.suffix_name ("_" ^ predN) b, pred_rhs); |
742 |
743 |
743 val ((bnf_pred_term, raw_pred_def), (lthy, lthy_old)) = |
744 val ((bnf_pred_term, raw_pred_def), (lthy, lthy_old)) = |
744 lthy |
745 lthy |
745 |> maybe_define pred_bind_def |
746 |> maybe_define true pred_bind_def |
746 ||> `(maybe_restore lthy); |
747 ||> `(maybe_restore lthy); |
747 |
748 |
748 val phi = Proof_Context.export_morphism lthy_old lthy; |
749 val phi = Proof_Context.export_morphism lthy_old lthy; |
749 val bnf_pred_def = Morphism.thm phi raw_pred_def; |
750 val bnf_pred_def = Morphism.thm phi raw_pred_def; |
750 val bnf_pred = Morphism.term phi bnf_pred_term; |
751 val bnf_pred = Morphism.term phi bnf_pred_term; |
883 |
884 |
884 val bd_Card_order = #bd_card_order axioms RS @{thm conjunct2[OF card_order_on_Card_order]}; |
885 val bd_Card_order = #bd_card_order axioms RS @{thm conjunct2[OF card_order_on_Card_order]}; |
885 val bd_Cinfinite = @{thm conjI} OF [#bd_cinfinite axioms, bd_Card_order]; |
886 val bd_Cinfinite = @{thm conjI} OF [#bd_cinfinite axioms, bd_Card_order]; |
886 val bd_Cnotzero = bd_Cinfinite RS @{thm Cinfinite_Cnotzero}; |
887 val bd_Cnotzero = bd_Cinfinite RS @{thm Cinfinite_Cnotzero}; |
887 |
888 |
888 fun mk_lazy f = if fact_policy <> Derive_Some_Facts then Lazy.value (f ()) else Lazy.lazy f; |
889 fun mk_lazy f = if fact_policy <> Derive_Few_Facts then Lazy.value (f ()) else Lazy.lazy f; |
889 |
890 |
890 fun mk_collect_set_natural () = |
891 fun mk_collect_set_natural () = |
891 let |
892 let |
892 val defT = mk_bnf_T Ts CA --> HOLogic.mk_setT T; |
893 val defT = mk_bnf_T Ts CA --> HOLogic.mk_setT T; |
893 val collect_map = HOLogic.mk_comp |
894 val collect_map = HOLogic.mk_comp |