src/HOL/Tools/Ctr_Sugar/ctr_sugar.ML
changeset 63313 0c956a9a0ac0
parent 63239 d562c9948dee
child 63853 d0e8921da311
equal deleted inserted replaced
63312:d75d1e399698 63313:0c956a9a0ac0
   803             val asm_thm = prove_split_asm asm_goal thm;
   803             val asm_thm = prove_split_asm asm_goal thm;
   804           in
   804           in
   805             (thm, asm_thm)
   805             (thm, asm_thm)
   806           end;
   806           end;
   807 
   807 
   808         val (sel_defs, all_sel_thms, sel_thmss, disc_defs, disc_thmss, nontriv_disc_thmss,
   808         val (sel_defs, all_sel_thms, sel_thmss, disc_defs, nontriv_disc_defs, disc_thmss,
   809              discI_thms, nontriv_discI_thms, distinct_disc_thms, distinct_disc_thmsss,
   809              nontriv_disc_thmss, discI_thms, nontriv_discI_thms, distinct_disc_thms,
   810              exhaust_disc_thms, exhaust_sel_thms, all_collapse_thms, safe_collapse_thms,
   810              distinct_disc_thmsss, exhaust_disc_thms, exhaust_sel_thms, all_collapse_thms,
   811              expand_thms, split_sel_thms, split_sel_asm_thms, case_eq_if_thms, disc_eq_case_thms) =
   811              safe_collapse_thms, expand_thms, split_sel_thms, split_sel_asm_thms, case_eq_if_thms,
       
   812              disc_eq_case_thms) =
   812           if no_discs_sels then
   813           if no_discs_sels then
   813             ([], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [])
   814             ([], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [])
   814           else
   815           else
   815             let
   816             let
   816               val udiscs = map (rapp u) discs;
   817               val udiscs = map (rapp u) discs;
   817               val uselss = map (map (rapp u)) selss;
   818               val uselss = map (map (rapp u)) selss;
   818               val usel_ctrs = map2 (curry Term.list_comb) ctrs uselss;
   819               val usel_ctrs = map2 (curry Term.list_comb) ctrs uselss;
   867                   |> Thm.close_derivation
   868                   |> Thm.close_derivation
   868                 end;
   869                 end;
   869 
   870 
   870               val has_alternate_disc_def =
   871               val has_alternate_disc_def =
   871                 exists (fn def => Thm.eq_thm_prop (def, alternate_disc_no_def)) disc_defs;
   872                 exists (fn def => Thm.eq_thm_prop (def, alternate_disc_no_def)) disc_defs;
       
   873 
       
   874               val nontriv_disc_defs = disc_defs
       
   875                 |> filter_out (member Thm.eq_thm_prop [unique_disc_no_def, alternate_disc_no_def]);
   872 
   876 
   873               val disc_defs' =
   877               val disc_defs' =
   874                 map2 (fn k => fn def =>
   878                 map2 (fn k => fn def =>
   875                   if Thm.eq_thm_prop (def, unique_disc_no_def) then mk_unique_disc_def ()
   879                   if Thm.eq_thm_prop (def, unique_disc_no_def) then mk_unique_disc_def ()
   876                   else if Thm.eq_thm_prop (def, alternate_disc_no_def) then mk_alternate_disc_def k
   880                   else if Thm.eq_thm_prop (def, alternate_disc_no_def) then mk_alternate_disc_def k
  1042                        exhaust_thm (flat nontriv_disc_thmss) distinct_thms case_thms)
  1046                        exhaust_thm (flat nontriv_disc_thmss) distinct_thms case_thms)
  1043                   |> Thm.close_derivation
  1047                   |> Thm.close_derivation
  1044                   |> Conjunction.elim_balanced (length goals)
  1048                   |> Conjunction.elim_balanced (length goals)
  1045                 end;
  1049                 end;
  1046             in
  1050             in
  1047               (sel_defs, all_sel_thms, sel_thmss, disc_defs, disc_thmss, nontriv_disc_thmss,
  1051               (sel_defs, all_sel_thms, sel_thmss, disc_defs, nontriv_disc_defs, disc_thmss,
  1048                discI_thms, nontriv_discI_thms, distinct_disc_thms, distinct_disc_thmsss,
  1052                nontriv_disc_thmss, discI_thms, nontriv_discI_thms, distinct_disc_thms,
  1049                [exhaust_disc_thm], [exhaust_sel_thm], all_collapse_thms, safe_collapse_thms,
  1053                distinct_disc_thmsss, [exhaust_disc_thm], [exhaust_sel_thm], all_collapse_thms,
  1050                [expand_thm], [split_sel_thm], [split_sel_asm_thm], [case_eq_if_thm],
  1054                safe_collapse_thms, [expand_thm], [split_sel_thm], [split_sel_asm_thm],
  1051                disc_eq_case_thms)
  1055                [case_eq_if_thm], disc_eq_case_thms)
  1052             end;
  1056             end;
  1053 
  1057 
  1054         val case_distrib_thm =
  1058         val case_distrib_thm =
  1055           let
  1059           let
  1056             val args = @{map 2} (fn f => fn argTs =>
  1060             val args = @{map 2} (fn f => fn argTs =>
  1116           |> fold (Spec_Rules.add Spec_Rules.Equational)
  1120           |> fold (Spec_Rules.add Spec_Rules.Equational)
  1117             (filter_out (null o snd) (map single discs ~~ nontriv_disc_eq_thmss))
  1121             (filter_out (null o snd) (map single discs ~~ nontriv_disc_eq_thmss))
  1118           |> Local_Theory.declaration {syntax = false, pervasive = true}
  1122           |> Local_Theory.declaration {syntax = false, pervasive = true}
  1119             (fn phi => Case_Translation.register
  1123             (fn phi => Case_Translation.register
  1120                (Morphism.term phi casex) (map (Morphism.term phi) ctrs))
  1124                (Morphism.term phi casex) (map (Morphism.term phi) ctrs))
  1121           |> Local_Theory.background_theory (fold (fold Code.del_eqn) [disc_defs, sel_defs])
  1125           |> Local_Theory.background_theory (fold (fold Code.del_eqn) [nontriv_disc_defs, sel_defs])
  1122           |> plugins code_plugin ?
  1126           |> plugins code_plugin ?
  1123             Local_Theory.declaration {syntax = false, pervasive = false}
  1127             Local_Theory.declaration {syntax = false, pervasive = false}
  1124               (fn phi => Context.mapping
  1128               (fn phi => Context.mapping
  1125                  (add_ctr_code fcT_name (map (Morphism.typ phi) As)
  1129                  (add_ctr_code fcT_name (map (Morphism.typ phi) As)
  1126                     (map (dest_Const o Morphism.term phi) ctrs) (Morphism.fact phi inject_thms)
  1130                     (map (dest_Const o Morphism.term phi) ctrs) (Morphism.fact phi inject_thms)
  1133         val ctr_sugar =
  1137         val ctr_sugar =
  1134           {kind = kind, T = fcT, ctrs = ctrs, casex = casex, discs = discs, selss = selss,
  1138           {kind = kind, T = fcT, ctrs = ctrs, casex = casex, discs = discs, selss = selss,
  1135            exhaust = exhaust_thm, nchotomy = nchotomy_thm, injects = inject_thms,
  1139            exhaust = exhaust_thm, nchotomy = nchotomy_thm, injects = inject_thms,
  1136            distincts = distinct_thms, case_thms = case_thms, case_cong = case_cong_thm,
  1140            distincts = distinct_thms, case_thms = case_thms, case_cong = case_cong_thm,
  1137            case_cong_weak = case_cong_weak_thm, case_distribs = [case_distrib_thm],
  1141            case_cong_weak = case_cong_weak_thm, case_distribs = [case_distrib_thm],
  1138            split = split_thm, split_asm = split_asm_thm, disc_defs = disc_defs,
  1142            split = split_thm, split_asm = split_asm_thm, disc_defs = nontriv_disc_defs,
  1139            disc_thmss = disc_thmss, discIs = discI_thms, disc_eq_cases = disc_eq_case_thms,
  1143            disc_thmss = disc_thmss, discIs = discI_thms, disc_eq_cases = disc_eq_case_thms,
  1140            sel_defs = sel_defs, sel_thmss = sel_thmss, distinct_discsss = distinct_disc_thmsss,
  1144            sel_defs = sel_defs, sel_thmss = sel_thmss, distinct_discsss = distinct_disc_thmsss,
  1141            exhaust_discs = exhaust_disc_thms, exhaust_sels = exhaust_sel_thms,
  1145            exhaust_discs = exhaust_disc_thms, exhaust_sels = exhaust_sel_thms,
  1142            collapses = all_collapse_thms, expands = expand_thms, split_sels = split_sel_thms,
  1146            collapses = all_collapse_thms, expands = expand_thms, split_sels = split_sel_thms,
  1143            split_sel_asms = split_sel_asm_thms, case_eq_ifs = case_eq_if_thms}
  1147            split_sel_asms = split_sel_asm_thms, case_eq_ifs = case_eq_if_thms}