src/HOL/Tools/hologic.ML
changeset 31183 13effe47174c
parent 31135 e2d777dcf161
child 31205 98370b26c2ce
equal deleted inserted replaced
31182:7ac0a57a57ed 31183:13effe47174c
   120   val mk_message_string: string -> term
   120   val mk_message_string: string -> term
   121   val dest_message_string: term -> string
   121   val dest_message_string: 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_return: typ -> typ -> term -> term
       
   126   val mk_ST: ((term * typ) * (string * typ) option)  list -> term -> typ -> typ option * typ -> term
   125 end;
   127 end;
   126 
   128 
   127 structure HOLogic: HOLOGIC =
   129 structure HOLogic: HOLOGIC =
   128 struct
   130 struct
   129 
   131 
   610       Const ("Code_Eval.Const", message_stringT --> typerepT --> termT)
   612       Const ("Code_Eval.Const", message_stringT --> typerepT --> termT)
   611         $ mk_message_string c $ mk_typerep T
   613         $ mk_message_string c $ mk_typerep T
   612   | reflect_term (t1 $ t2) =
   614   | reflect_term (t1 $ t2) =
   613       Const ("Code_Eval.App", termT --> termT --> termT)
   615       Const ("Code_Eval.App", termT --> termT --> termT)
   614         $ reflect_term t1 $ reflect_term t2
   616         $ reflect_term t1 $ reflect_term t2
   615   | reflect_term (t as Free _) = t
   617   | reflect_term (Abs (v, _, t)) = Abs (v, termT, reflect_term t)
   616   | reflect_term (t as Bound _) = t
   618   | reflect_term t = t;
   617   | reflect_term (Abs (v, _, t)) = Abs (v, termT, reflect_term t);
   619 
       
   620 
       
   621 (* open state monads *)
       
   622 
       
   623 fun mk_return T U x = pair_const T U $ x;
       
   624 
       
   625 fun mk_ST clauses t U (someT, V) =
       
   626   let
       
   627     val R = case someT of SOME T => mk_prodT (T, V) | NONE => V
       
   628     fun mk_clause ((t, U), SOME (v, T)) (t', U') =
       
   629           (Const ("Product_Type.scomp", (U --> mk_prodT (T, U')) --> (T --> U' --> R) --> U --> R)
       
   630             $ t $ lambda (Free (v, T)) t', U)
       
   631       | mk_clause ((t, U), NONE) (t', U') =
       
   632           (Const ("Product_Type.fcomp", (U --> U') --> (U' --> R) --> U --> R)
       
   633             $ t $ t', U)
       
   634   in fold_rev mk_clause clauses (t, U) |> fst end;
   618 
   635 
   619 end;
   636 end;