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