src/HOL/Tools/hologic.ML
changeset 31135 e2d777dcf161
parent 31048 ac146fc38b51
child 31183 13effe47174c
equal deleted inserted replaced
31134:1a5591ecb764 31135:e2d777dcf161
   117   val mk_string: string -> term
   117   val mk_string: string -> term
   118   val dest_string: term -> string
   118   val dest_string: term -> string
   119   val message_stringT: typ
   119   val message_stringT: typ
   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
       
   123   val mk_term_of: typ -> term -> term
       
   124   val reflect_term: term -> term
   122 end;
   125 end;
   123 
   126 
   124 structure HOLogic: HOLOGIC =
   127 structure HOLogic: HOLOGIC =
   125 struct
   128 struct
   126 
   129 
   589       $ mk_string s;
   592       $ mk_string s;
   590 fun dest_message_string (Const ("String.message_string.STR", _) $ t) =
   593 fun dest_message_string (Const ("String.message_string.STR", _) $ t) =
   591       dest_string t
   594       dest_string t
   592   | dest_message_string t = raise TERM ("dest_message_string", [t]);
   595   | dest_message_string t = raise TERM ("dest_message_string", [t]);
   593 
   596 
       
   597 
       
   598 (* typerep and term *)
       
   599 
       
   600 val typerepT = Type ("Typerep.typerep", []);
       
   601 
       
   602 fun mk_typerep T = Const ("Typerep.typerep_class.typerep",
       
   603   Term.itselfT T --> typerepT) $ Logic.mk_type T;
       
   604 
       
   605 val termT = Type ("Code_Eval.term", []);
       
   606 
       
   607 fun mk_term_of T t = Const ("Code_Eval.term_of_class.term_of", T --> termT) $ t;
       
   608 
       
   609 fun reflect_term (Const (c, T)) =
       
   610       Const ("Code_Eval.Const", message_stringT --> typerepT --> termT)
       
   611         $ mk_message_string c $ mk_typerep T
       
   612   | reflect_term (t1 $ t2) =
       
   613       Const ("Code_Eval.App", termT --> termT --> termT)
       
   614         $ reflect_term t1 $ reflect_term t2
       
   615   | reflect_term (t as Free _) = t
       
   616   | reflect_term (t as Bound _) = t
       
   617   | reflect_term (Abs (v, _, t)) = Abs (v, termT, reflect_term t);
       
   618 
   594 end;
   619 end;