src/HOL/Tools/hologic.ML
changeset 31463 c5681ed50eab
parent 31456 55edadbd43d5
child 31736 926ebca5a145
equal deleted inserted replaced
31462:4fcbf17b5a98 31463:c5681ed50eab
   120   val mk_literal: string -> term
   120   val mk_literal: string -> term
   121   val dest_literal: term -> string
   121   val dest_literal: term -> string
   122   val mk_typerep: typ -> term
   122   val mk_typerep: typ -> term
   123   val mk_term_of: typ -> term -> term
   123   val mk_term_of: typ -> term -> term
   124   val reflect_term: term -> term
   124   val reflect_term: term -> term
       
   125   val mk_valtermify_app: string -> (string * typ) list -> typ -> term
   125   val mk_return: typ -> typ -> term -> term
   126   val mk_return: typ -> typ -> term -> term
   126   val mk_ST: ((term * typ) * (string * typ) option)  list -> term -> typ -> typ option * typ -> term
   127   val mk_ST: ((term * typ) * (string * typ) option)  list -> term -> typ -> typ option * typ -> term
       
   128   val mk_random: typ -> term -> term
   127 end;
   129 end;
   128 
   130 
   129 structure HOLogic: HOLOGIC =
   131 structure HOLogic: HOLOGIC =
   130 struct
   132 struct
   131 
   133 
   615       Const ("Code_Eval.App", termT --> termT --> termT)
   617       Const ("Code_Eval.App", termT --> termT --> termT)
   616         $ reflect_term t1 $ reflect_term t2
   618         $ reflect_term t1 $ reflect_term t2
   617   | reflect_term (Abs (v, _, t)) = Abs (v, termT, reflect_term t)
   619   | reflect_term (Abs (v, _, t)) = Abs (v, termT, reflect_term t)
   618   | reflect_term t = t;
   620   | reflect_term t = t;
   619 
   621 
       
   622 fun mk_valtermify_app c vs T =
       
   623   let
       
   624     fun termifyT T = mk_prodT (T, unitT --> termT);
       
   625     fun valapp T T' = Const ("Code_Eval.valapp",
       
   626       termifyT (T --> T') --> termifyT T --> termifyT T');
       
   627     fun mk_fTs [] _ = []
       
   628       | mk_fTs (_ :: Ts) T = (Ts ---> T) :: mk_fTs Ts T;
       
   629     val Ts = map snd vs;
       
   630     val t = Const (c, Ts ---> T);
       
   631     val tt = mk_prod (t, Abs ("u", unitT, reflect_term t));
       
   632     fun app (t, (fT, (v, T))) = valapp T fT $ t $ Free (v, termifyT T);
       
   633   in Library.foldl app (tt, mk_fTs Ts T ~~ vs) end;
       
   634 
   620 
   635 
   621 (* open state monads *)
   636 (* open state monads *)
   622 
   637 
   623 fun mk_return T U x = pair_const T U $ x;
   638 fun mk_return T U x = pair_const T U $ x;
   624 
   639 
   631       | mk_clause ((t, U), NONE) (t', U') =
   646       | mk_clause ((t, U), NONE) (t', U') =
   632           (Const ("Product_Type.fcomp", (U --> U') --> (U' --> R) --> U --> R)
   647           (Const ("Product_Type.fcomp", (U --> U') --> (U' --> R) --> U --> R)
   633             $ t $ t', U)
   648             $ t $ t', U)
   634   in fold_rev mk_clause clauses (t, U) |> fst end;
   649   in fold_rev mk_clause clauses (t, U) |> fst end;
   635 
   650 
       
   651 val code_numeralT = Type ("Code_Numeral.code_numeral", []);
       
   652 val random_seedT = mk_prodT (code_numeralT, code_numeralT);
       
   653 
       
   654 fun mk_random T t = Const ("Quickcheck.random_class.random", code_numeralT
       
   655   --> random_seedT --> mk_prodT (mk_prodT (T, unitT --> termT), random_seedT)) $ t;
       
   656 
   636 end;
   657 end;