Source file parsed_interface.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
[@@@ocaml.warning "-33"]
open Options
open Parsed
let mk_localized pp_loc pp_desc = { pp_loc ; pp_desc }
let mk_infix e1 op e2 = PPinfix (e1, op, e2)
let mk_prefix op e = PPprefix (op, e)
(** Declaration of types **)
let mk_non_rec_type_decl loc ty_vars ty ty_kind =
TypeDecl [ loc, ty_vars, ty, ty_kind ]
let mk_rec_type_decl l =
TypeDecl l
let mk_abstract_type_decl loc ty_vars ty =
mk_non_rec_type_decl loc ty_vars ty Abstract
let mk_enum_type_decl loc ty_vars ty enums =
mk_non_rec_type_decl loc ty_vars ty (Enum enums)
let mk_algebraic_type_decl loc ty_vars ty enums =
try
let l =
List.rev_map
(fun (c, l) ->
if l != [] then raise Exit;
c
)enums
in
mk_non_rec_type_decl loc ty_vars ty (Enum (List.rev l))
with Exit ->
mk_non_rec_type_decl loc ty_vars ty (Algebraic enums)
let mk_record_type_decl loc ty_vars ty ?(constr="{") fields =
mk_non_rec_type_decl loc ty_vars ty (Record (constr, fields))
(** Declaration of symbols, functions, predicates, and goals *)
let mk_logic loc is_ac named_idents ty =
Logic (loc , is_ac, named_idents, ty)
let mk_function_def loc named_ident args ty expr =
Function_def (loc, named_ident, args, ty, expr)
let mk_ground_predicate_def loc named_ident expr =
Predicate_def (loc, named_ident, [], expr)
let mk_non_ground_predicate_def loc named_ident args expr =
Predicate_def (loc, named_ident, args, expr)
let mk_goal loc name expr =
Goal (loc, name, expr)
(** Declaration of theories, generic axioms and rewriting rules **)
let mk_theory loc name ext expr =
Theory (loc, name, ext, expr)
let mk_generic_axiom loc name expr =
Axiom (loc, name, Util.Default, expr)
let mk_rewriting loc name expr =
Rewriting (loc, name, expr)
(** Declaration of theory axioms and case-splits **)
let mk_theory_axiom loc name expr =
Axiom (loc, name, Util.Propagator, expr)
let mk_theory_case_split loc name expr =
Axiom (loc, name, Util.Default, expr)
(** Making pure and logic types *)
let int_type = PPTint
let bool_type = PPTbool
let real_type = PPTreal
let unit_type = PPTunit
let mk_bitv_type size =
PPTbitv(int_of_string size)
let mk_external_type loc args ty =
PPTexternal (args, ty, loc)
let mk_logic_type args_ty res_ty =
match res_ty with
| None -> PPredicate args_ty
| Some res -> PFunction (args_ty, res)
let mk_var_type loc alpha =
PPTvarid (alpha, loc)
(** Making arithmetic expressions and predicates **)
let mk_int_const loc n =
mk_localized loc (PPconst (ConstInt n))
let mk_real_const loc r =
mk_localized loc (PPconst (ConstReal r))
let mk_add loc e1 e2 =
mk_localized loc (mk_infix e1 PPadd e2)
let mk_sub loc e1 e2 =
mk_localized loc (mk_infix e1 PPsub e2)
let mk_mul loc e1 e2 =
mk_localized loc (mk_infix e1 PPmul e2)
let mk_div loc e1 e2 =
mk_localized loc (mk_infix e1 PPdiv e2)
let mk_mod loc e1 e2 =
mk_localized loc (mk_infix e1 PPmod e2)
let mk_minus loc e =
mk_localized loc (mk_prefix PPneg e)
let mk_pred_lt loc e1 e2 =
mk_localized loc (mk_infix e1 PPlt e2)
let mk_pred_le loc e1 e2 =
mk_localized loc (mk_infix e1 PPle e2)
let mk_pred_gt loc e1 e2 =
mk_localized loc (mk_infix e1 PPgt e2)
let mk_pred_ge loc e1 e2 =
mk_localized loc (mk_infix e1 PPge e2)
(** Making Record expressions **)
let mk_record loc fields =
mk_localized loc (PPrecord fields)
let mk_with_record loc e fields =
mk_localized loc (PPwith(e, fields))
let mk_dot_record loc e label =
mk_localized loc (PPdot(e, label))
(** Making Array expressions **)
let mk_array_get loc e1 e2 =
mk_localized loc (PPget(e1, e2))
let mk_array_set loc e1 e2 e3 =
mk_localized loc (PPset(e1, e2, e3))
(** Making Bit-vector expressions **)
let mk_bitv_const =
let check_binary_mode s =
String.iter
(fun x ->
match x with
| '0' | '1' -> ()
| _ -> raise Parsing.Parse_error) s;
s
in fun loc const ->
mk_localized loc (PPconst (ConstBitv (check_binary_mode const)))
let loc e i j =
let i = mk_int_const loc i in
let j = mk_int_const loc j in
mk_localized loc (PPextract (e, i, j))
let mk_bitv_concat loc e1 e2 =
mk_localized loc (PPconcat(e1, e2))
(** Making Boolean / Propositional expressions **)
let mk_true_const loc =
mk_localized loc (PPconst ConstTrue)
let mk_false_const loc =
mk_localized loc (PPconst ConstFalse)
let mk_and loc e1 e2 =
mk_localized loc (mk_infix e1 PPand e2)
let mk_or loc e1 e2 =
mk_localized loc (mk_infix e1 PPor e2)
let mk_xor loc e1 e2 =
mk_localized loc (mk_infix e1 PPxor e2)
let mk_iff loc e1 e2 =
mk_localized loc (mk_infix e1 PPiff e2)
let mk_implies loc e1 e2 =
mk_localized loc (mk_infix e1 PPimplies e2)
let mk_not loc e =
mk_localized loc (mk_prefix PPnot e)
let mk_pred_eq loc e1 e2 =
mk_localized loc (mk_infix e1 PPeq e2)
let mk_pred_not_eq loc e1 e2 =
mk_localized loc (mk_infix e1 PPneq e2)
let mk_distinct loc e2 =
match e2 with
| [a; b] -> mk_pred_not_eq loc a b
| _ -> mk_localized loc (PPdistinct e2)
(** Making quantified formulas **)
let mk_forall loc vs_ty triggers filters expr =
mk_localized loc (PPforall_named (vs_ty, triggers, filters, expr))
let mk_exists loc vs_ty triggers filters expr =
mk_localized loc (PPexists_named (vs_ty, triggers, filters, expr))
(** Naming and casting types of expressions **)
let mk_named loc name e =
mk_localized loc (PPnamed (name, e))
let mk_type_cast loc e ty =
mk_localized loc (PPcast(e,ty))
(** Making vars, applications, if-then-else, and let expressions **)
let mk_var loc var =
mk_localized loc (PPvar var)
let mk_application loc app args =
mk_localized loc (PPapp (app, args))
let mk_pattern pat_loc pat_app args =
{ pat_loc ; pat_desc = (pat_app, args) }
let mk_ite loc cond th el =
mk_localized loc (PPif (cond, th, el))
let mk_let loc binders e =
mk_localized loc (PPlet (binders, e))
let mk_void loc =
mk_localized loc (PPconst ConstVoid)
(** Making particular expression used in semantic triggers **)
let mk_in_interval loc expr low_br ei ej up_br =
mk_localized loc (PPinInterval (expr, not low_br, ei ,ej, up_br))
let mk_maps_to loc v expr =
mk_localized loc (PPmapsTo (v, expr))
(** Making cuts and checks **)
let mk_check loc expr =
mk_localized loc (PPcheck expr)
let mk_cut loc expr =
mk_localized loc (PPcut expr)
let mk_match loc expr cases =
mk_localized loc (PPmatch (expr, cases))
let mk_algebraic_test loc expr cstr =
mk_localized loc (PPisConstr (expr, cstr))
let mk_algebraic_project loc ~guarded expr cstr =
mk_localized loc (PPproject (guarded, expr, cstr))