src/HOL/Codatatype/Tools/bnf_def.ML
changeset 49461 de07eecb2664
parent 49460 4dd451a075ce
child 49462 9ef072c757ca
equal deleted inserted replaced
49460:4dd451a075ce 49461:de07eecb2664
    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