src/HOL/Tools/BNF/bnf_util.ML
changeset 55573 6a1cbddebf86
parent 55571 a6153343c44f
child 55575 a5e33e18fb5c
equal deleted inserted replaced
55572:fb3bb943a606 55573:6a1cbddebf86
   324 
   324 
   325 
   325 
   326 (** Types **)
   326 (** Types **)
   327 
   327 
   328 (*stolen from ~~/src/HOL/Tools/Nitpick/nitpick_hol.ML*)
   328 (*stolen from ~~/src/HOL/Tools/Nitpick/nitpick_hol.ML*)
   329 fun num_binder_types (Type (@{type_name fun}, [_, T2])) =
   329 fun num_binder_types (Type (@{type_name fun}, [_, T])) = 1 + num_binder_types T
   330     1 + num_binder_types T2
   330   | num_binder_types _ = 0;
   331   | num_binder_types _ = 0
       
   332 
   331 
   333 (*maps [T1,...,Tn]--->T to ([T1,T2,...,Tn], T)*)
   332 (*maps [T1,...,Tn]--->T to ([T1,T2,...,Tn], T)*)
   334 fun strip_typeN 0 T = ([], T)
   333 fun strip_typeN 0 T = ([], T)
   335   | strip_typeN n (Type (@{type_name fun}, [T, T'])) = strip_typeN (n - 1) T' |>> cons T
   334   | strip_typeN n (Type (@{type_name fun}, [T, T'])) = strip_typeN (n - 1) T' |>> cons T
   336   | strip_typeN _ T = raise TYPE ("strip_typeN", [T], []);
   335   | strip_typeN _ T = raise TYPE ("strip_typeN", [T], []);
   391   let val ((AT, BT), FT) = `dest_funT (fastype_of f);
   390   let val ((AT, BT), FT) = `dest_funT (fastype_of f);
   392   in Const (@{const_name Grp}, HOLogic.mk_setT AT --> FT --> mk_pred2T AT BT) $ A $ f end;
   391   in Const (@{const_name Grp}, HOLogic.mk_setT AT --> FT --> mk_pred2T AT BT) $ A $ f end;
   393 
   392 
   394 fun mk_image f =
   393 fun mk_image f =
   395   let val (T, U) = dest_funT (fastype_of f);
   394   let val (T, U) = dest_funT (fastype_of f);
   396   in Const (@{const_name image},
   395   in Const (@{const_name image}, (T --> U) --> HOLogic.mk_setT T --> HOLogic.mk_setT U) $ f end;
   397     (T --> U) --> (HOLogic.mk_setT T) --> (HOLogic.mk_setT U)) $ f end;
       
   398 
   396 
   399 fun mk_Ball X f =
   397 fun mk_Ball X f =
   400   Const (@{const_name Ball}, fastype_of X --> fastype_of f --> HOLogic.boolT) $ X $ f;
   398   Const (@{const_name Ball}, fastype_of X --> fastype_of f --> HOLogic.boolT) $ X $ f;
   401 
   399 
   402 fun mk_Bex X f =
   400 fun mk_Bex X f =
   429   in
   427   in
   430     Const (@{const_name card_order_on}, HOLogic.mk_setT AT --> T --> HOLogic.boolT) $
   428     Const (@{const_name card_order_on}, HOLogic.mk_setT AT --> T --> HOLogic.boolT) $
   431       mk_Field bd $ bd
   429       mk_Field bd $ bd
   432   end;
   430   end;
   433 
   431 
   434 fun mk_cinfinite bd =
   432 fun mk_cinfinite bd = Const (@{const_name cinfinite}, fastype_of bd --> HOLogic.boolT) $ bd;
   435   Const (@{const_name cinfinite}, fastype_of bd --> HOLogic.boolT) $ bd;
       
   436 
   433 
   437 fun mk_ordLeq t1 t2 =
   434 fun mk_ordLeq t1 t2 =
   438   HOLogic.mk_mem (HOLogic.mk_prod (t1, t2),
   435   HOLogic.mk_mem (HOLogic.mk_prod (t1, t2),
   439     Const (@{const_name ordLeq}, mk_relT (fastype_of t1, fastype_of t2)));
   436     Const (@{const_name ordLeq}, mk_relT (fastype_of t1, fastype_of t2)));
   440 
   437 
   475 
   472 
   476 fun mk_card_binop binop typop t1 t2 =
   473 fun mk_card_binop binop typop t1 t2 =
   477   let
   474   let
   478     val (T1, relT1) = `(fst o dest_relT) (fastype_of t1);
   475     val (T1, relT1) = `(fst o dest_relT) (fastype_of t1);
   479     val (T2, relT2) = `(fst o dest_relT) (fastype_of t2);
   476     val (T2, relT2) = `(fst o dest_relT) (fastype_of t2);
   480   in
   477   in Const (binop, relT1 --> relT2 --> mk_relT (typop (T1, T2), typop (T1, T2))) $ t1 $ t2 end;
   481     Const (binop, relT1 --> relT2 --> mk_relT (typop (T1, T2), typop (T1, T2))) $ t1 $ t2
       
   482   end;
       
   483 
   478 
   484 val mk_csum = mk_card_binop @{const_name csum} mk_sumT;
   479 val mk_csum = mk_card_binop @{const_name csum} mk_sumT;
   485 val mk_cprod = mk_card_binop @{const_name cprod} HOLogic.mk_prodT;
   480 val mk_cprod = mk_card_binop @{const_name cprod} HOLogic.mk_prodT;
   486 val mk_cexp = mk_card_binop @{const_name cexp} (op --> o swap);
   481 val mk_cexp = mk_card_binop @{const_name cexp} (op --> o swap);
   487 val ctwo = @{term ctwo};
   482 val ctwo = @{term ctwo};