-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstandard_ctx.ml
128 lines (110 loc) · 4.91 KB
/
standard_ctx.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
open Ast
open Typecheck_ctx
let ctx = empty
|> add_alias "unit" ([], tunit)
|> add_sum "zero" [] []
|> add_sum "bool" [] ["False", tunit; "True", tunit]
|> add_prim "nat" []
|> add_prim "int" []
|> add_prim "time" []
|> add_prim "key" []
|> add_prim "string" []
|> add_prim "tez" []
|> add_prim "sig" []
|> add_sum "or" ["a"; "b"] ["Left", tid "a"; "Right", tid "b"]
|> add_sum "option" ["a"] ["None", tunit; "Some", tid "a"]
|> add_sum "list" ["a"] ["Nil", tunit; "Cons", ttuple[tid "a"; tapp "list" [tid "a"]]]
|> add_prim "set" ["a"]
|> add_prim "map" ["k"; "v"]
|> add_prim "contract" ["param"; "result"]
|> add_alias "account" ([], tapp "contract" [tunit; tunit])
|> add_prim "closure" ["env"; "param"; "result"]
(* misc. *)
|> add_evar "fail" ([], TFail)
(* contract manipulation *)
|> add_evar "contract-call" (* contract p r -> p -> tez -> r *)
(["param"; "result"],
tlambda [tapp "contract" [tid "param"; tid "result"];
tid "param"; tprim "tez"; tid "result"])
|> add_evar "contract-create"
(* key -> key? -> bool -> bool -> tez -> (p*g -> r*g) -> g -> g -> contract p r *)
(["param"; "storage"; "result"],
tlambda [tprim "key"; toption (tprim "key");
tprim "bool"; tprim "bool";
tprim "tez";
tlambda [(ttuple [tid "param"; tid "storage"]);
(ttuple ([tid "result"; tid "storage"]))];
tid "storage";
tapp "contract" [tid "param"; tid "result"]])
|> add_evar "contract-create-account"
(* key -> key? -> bool -> tez -> contract unit unit *)
([], tlambda [tprim "key"; toption (tprim "key");
tprim "bool"; tprim "tez";
tapp "contract" [tunit; tunit]])
|> add_evar "contract-get"
([], tlambda [tprim "key"; tapp "contract" [tunit; tunit]])
|> add_evar "contract-manager"
(["param"; "storage"],
tlambda [tapp "contract" [tid "param"; tid "storage"]; tprim "key"])
(* This contract's self-awareness *)
|> add_evar "self-now" ([], tprim "time")
|> add_evar "self-amount" ([], tprim "tez")
|> add_evar "self-contract"
(["param"; "result"], tapp "contract" [tid "param"; tid "result"])
|> add_evar "self-balance" ([], tprim "tez")
|> add_evar "self-steps-to-quota" ([], tprim "nat")
|> add_evar "self-source"
(["param"; "result"], tapp "contract" [tid "param"; tid "result"])
(* crypto *)
|> add_evar "crypto-hash" (["a"], tlambda [tid "a"; tprim "string"])
|> add_evar "crypto-check" (* key -> signature -> string -> bool *)
([], tlambda [tprim "key"; tprim "sig"; tprim "string"; tprim "bool"])
(* sets *)
|> add_evar "set-mem" (["elt"], tlambda [tapp "set" [tid "elt"]; tid "elt"; tprim "bool"])
|> add_evar "set-update"
(["elt"], tlambda [tid "elt"; tprim "bool"; tapp "set" [tid "elt"]])
|> add_evar "set-map"
(["a"; "b"], tlambda [tapp "set" [tid "a"];
tlambda [tid "a"; tid "b"];
tapp "set" [tid "b"]])
|> add_evar "set-reduce"
(["elt"; "acc"], tlambda [tapp "set" [tid "elt"];
tid "acc";
tlambda [tid "elt"; tid "acc"; tid "acc"];
tid "acc"])
(* maps *)
|> add_evar "map-mem"
(["k"; "v"], tlambda [tid "k";
tapp "map" [tid "k"; tid "v"];
tprim "bool"])
|> add_evar "map-get"
(["k"; "v"], tlambda [tid "k";
tapp "map" [tid "k"; tid "v"];
toption(tid "v")])
|> add_evar "map-update"
(["k"; "v"], tlambda [tid "k";
toption (tid "v");
tapp "map" [tid "k"; tid "v"];
tapp "map" [tid "k"; tid "v"]])
|> add_evar "map-map"
(["k"; "v0"; "v1"], tlambda [tapp "map" [tid "k"; tid "v0"];
tlambda [tid "k"; tid "v0"; tid "v1"];
tapp "map" [tid "k"; tid "v1"]])
|> add_evar "map-reduce"
(["k"; "v"; "acc"], tlambda [tapp "map" [tid "k"; tid "v"];
tid "acc";
tlambda [tid "k"; tid "v"; tid "acc"; tid "acc"];
tid "acc"])
(* lists *)
|> add_evar "list-map"
(["a"; "b"], tlambda [tapp "list" [tid "a"];
tlambda [tid "a"; tid "b"];
tapp "list" [tid "b"]])
|> add_evar "list-reduce"
(["a"; "acc"], tlambda [tapp "list" [tid "a"];
tid "acc";
tlambda [tid "a"; tid "acc"; tid "acc"];
tid "acc"])
let operators = ["EQ"; "NEQ"; "LE"; "LT"; "GE"; "GT"; "CONCAT"; "OR"; "AND";
"XOR"; "ADD"; "SUB"; "MUL"; "EDIV"; "LSR"; "LSL"; "NOT"; "NEG"; "ABS"]
let globals = get_evars ctx @ operators