33 val isN = "is_"; |
33 val isN = "is_"; |
34 val unN = "un_"; |
34 val unN = "un_"; |
35 fun mk_unN 1 1 suf = unN ^ suf |
35 fun mk_unN 1 1 suf = unN ^ suf |
36 | mk_unN _ l suf = unN ^ suf ^ string_of_int l; |
36 | mk_unN _ l suf = unN ^ suf ^ string_of_int l; |
37 |
37 |
|
38 val caseN = "case"; |
38 val case_congN = "case_cong"; |
39 val case_congN = "case_cong"; |
39 val case_eqN = "case_eq"; |
40 val case_convN = "case_conv"; |
40 val casesN = "cases"; |
|
41 val collapseN = "collapse"; |
41 val collapseN = "collapse"; |
42 val disc_excludeN = "disc_exclude"; |
42 val disc_excludeN = "disc_exclude"; |
43 val disc_exhaustN = "disc_exhaust"; |
43 val disc_exhaustN = "disc_exhaust"; |
44 val discsN = "discs"; |
44 val discsN = "discs"; |
45 val distinctN = "distinct"; |
45 val distinctN = "distinct"; |
380 in |
380 in |
381 Skip_Proof.prove lthy [] [] goal (fn _ => mk_nchotomy_tac n exhaust_thm) |
381 Skip_Proof.prove lthy [] [] goal (fn _ => mk_nchotomy_tac n exhaust_thm) |
382 end; |
382 end; |
383 |
383 |
384 val (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms, |
384 val (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms, |
385 disc_exhaust_thms, collapse_thms, expand_thms, case_eq_thms) = |
385 disc_exhaust_thms, collapse_thms, expand_thms, case_conv_thms) = |
386 if no_dests then |
386 if no_dests then |
387 ([], [], [], [], [], [], [], [], [], []) |
387 ([], [], [], [], [], [], [], [], [], []) |
388 else |
388 else |
389 let |
389 let |
390 fun make_sel_thm xs' case_thm sel_def = |
390 fun make_sel_thm xs' case_thm sel_def = |
537 (inst_thm v disc_exhaust_thm) uncollapse_thms disc_exclude_thmsss |
537 (inst_thm v disc_exhaust_thm) uncollapse_thms disc_exclude_thmsss |
538 disc_exclude_thmsss')] |
538 disc_exclude_thmsss')] |
539 |> Proof_Context.export names_lthy lthy |
539 |> Proof_Context.export names_lthy lthy |
540 end; |
540 end; |
541 |
541 |
542 val case_eq_thms = |
542 val case_conv_thms = |
543 let |
543 let |
544 fun mk_body f usels = Term.list_comb (f, usels); |
544 fun mk_body f usels = Term.list_comb (f, usels); |
545 val goal = mk_Trueprop_eq (ufcase, mk_IfN B udiscs (map2 mk_body fs uselss)); |
545 val goal = mk_Trueprop_eq (ufcase, mk_IfN B udiscs (map2 mk_body fs uselss)); |
546 in |
546 in |
547 [Skip_Proof.prove lthy [] [] goal (fn {context = ctxt, ...} => |
547 [Skip_Proof.prove lthy [] [] goal (fn {context = ctxt, ...} => |
548 mk_case_eq_tac ctxt n uexhaust_thm case_thms disc_thmss' sel_thmss)] |
548 mk_case_conv_tac ctxt n uexhaust_thm case_thms disc_thmss' sel_thmss)] |
549 |> Proof_Context.export names_lthy lthy |
549 |> Proof_Context.export names_lthy lthy |
550 end; |
550 end; |
551 in |
551 in |
552 (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms, |
552 (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms, |
553 [disc_exhaust_thm], collapse_thms, expand_thms, case_eq_thms) |
553 [disc_exhaust_thm], collapse_thms, expand_thms, case_conv_thms) |
554 end; |
554 end; |
555 |
555 |
556 val (case_cong_thm, weak_case_cong_thm) = |
556 val (case_cong_thm, weak_case_cong_thm) = |
557 let |
557 let |
558 fun mk_prem xctr xs f g = |
558 fun mk_prem xctr xs f g = |
599 |
599 |
600 val exhaust_case_names_attr = Attrib.internal (K (Rule_Cases.case_names exhaust_cases)); |
600 val exhaust_case_names_attr = Attrib.internal (K (Rule_Cases.case_names exhaust_cases)); |
601 val cases_type_attr = Attrib.internal (K (Induct.cases_type dataT_name)); |
601 val cases_type_attr = Attrib.internal (K (Induct.cases_type dataT_name)); |
602 |
602 |
603 val notes = |
603 val notes = |
604 [(case_congN, [case_cong_thm], []), |
604 [(caseN, case_thms, simp_attrs), |
605 (case_eqN, case_eq_thms, []), |
605 (case_congN, [case_cong_thm], []), |
606 (casesN, case_thms, simp_attrs), |
606 (case_convN, case_conv_thms, []), |
607 (collapseN, collapse_thms, simp_attrs), |
607 (collapseN, collapse_thms, simp_attrs), |
608 (discsN, disc_thms, simp_attrs), |
608 (discsN, disc_thms, simp_attrs), |
609 (disc_excludeN, disc_exclude_thms, []), |
609 (disc_excludeN, disc_exclude_thms, []), |
610 (disc_exhaustN, disc_exhaust_thms, [exhaust_case_names_attr]), |
610 (disc_exhaustN, disc_exhaust_thms, [exhaust_case_names_attr]), |
611 (distinctN, distinct_thms, simp_attrs @ induct_simp_attrs), |
611 (distinctN, distinct_thms, simp_attrs @ induct_simp_attrs), |