src/HOL/Tools/BNF/bnf_util.ML
changeset 62324 ae44f16dcea5
parent 62124 d0dff7a80c26
child 62343 24106dc44def
equal deleted inserted replaced
62323:8c3eec5812d8 62324:ae44f16dcea5
    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};