changeset 63313 | 0c956a9a0ac0 |
parent 63239 | d562c9948dee |
child 63853 | d0e8921da311 |
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} |