50 val mk_converse: term -> term |
50 val mk_converse: term -> term |
51 val mk_conversep: term -> term |
51 val mk_conversep: term -> term |
52 val mk_cprod: term -> term -> term |
52 val mk_cprod: term -> term -> term |
53 val mk_csum: term -> term -> term |
53 val mk_csum: term -> term -> term |
54 val mk_dir_image: term -> term -> term |
54 val mk_dir_image: term -> term -> term |
|
55 val mk_eq_onp: term -> term |
55 val mk_rel_fun: term -> term -> term |
56 val mk_rel_fun: term -> term -> term |
56 val mk_image: term -> term |
57 val mk_image: term -> term |
57 val mk_in: term list -> term list -> typ -> term |
58 val mk_in: term list -> term list -> typ -> term |
58 val mk_inj: term -> term |
59 val mk_inj: term -> term |
59 val mk_leq: term -> term -> term |
60 val mk_leq: term -> term -> term |
101 val no_reflexive: thm list -> thm list |
102 val no_reflexive: thm list -> thm list |
102 |
103 |
103 val fold_thms: Proof.context -> thm list -> thm -> thm |
104 val fold_thms: Proof.context -> thm list -> thm -> thm |
104 |
105 |
105 val parse_type_args_named_constrained: (binding option * (string * string option)) list parser |
106 val parse_type_args_named_constrained: (binding option * (string * string option)) list parser |
106 val parse_map_rel_bindings: (binding * binding) parser |
107 val parse_map_rel_pred_bindings: (binding * binding * binding) parser |
107 |
108 |
108 val typedef: binding * (string * sort) list * mixfix -> term -> |
109 val typedef: binding * (string * sort) list * mixfix -> term -> |
109 (binding * binding) option -> (Proof.context -> tactic) -> |
110 (binding * binding) option -> (Proof.context -> tactic) -> |
110 local_theory -> (string * Typedef.info) * local_theory |
111 local_theory -> (string * Typedef.info) * local_theory |
111 end; |
112 end; |
128 val parse_type_args_named_constrained = |
129 val parse_type_args_named_constrained = |
129 parse_type_arg_constrained >> (single o pair (SOME Binding.empty)) || |
130 parse_type_arg_constrained >> (single o pair (SOME Binding.empty)) || |
130 @{keyword "("} |-- Parse.!!! (Parse.list1 parse_type_arg_named_constrained --| @{keyword ")"}) || |
131 @{keyword "("} |-- Parse.!!! (Parse.list1 parse_type_arg_named_constrained --| @{keyword ")"}) || |
131 Scan.succeed []; |
132 Scan.succeed []; |
132 |
133 |
133 val parse_map_rel_binding = Parse.name --| @{keyword ":"} -- Parse.binding; |
134 val parse_map_rel_pred_binding = Parse.name --| @{keyword ":"} -- Parse.binding; |
134 |
135 |
135 val no_map_rel = (Binding.empty, Binding.empty); |
136 val no_map_rel = (Binding.empty, Binding.empty, Binding.empty); |
136 |
137 |
137 fun extract_map_rel ("map", b) = apfst (K b) |
138 fun extract_map_rel_pred ("map", m) = (fn (_, r, p) => (m, r, p)) |
138 | extract_map_rel ("rel", b) = apsnd (K b) |
139 | extract_map_rel_pred ("rel", r) = (fn (m, _, p) => (m, r, p)) |
139 | extract_map_rel (s, _) = error ("Unknown label " ^ quote s ^ " (expected \"map\" or \"rel\")"); |
140 | extract_map_rel_pred ("pred", p) = (fn (m, r, _) => (m, r, p)) |
140 |
141 | extract_map_rel_pred (s, _) = error ("Unknown label " ^ quote s ^ " (expected \"map\" or \"rel\")"); |
141 val parse_map_rel_bindings = |
142 |
142 @{keyword "for"} |-- Scan.repeat parse_map_rel_binding |
143 val parse_map_rel_pred_bindings = |
143 >> (fn ps => fold extract_map_rel ps no_map_rel) |
144 @{keyword "for"} |-- Scan.repeat parse_map_rel_pred_binding |
|
145 >> (fn ps => fold extract_map_rel_pred ps no_map_rel) |
144 || Scan.succeed no_map_rel; |
146 || Scan.succeed no_map_rel; |
145 |
147 |
146 fun typedef (b, Ts, mx) set opt_morphs tac lthy = |
148 fun typedef (b, Ts, mx) set opt_morphs tac lthy = |
147 let |
149 let |
148 (*Work around loss of qualification in "typedef" axioms by replicating it in the name*) |
150 (*Work around loss of qualification in "typedef" axioms by replicating it in the name*) |
348 val (T1, T2) = dest_funT (fastype_of f); |
350 val (T1, T2) = dest_funT (fastype_of f); |
349 val (U1, U2) = dest_funT (fastype_of g); |
351 val (U1, U2) = dest_funT (fastype_of g); |
350 in |
352 in |
351 Const (@{const_name vimage2p}, |
353 Const (@{const_name vimage2p}, |
352 (T1 --> T2) --> (U1 --> U2) --> mk_pred2T T2 U2 --> mk_pred2T T1 U1) $ f $ g |
354 (T1 --> T2) --> (U1 --> U2) --> mk_pred2T T2 U2 --> mk_pred2T T1 U1) $ f $ g |
|
355 end; |
|
356 |
|
357 fun mk_eq_onp P = |
|
358 let |
|
359 val T = domain_type (fastype_of P); |
|
360 in |
|
361 Const (@{const_name eq_onp}, (T --> HOLogic.boolT) --> T --> T --> HOLogic.boolT) $ P |
353 end; |
362 end; |
354 |
363 |
355 fun mk_pred name R = |
364 fun mk_pred name R = |
356 Const (name, uncurry mk_pred2T (fastype_of R |> dest_pred2T) --> HOLogic.boolT) $ R; |
365 Const (name, uncurry mk_pred2T (fastype_of R |> dest_pred2T) --> HOLogic.boolT) $ R; |
357 val mk_reflp = mk_pred @{const_name reflp}; |
366 val mk_reflp = mk_pred @{const_name reflp}; |