| author | paulson <lp15@cam.ac.uk> | 
| Fri, 30 Sep 2016 17:12:50 +0100 | |
| changeset 63975 | 6728b5007ad0 | 
| parent 63851 | 1a1fd3f3a24c | 
| child 64413 | c0d5e78eb647 | 
| permissions | -rw-r--r-- | 
| 55061 | 1 | (* Title: HOL/Tools/BNF/bnf_util.ML | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 2 | Author: Dmitriy Traytel, TU Muenchen | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 3 | Copyright 2012 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 4 | |
| 49282 | 5 | Library for bounded natural functors. | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 6 | *) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 7 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 8 | signature BNF_UTIL = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 9 | sig | 
| 54008 
b15cfc2864de
refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
 blanchet parents: 
53888diff
changeset | 10 | include CTR_SUGAR_UTIL | 
| 55575 
a5e33e18fb5c
moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
 blanchet parents: 
55573diff
changeset | 11 | include BNF_FP_REC_SUGAR_UTIL | 
| 54008 
b15cfc2864de
refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
 blanchet parents: 
53888diff
changeset | 12 | |
| 63797 | 13 | val unflatt: 'a list list list -> 'b list -> 'b list list list | 
| 14 | val unflattt: 'a list list list list -> 'b list -> 'b list list list list | |
| 15 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 16 | val mk_TFreess: int list -> Proof.context -> typ list list * Proof.context | 
| 49177 
db8ce685073f
introduced and used "mk_Freesss", and simplified "mk_Freess(')"
 blanchet parents: 
49176diff
changeset | 17 | val mk_Freesss: string -> typ list list list -> Proof.context -> | 
| 
db8ce685073f
introduced and used "mk_Freesss", and simplified "mk_Freess(')"
 blanchet parents: 
49176diff
changeset | 18 | term list list list * Proof.context | 
| 49200 | 19 | val mk_Freessss: string -> typ list list list list -> Proof.context -> | 
| 20 | term list list list list * Proof.context | |
| 53034 
6067703399ad
moved library function where it belongs, and used Dmitriy's inside-out implementation
 blanchet parents: 
52985diff
changeset | 21 | val nonzero_string_of_int: int -> string | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 22 | |
| 53036 | 23 | val binder_fun_types: typ -> typ list | 
| 24 | val body_fun_type: typ -> typ | |
| 53037 | 25 | val strip_fun_type: typ -> typ list * typ | 
| 49395 
323414474c1f
use strip_typeN in bnf_def (instead of repairing strip_type)
 traytel parents: 
49366diff
changeset | 26 | val strip_typeN: int -> typ -> typ list * typ | 
| 
323414474c1f
use strip_typeN in bnf_def (instead of repairing strip_type)
 traytel parents: 
49366diff
changeset | 27 | |
| 49463 | 28 | val mk_pred2T: typ -> typ -> typ | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 29 | val mk_relT: typ * typ -> typ | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 30 | val dest_relT: typ -> typ * typ | 
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 31 | val dest_pred2T: typ -> typ * typ | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 32 | val mk_sumT: typ * typ -> typ | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 33 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 34 | val ctwo: term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 35 | val fst_const: typ -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 36 | val snd_const: typ -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 37 | val Id_const: typ -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 38 | |
| 63824 | 39 | val enforce_type: Proof.context -> (typ -> typ) -> typ -> term -> term | 
| 40 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 41 | val mk_Ball: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 42 | val mk_Bex: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 43 | val mk_Card_order: term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 44 | val mk_Field: term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 45 | val mk_Gr: term -> term -> term | 
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 46 | val mk_Grp: term -> term -> term | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 47 | val mk_UNION: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 48 | val mk_Union: typ -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 49 | val mk_card_binop: string -> (typ * typ -> typ) -> term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 50 | val mk_card_of: term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 51 | val mk_card_order: term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 52 | val mk_cexp: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 53 | val mk_cinfinite: term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 54 | val mk_collect: term list -> typ -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 55 | val mk_converse: term -> term | 
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 56 | val mk_conversep: term -> term | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 57 | val mk_cprod: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 58 | val mk_csum: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 59 | val mk_dir_image: term -> term -> term | 
| 62324 | 60 | val mk_eq_onp: term -> term | 
| 55945 | 61 | val mk_rel_fun: term -> term -> term | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 62 | val mk_image: term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 63 | val mk_in: term list -> term list -> typ -> term | 
| 56635 | 64 | val mk_inj: term -> term | 
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 65 | val mk_leq: term -> term -> term | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 66 | val mk_ordLeq: term -> term -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 67 | val mk_rel_comp: term * term -> term | 
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 68 | val mk_rel_compp: term * term -> term | 
| 55803 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 69 | val mk_vimage2p: term -> term -> term | 
| 61240 | 70 | val mk_reflp: term -> term | 
| 71 | val mk_symp: term -> term | |
| 72 | val mk_transp: term -> term | |
| 63851 | 73 | val mk_union: term * term -> term | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 74 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 75 | (*parameterized terms*) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 76 | val mk_nthN: int -> term -> int -> term | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 77 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 78 | (*parameterized thms*) | 
| 56765 | 79 | val prod_injectD: thm | 
| 80 | val prod_injectI: thm | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 81 | val ctrans: thm | 
| 49585 
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
 blanchet parents: 
49536diff
changeset | 82 | val id_apply: thm | 
| 
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
 blanchet parents: 
49536diff
changeset | 83 | val meta_mp: thm | 
| 
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
 blanchet parents: 
49536diff
changeset | 84 | val meta_spec: thm | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 85 | val o_apply: thm | 
| 58446 | 86 | val rel_funD: thm | 
| 87 | val rel_funI: thm | |
| 49488 
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
 traytel parents: 
49484diff
changeset | 88 | val set_mp: thm | 
| 
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
 traytel parents: 
49484diff
changeset | 89 | val set_rev_mp: thm | 
| 49490 | 90 | val subset_UNIV: thm | 
| 58446 | 91 | |
| 92 | val mk_conjIN: int -> thm | |
| 93 | val mk_nthI: int -> int -> thm | |
| 94 | val mk_nth_conv: int -> int -> thm | |
| 95 | val mk_ordLeq_csum: int -> int -> thm -> thm | |
| 62124 | 96 | val mk_pointful: Proof.context -> thm -> thm | 
| 58446 | 97 | val mk_rel_funDN: int -> thm -> thm | 
| 98 | val mk_rel_funDN_rotated: int -> thm -> thm | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 99 | val mk_sym: thm -> thm | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 100 | val mk_trans: thm -> thm -> thm | 
| 58446 | 101 | val mk_UnIN: int -> int -> thm | 
| 102 | val mk_Un_upper: int -> int -> thm | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 103 | |
| 57205 | 104 | val is_refl_bool: term -> bool | 
| 49484 | 105 | val is_refl: thm -> bool | 
| 49605 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 106 | val is_concl_refl: thm -> bool | 
| 49484 | 107 | val no_refl: thm list -> thm list | 
| 108 | val no_reflexive: thm list -> thm list | |
| 109 | ||
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 110 | val parse_type_args_named_constrained: (binding option * (string * string option)) list parser | 
| 62324 | 111 | val parse_map_rel_pred_bindings: (binding * binding * binding) parser | 
| 49434 
433dc7e028c8
separated registration of BNFs from bnf_def (BNFs are now stored only for bnf_def and (co)data commands)
 traytel parents: 
49425diff
changeset | 112 | |
| 49835 | 113 | val typedef: binding * (string * sort) list * mixfix -> term -> | 
| 58959 | 114 | (binding * binding) option -> (Proof.context -> tactic) -> | 
| 115 | local_theory -> (string * Typedef.info) * local_theory | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 116 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 117 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 118 | structure BNF_Util : BNF_UTIL = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 119 | struct | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 120 | |
| 54008 
b15cfc2864de
refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
 blanchet parents: 
53888diff
changeset | 121 | open Ctr_Sugar_Util | 
| 55575 
a5e33e18fb5c
moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
 blanchet parents: 
55573diff
changeset | 122 | open BNF_FP_Rec_Sugar_Util | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 123 | |
| 54008 
b15cfc2864de
refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
 blanchet parents: 
53888diff
changeset | 124 | (* Library proper *) | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 125 | |
| 63797 | 126 | fun unfla0 xs = fold_map (fn _ => fn (c :: cs) => (c, cs)) xs; | 
| 127 | fun unflat0 xss = fold_map unfla0 xss; | |
| 128 | fun unflatt0 xsss = fold_map unflat0 xsss; | |
| 129 | fun unflattt0 xssss = fold_map unflatt0 xssss; | |
| 130 | ||
| 131 | fun unflatt xsss = fst o unflatt0 xsss; | |
| 132 | fun unflattt xssss = fst o unflattt0 xssss; | |
| 133 | ||
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 134 | val parse_type_arg_constrained = | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 135 |   Parse.type_ident -- Scan.option (@{keyword "::"} |-- Parse.!!! Parse.sort);
 | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 136 | |
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 137 | val parse_type_arg_named_constrained = | 
| 57092 | 138 | (Parse.reserved "dead" >> K NONE || parse_opt_binding_colon >> SOME) -- | 
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 139 | parse_type_arg_constrained; | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 140 | |
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 141 | val parse_type_args_named_constrained = | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 142 | parse_type_arg_constrained >> (single o pair (SOME Binding.empty)) || | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 143 |   @{keyword "("} |-- Parse.!!! (Parse.list1 parse_type_arg_named_constrained --| @{keyword ")"}) ||
 | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 144 | Scan.succeed []; | 
| 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 145 | |
| 62324 | 146 | val parse_map_rel_pred_binding = Parse.name --| @{keyword ":"} -- Parse.binding;
 | 
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 147 | |
| 62324 | 148 | val no_map_rel = (Binding.empty, Binding.empty, Binding.empty); | 
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 149 | |
| 62324 | 150 | fun extract_map_rel_pred ("map", m) = (fn (_, r, p) => (m, r, p))
 | 
| 151 |   | extract_map_rel_pred ("rel", r) = (fn (m, _, p) => (m, r, p))
 | |
| 152 |   | extract_map_rel_pred ("pred", p) = (fn (m, r, _) => (m, r, p))
 | |
| 153 |   | extract_map_rel_pred (s, _) = error ("Unknown label " ^ quote s ^ " (expected \"map\" or \"rel\")");
 | |
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 154 | |
| 62324 | 155 | val parse_map_rel_pred_bindings = | 
| 156 |   @{keyword "for"} |-- Scan.repeat parse_map_rel_pred_binding
 | |
| 157 | >> (fn ps => fold extract_map_rel_pred ps no_map_rel) | |
| 57206 
d9be905d6283
changed syntax of map: and rel: arguments to BNF-based datatypes
 blanchet parents: 
57205diff
changeset | 158 | || Scan.succeed no_map_rel; | 
| 54601 
91a1e4aa7c80
command for axiomatic declaration of bnfs---allow theoreticians to fix an arbitrary type with functorial structure and work abstractly on it
 traytel parents: 
54544diff
changeset | 159 | |
| 53263 | 160 | fun typedef (b, Ts, mx) set opt_morphs tac lthy = | 
| 49228 | 161 | let | 
| 53263 | 162 | (*Work around loss of qualification in "typedef" axioms by replicating it in the name*) | 
| 59858 | 163 | val b' = fold_rev Binding.prefix_name (map (suffix "_" o fst) (Binding.path_of b)) b; | 
| 61110 | 164 | |
| 165 | val default_bindings = Typedef.default_bindings (Binding.concealed b'); | |
| 166 | val bindings = | |
| 167 | (case opt_morphs of | |
| 168 | NONE => default_bindings | |
| 169 | | SOME (Rep_name, Abs_name) => | |
| 170 |          {Rep_name = Binding.concealed Rep_name,
 | |
| 171 | Abs_name = Binding.concealed Abs_name, | |
| 172 | type_definition_name = #type_definition_name default_bindings}); | |
| 173 | ||
| 49228 | 174 | val ((name, info), (lthy, lthy_old)) = | 
| 175 | lthy | |
| 61101 
7b915ca69af1
use open/close_target rather than Local_Theory.restore to get polymorphic definitions;
 traytel parents: 
59880diff
changeset | 176 | |> Local_Theory.open_target |> snd | 
| 61260 | 177 |       |> Typedef.add_typedef {overloaded = false} (b', Ts, mx) set (SOME bindings) tac
 | 
| 61101 
7b915ca69af1
use open/close_target rather than Local_Theory.restore to get polymorphic definitions;
 traytel parents: 
59880diff
changeset | 178 | ||> `Local_Theory.close_target; | 
| 49228 | 179 | val phi = Proof_Context.export_morphism lthy_old lthy; | 
| 180 | in | |
| 181 | ((name, Typedef.transform_info phi info), lthy) | |
| 182 | end; | |
| 183 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 184 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 185 | (* Term construction *) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 186 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 187 | (** Fresh variables **) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 188 | |
| 49425 | 189 | fun nonzero_string_of_int 0 = "" | 
| 190 | | nonzero_string_of_int n = string_of_int n; | |
| 191 | ||
| 49298 
36e551d3af3b
support for sort constraints in new (co)data commands
 blanchet parents: 
49282diff
changeset | 192 | val mk_TFreess = fold_map mk_TFrees; | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 193 | |
| 58634 
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
 wenzelm parents: 
58571diff
changeset | 194 | fun mk_Freesss x Tsss = @{fold_map 2} mk_Freess (mk_names (length Tsss) x) Tsss;
 | 
| 
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
 wenzelm parents: 
58571diff
changeset | 195 | fun mk_Freessss x Tssss = @{fold_map 2} mk_Freesss (mk_names (length Tssss) x) Tssss;
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 196 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 197 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 198 | (** Types **) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 199 | |
| 53036 | 200 | (*maps [T1,...,Tn]--->T to ([T1,T2,...,Tn], T)*) | 
| 49395 
323414474c1f
use strip_typeN in bnf_def (instead of repairing strip_type)
 traytel parents: 
49366diff
changeset | 201 | fun strip_typeN 0 T = ([], T) | 
| 
323414474c1f
use strip_typeN in bnf_def (instead of repairing strip_type)
 traytel parents: 
49366diff
changeset | 202 |   | strip_typeN n (Type (@{type_name fun}, [T, T'])) = strip_typeN (n - 1) T' |>> cons T
 | 
| 49463 | 203 |   | strip_typeN _ T = raise TYPE ("strip_typeN", [T], []);
 | 
| 49395 
323414474c1f
use strip_typeN in bnf_def (instead of repairing strip_type)
 traytel parents: 
49366diff
changeset | 204 | |
| 53036 | 205 | (*maps [T1,...,Tn]--->T-->U to ([T1,T2,...,Tn], T-->U), where U is not a function type*) | 
| 206 | fun strip_fun_type T = strip_typeN (num_binder_types T - 1) T; | |
| 207 | ||
| 208 | val binder_fun_types = fst o strip_fun_type; | |
| 209 | val body_fun_type = snd o strip_fun_type; | |
| 210 | ||
| 49463 | 211 | fun mk_pred2T T U = mk_predT [T, U]; | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 212 | val mk_relT = HOLogic.mk_setT o HOLogic.mk_prodT; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 213 | val dest_relT = HOLogic.dest_prodT o HOLogic.dest_setT; | 
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 214 | val dest_pred2T = apsnd Term.domain_type o Term.dest_funT; | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 215 | fun mk_sumT (LT, RT) = Type (@{type_name Sum_Type.sum}, [LT, RT]);
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 216 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 217 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 218 | (** Constants **) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 219 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 220 | fun fst_const T = Const (@{const_name fst}, T --> fst (HOLogic.dest_prodT T));
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 221 | fun snd_const T = Const (@{const_name snd}, T --> snd (HOLogic.dest_prodT T));
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 222 | fun Id_const T = Const (@{const_name Id}, mk_relT (T, T));
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 223 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 224 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 225 | (** Operators **) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 226 | |
| 63824 | 227 | fun enforce_type ctxt get_T T t = | 
| 228 | Term.subst_TVars (tvar_subst (Proof_Context.theory_of ctxt) [get_T (fastype_of t)] [T]) t; | |
| 229 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 230 | fun mk_converse R = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 231 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 232 | val RT = dest_relT (fastype_of R); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 233 | val RST = mk_relT (snd RT, fst RT); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 234 |   in Const (@{const_name converse}, fastype_of R --> RST) $ R end;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 235 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 236 | fun mk_rel_comp (R, S) = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 237 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 238 | val RT = fastype_of R; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 239 | val ST = fastype_of S; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 240 | val RST = mk_relT (fst (dest_relT RT), snd (dest_relT ST)); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 241 |   in Const (@{const_name relcomp}, RT --> ST --> RST) $ R $ S end;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 242 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 243 | fun mk_Gr A f = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 244 | let val ((AT, BT), FT) = `dest_funT (fastype_of f); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 245 |   in Const (@{const_name Gr}, HOLogic.mk_setT AT --> FT --> mk_relT (AT, BT)) $ A $ f end;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 246 | |
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 247 | fun mk_conversep R = | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 248 | let | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 249 | val RT = dest_pred2T (fastype_of R); | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 250 | val RST = mk_pred2T (snd RT) (fst RT); | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 251 |   in Const (@{const_name conversep}, fastype_of R --> RST) $ R end;
 | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 252 | |
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 253 | fun mk_rel_compp (R, S) = | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 254 | let | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 255 | val RT = fastype_of R; | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 256 | val ST = fastype_of S; | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 257 | val RST = mk_pred2T (fst (dest_pred2T RT)) (snd (dest_pred2T ST)); | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 258 |   in Const (@{const_name relcompp}, RT --> ST --> RST) $ R $ S end;
 | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 259 | |
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 260 | fun mk_Grp A f = | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 261 | let val ((AT, BT), FT) = `dest_funT (fastype_of f); | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 262 |   in Const (@{const_name Grp}, HOLogic.mk_setT AT --> FT --> mk_pred2T AT BT) $ A $ f end;
 | 
| 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 263 | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 264 | fun mk_image f = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 265 | let val (T, U) = dest_funT (fastype_of f); | 
| 55573 | 266 |   in Const (@{const_name image}, (T --> U) --> HOLogic.mk_setT T --> HOLogic.mk_setT U) $ f end;
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 267 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 268 | fun mk_Ball X f = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 269 |   Const (@{const_name Ball}, fastype_of X --> fastype_of f --> HOLogic.boolT) $ X $ f;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 270 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 271 | fun mk_Bex X f = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 272 |   Const (@{const_name Bex}, fastype_of X --> fastype_of f --> HOLogic.boolT) $ X $ f;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 273 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 274 | fun mk_UNION X f = | 
| 62343 
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
 haftmann parents: 
62324diff
changeset | 275 | let | 
| 
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
 haftmann parents: 
62324diff
changeset | 276 | val (T, U) = dest_funT (fastype_of f); | 
| 
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
 haftmann parents: 
62324diff
changeset | 277 | in | 
| 
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
 haftmann parents: 
62324diff
changeset | 278 |     Const (@{const_name Sup}, HOLogic.mk_setT U --> U)
 | 
| 
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
 haftmann parents: 
62324diff
changeset | 279 |       $ (Const (@{const_name image}, (T --> U) --> fastype_of X --> HOLogic.mk_setT U) $ f $ X)
 | 
| 
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
 haftmann parents: 
62324diff
changeset | 280 | end; | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 281 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 282 | fun mk_Union T = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 283 |   Const (@{const_name Sup}, HOLogic.mk_setT (HOLogic.mk_setT T) --> HOLogic.mk_setT T);
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 284 | |
| 63851 | 285 | val mk_union = HOLogic.mk_binop @{const_name sup};
 | 
| 286 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 287 | fun mk_Field r = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 288 | let val T = fst (dest_relT (fastype_of r)); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 289 |   in Const (@{const_name Field}, mk_relT (T, T) --> HOLogic.mk_setT T) $ r end;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 290 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 291 | fun mk_card_order bd = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 292 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 293 | val T = fastype_of bd; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 294 | val AT = fst (dest_relT T); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 295 | in | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 296 |     Const (@{const_name card_order_on}, HOLogic.mk_setT AT --> T --> HOLogic.boolT) $
 | 
| 55571 | 297 | HOLogic.mk_UNIV AT $ bd | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 298 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 299 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 300 | fun mk_Card_order bd = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 301 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 302 | val T = fastype_of bd; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 303 | val AT = fst (dest_relT T); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 304 | in | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 305 |     Const (@{const_name card_order_on}, HOLogic.mk_setT AT --> T --> HOLogic.boolT) $
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 306 | mk_Field bd $ bd | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 307 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 308 | |
| 55573 | 309 | fun mk_cinfinite bd = Const (@{const_name cinfinite}, fastype_of bd --> HOLogic.boolT) $ bd;
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 310 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 311 | fun mk_ordLeq t1 t2 = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 312 | HOLogic.mk_mem (HOLogic.mk_prod (t1, t2), | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 313 |     Const (@{const_name ordLeq}, mk_relT (fastype_of t1, fastype_of t2)));
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 314 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 315 | fun mk_card_of A = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 316 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 317 | val AT = fastype_of A; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 318 | val T = HOLogic.dest_setT AT; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 319 | in | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 320 |     Const (@{const_name card_of}, AT --> mk_relT (T, T)) $ A
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 321 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 322 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 323 | fun mk_dir_image r f = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 324 | let val (T, U) = dest_funT (fastype_of f); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 325 |   in Const (@{const_name dir_image}, mk_relT (T, T) --> (T --> U) --> mk_relT (U, U)) $ r $ f end;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 326 | |
| 55945 | 327 | fun mk_rel_fun R S = | 
| 52719 
480a3479fa47
transfer rule for map (not yet registered as a transfer rule)
 traytel parents: 
52545diff
changeset | 328 | let | 
| 
480a3479fa47
transfer rule for map (not yet registered as a transfer rule)
 traytel parents: 
52545diff
changeset | 329 | val ((RA, RB), RT) = `dest_pred2T (fastype_of R); | 
| 
480a3479fa47
transfer rule for map (not yet registered as a transfer rule)
 traytel parents: 
52545diff
changeset | 330 | val ((SA, SB), ST) = `dest_pred2T (fastype_of S); | 
| 55945 | 331 |   in Const (@{const_name rel_fun}, RT --> ST --> mk_pred2T (RA --> SA) (RB --> SB)) $ R $ S end;
 | 
| 52719 
480a3479fa47
transfer rule for map (not yet registered as a transfer rule)
 traytel parents: 
52545diff
changeset | 332 | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 333 | (*FIXME: "x"?*) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 334 | (*(nth sets i) must be of type "T --> 'ai set"*) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 335 | fun mk_in As sets T = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 336 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 337 | fun in_single set A = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 338 | let val AT = fastype_of A; | 
| 58208 | 339 |       in Const (@{const_name less_eq}, AT --> AT --> HOLogic.boolT) $ (set $ Free ("x", T)) $ A end;
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 340 | in | 
| 58208 | 341 | if null sets then HOLogic.mk_UNIV T | 
| 342 |     else HOLogic.mk_Collect ("x", T, foldr1 (HOLogic.mk_conj) (map2 in_single sets As))
 | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 343 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 344 | |
| 56635 | 345 | fun mk_inj t = | 
| 56648 
2ffa440b3074
manual merge + added 'rel_distincts' field to record for symmetry
 blanchet parents: 
56640diff
changeset | 346 |   let val T as Type (@{type_name fun}, [domT, _]) = fastype_of t in
 | 
| 56635 | 347 |     Const (@{const_name inj_on}, T --> HOLogic.mk_setT domT --> HOLogic.boolT) $ t
 | 
| 348 | $ HOLogic.mk_UNIV domT | |
| 349 | end; | |
| 350 | ||
| 51893 
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
 traytel parents: 
51861diff
changeset | 351 | fun mk_leq t1 t2 = | 
| 59856 
ed0ca9029021
export more low-level theorems in data structure (partly for 'corec')
 blanchet parents: 
59271diff
changeset | 352 |   Const (@{const_name less_eq}, fastype_of t1 --> fastype_of t2 --> HOLogic.boolT) $ t1 $ t2;
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 353 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 354 | fun mk_card_binop binop typop t1 t2 = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 355 | let | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 356 | val (T1, relT1) = `(fst o dest_relT) (fastype_of t1); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 357 | val (T2, relT2) = `(fst o dest_relT) (fastype_of t2); | 
| 55573 | 358 | in Const (binop, relT1 --> relT2 --> mk_relT (typop (T1, T2), typop (T1, T2))) $ t1 $ t2 end; | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 359 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 360 | val mk_csum = mk_card_binop @{const_name csum} mk_sumT;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 361 | val mk_cprod = mk_card_binop @{const_name cprod} HOLogic.mk_prodT;
 | 
| 52545 
d2ad6eae514f
Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
 traytel parents: 
52280diff
changeset | 362 | val mk_cexp = mk_card_binop @{const_name cexp} (op --> o swap);
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 363 | val ctwo = @{term ctwo};
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 364 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 365 | fun mk_collect xs defT = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 366 | let val T = (case xs of [] => defT | (x::_) => fastype_of x); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 367 |   in Const (@{const_name collect}, HOLogic.mk_setT T --> T) $ (HOLogic.mk_set T xs) end;
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 368 | |
| 55803 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 369 | fun mk_vimage2p f g = | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 370 | let | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 371 | val (T1, T2) = dest_funT (fastype_of f); | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 372 | val (U1, U2) = dest_funT (fastype_of g); | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 373 | in | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 374 |     Const (@{const_name vimage2p},
 | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 375 | (T1 --> T2) --> (U1 --> U2) --> mk_pred2T T2 U2 --> mk_pred2T T1 U1) $ f $ g | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 376 | end; | 
| 
74d3fe9031d8
joint work with blanchet: intermediate typedef for the input to fp-operations
 traytel parents: 
55772diff
changeset | 377 | |
| 62324 | 378 | fun mk_eq_onp P = | 
| 379 | let | |
| 380 | val T = domain_type (fastype_of P); | |
| 381 | in | |
| 382 |     Const (@{const_name eq_onp}, (T --> HOLogic.boolT) --> T --> T --> HOLogic.boolT) $ P
 | |
| 383 | end; | |
| 384 | ||
| 61240 | 385 | fun mk_pred name R = | 
| 386 | Const (name, uncurry mk_pred2T (fastype_of R |> dest_pred2T) --> HOLogic.boolT) $ R; | |
| 387 | val mk_reflp = mk_pred @{const_name reflp};
 | |
| 388 | val mk_symp = mk_pred @{const_name symp};
 | |
| 389 | val mk_transp =  mk_pred @{const_name transp};
 | |
| 390 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 391 | fun mk_trans thm1 thm2 = trans OF [thm1, thm2]; | 
| 52913 
2d2d9d1de1a9
theorems relating {c,d}tor_(un)fold/(co)rec and {c,d}tor_map
 traytel parents: 
52719diff
changeset | 392 | fun mk_sym thm = thm RS sym; | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 393 | |
| 56765 | 394 | val prod_injectD = @{thm iffD1[OF prod.inject]};
 | 
| 395 | val prod_injectI = @{thm iffD2[OF prod.inject]};
 | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 396 | val ctrans = @{thm ordLeq_transitive};
 | 
| 49585 
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
 blanchet parents: 
49536diff
changeset | 397 | val id_apply = @{thm id_apply};
 | 
| 
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
 blanchet parents: 
49536diff
changeset | 398 | val meta_mp = @{thm meta_mp};
 | 
| 
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
 blanchet parents: 
49536diff
changeset | 399 | val meta_spec = @{thm meta_spec};
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 400 | val o_apply = @{thm o_apply};
 | 
| 58446 | 401 | val rel_funD = @{thm rel_funD};
 | 
| 402 | val rel_funI = @{thm rel_funI};
 | |
| 49488 
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
 traytel parents: 
49484diff
changeset | 403 | val set_mp = @{thm set_mp};
 | 
| 
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
 traytel parents: 
49484diff
changeset | 404 | val set_rev_mp = @{thm set_rev_mp};
 | 
| 49490 | 405 | val subset_UNIV = @{thm subset_UNIV};
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 406 | |
| 62124 | 407 | fun mk_pointful ctxt thm = unfold_thms ctxt [o_apply] (thm RS fun_cong); | 
| 408 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 409 | fun mk_nthN 1 t 1 = t | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 410 | | mk_nthN _ t 1 = HOLogic.mk_fst t | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 411 | | mk_nthN 2 t 2 = HOLogic.mk_snd t | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 412 | | mk_nthN n t m = mk_nthN (n - 1) (HOLogic.mk_snd t) (m - 1); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 413 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 414 | fun mk_nth_conv n m = | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 415 | let | 
| 63798 | 416 |     fun thm b = if b then @{thm fstI} else @{thm sndI};
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 417 | fun mk_nth_conv _ 1 1 = refl | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 418 |       | mk_nth_conv _ _ 1 = @{thm fst_conv}
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 419 |       | mk_nth_conv _ 2 2 = @{thm snd_conv}
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 420 |       | mk_nth_conv b _ 2 = @{thm snd_conv} RS thm b
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 421 | | mk_nth_conv b n m = mk_nth_conv false (n - 1) (m - 1) RS thm b; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 422 | in mk_nth_conv (not (m = n)) n m end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 423 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 424 | fun mk_nthI 1 1 = @{thm TrueE[OF TrueI]}
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 425 |   | mk_nthI n m = fold (curry op RS) (replicate (m - 1) @{thm sndI})
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 426 |     (if m = n then @{thm TrueE[OF TrueI]} else @{thm fstI});
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 427 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 428 | fun mk_conjIN 1 = @{thm TrueE[OF TrueI]}
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 429 | | mk_conjIN n = mk_conjIN (n - 1) RSN (2, conjI); | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 430 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 431 | fun mk_ordLeq_csum 1 1 thm = thm | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 432 |   | mk_ordLeq_csum _ 1 thm = @{thm ordLeq_transitive} OF [thm, @{thm ordLeq_csum1}]
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 433 |   | mk_ordLeq_csum 2 2 thm = @{thm ordLeq_transitive} OF [thm, @{thm ordLeq_csum2}]
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 434 |   | mk_ordLeq_csum n m thm = @{thm ordLeq_transitive} OF
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 435 |     [mk_ordLeq_csum (n - 1) (m - 1) thm, @{thm ordLeq_csum2[OF Card_order_csum]}];
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 436 | |
| 58676 | 437 | fun mk_rel_funDN n = funpow n (fn thm => thm RS rel_funD); | 
| 58446 | 438 | |
| 439 | val mk_rel_funDN_rotated = rotate_prems ~1 oo mk_rel_funDN; | |
| 440 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 441 | local | 
| 63399 | 442 |   fun mk_Un_upper' 0 = @{thm subset_refl}
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 443 |     | mk_Un_upper' 1 = @{thm Un_upper1}
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 444 | | mk_Un_upper' k = Library.foldr (op RS o swap) | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 445 |       (replicate (k - 1) @{thm subset_trans[OF Un_upper1]}, @{thm Un_upper1});
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 446 | in | 
| 63399 | 447 |   fun mk_Un_upper 1 1 = @{thm subset_refl}
 | 
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 448 |     | mk_Un_upper n 1 = mk_Un_upper' (n - 2) RS @{thm subset_trans[OF Un_upper1]}
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 449 |     | mk_Un_upper n m = mk_Un_upper' (n - m) RS @{thm subset_trans[OF Un_upper2]};
 | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 450 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 451 | |
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 452 | local | 
| 49366 | 453 |   fun mk_UnIN' 0 = @{thm UnI2}
 | 
| 454 |     | mk_UnIN' m = mk_UnIN' (m - 1) RS @{thm UnI1};
 | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 455 | in | 
| 49366 | 456 |   fun mk_UnIN 1 1 = @{thm TrueE[OF TrueI]}
 | 
| 457 |     | mk_UnIN n 1 = Library.foldr1 (op RS o swap) (replicate (n - 1) @{thm UnI1})
 | |
| 458 | | mk_UnIN n m = mk_UnIN' (n - m) | |
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 459 | end; | 
| 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 460 | |
| 57205 | 461 | fun is_refl_bool t = | 
| 462 | op aconv (HOLogic.dest_eq t) | |
| 463 | handle TERM _ => false; | |
| 464 | ||
| 49605 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 465 | fun is_refl_prop t = | 
| 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 466 | op aconv (HOLogic.dest_eq (HOLogic.dest_Trueprop t)) | 
| 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 467 | handle TERM _ => false; | 
| 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 468 | |
| 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 469 | val is_refl = is_refl_prop o Thm.prop_of; | 
| 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 470 | val is_concl_refl = is_refl_prop o Logic.strip_imp_concl o Thm.prop_of; | 
| 
ea566f5e1724
avoid another brand of trivial "disc_rel" theorems (which made the simplifier loop for all single-constructor types)
 blanchet parents: 
49585diff
changeset | 471 | |
| 49484 | 472 | val no_refl = filter_out is_refl; | 
| 473 | val no_reflexive = filter_out Thm.is_reflexive; | |
| 474 | ||
| 48975 
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
 blanchet parents: diff
changeset | 475 | end; |