6 *) |
6 *) |
7 |
7 |
8 signature BNF_CTR_SUGAR = |
8 signature BNF_CTR_SUGAR = |
9 sig |
9 sig |
10 type ctr_wrap_result = |
10 type ctr_wrap_result = |
11 term list * term list list * thm * thm list * thm list * thm list * thm list list * thm list * |
11 {discs: term list, |
12 thm list list |
12 selss: term list list, |
|
13 exhaust: thm, |
|
14 injects: thm list, |
|
15 distincts: thm list, |
|
16 case_thms: thm list, |
|
17 disc_thmss: thm list list, |
|
18 discIs: thm list, |
|
19 sel_thmss: thm list list}; |
13 |
20 |
14 val rep_compat_prefix: string |
21 val rep_compat_prefix: string |
15 |
22 |
16 val mk_half_pairss: 'a list * 'a list -> ('a * 'a) list list |
23 val mk_half_pairss: 'a list * 'a list -> ('a * 'a) list list |
17 val join_halves: int -> 'a list list -> 'a list list -> 'a list * 'a list list list |
24 val join_halves: int -> 'a list list -> 'a list list -> 'a list * 'a list list list |
35 |
42 |
36 open BNF_Util |
43 open BNF_Util |
37 open BNF_Ctr_Sugar_Tactics |
44 open BNF_Ctr_Sugar_Tactics |
38 |
45 |
39 type ctr_wrap_result = |
46 type ctr_wrap_result = |
40 term list * term list list * thm * thm list * thm list * thm list * thm list list * thm list * |
47 {discs: term list, |
41 thm list list; |
48 selss: term list list, |
|
49 exhaust: thm, |
|
50 injects: thm list, |
|
51 distincts: thm list, |
|
52 case_thms: thm list, |
|
53 disc_thmss: thm list list, |
|
54 discIs: thm list, |
|
55 sel_thmss: thm list list}; |
42 |
56 |
43 val rep_compat_prefix = "new"; |
57 val rep_compat_prefix = "new"; |
44 |
58 |
45 val isN = "is_"; |
59 val isN = "is_"; |
46 val unN = "un_"; |
60 val unN = "un_"; |
669 |
683 |
670 val notes' = |
684 val notes' = |
671 [(map (fn th => th RS notE) distinct_thms, safe_elim_attrs)] |
685 [(map (fn th => th RS notE) distinct_thms, safe_elim_attrs)] |
672 |> map (fn (thms, attrs) => ((Binding.empty, attrs), [(thms, [])])); |
686 |> map (fn (thms, attrs) => ((Binding.empty, attrs), [(thms, [])])); |
673 in |
687 in |
674 ((discs, selss, exhaust_thm, inject_thms, distinct_thms, case_thms, disc_thmss, discI_thms, |
688 ({discs = discs, selss = selss, exhaust = exhaust_thm, injects = inject_thms, |
675 sel_thmss), |
689 distincts = distinct_thms, case_thms = case_thms, disc_thmss = disc_thmss, |
676 lthy |
690 discIs = discI_thms, sel_thmss = sel_thmss}, |
677 |> not rep_compat ? |
691 lthy |
678 (Local_Theory.declaration {syntax = false, pervasive = true} |
692 |> not rep_compat ? |
|
693 (Local_Theory.declaration {syntax = false, pervasive = true} |
679 (fn phi => Case_Translation.register |
694 (fn phi => Case_Translation.register |
680 (Morphism.term phi casex) (map (Morphism.term phi) ctrs))) |
695 (Morphism.term phi casex) (map (Morphism.term phi) ctrs))) |
681 |> Local_Theory.notes (notes' @ notes) |> snd) |
696 |> Local_Theory.notes (notes' @ notes) |> snd) |
682 end; |
697 end; |
683 in |
698 in |
684 (goalss, after_qed, lthy') |
699 (goalss, after_qed, lthy') |
685 end; |
700 end; |
686 |
701 |