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; |