1(**
2   The Z3 ML/OCaml Interface.
3
4   Copyright (C) 2012 Microsoft Corporation
5   @author CM Wintersteiger (cwinter) 2012-12-17
6*)
7
8open Z3enums
9
10exception Error of string
11let _ = Callback.register_exception "Z3EXCEPTION" (Error "")
12
13type context = Z3native.context
14
15module Log =
16struct
17  let open_ filename =
18    lbool_of_int (Z3native.open_log filename) = L_TRUE
19  let close = Z3native.close_log
20  let append = Z3native.append_log
21end
22
23
24module Version =
25struct
26  let (major, minor, build, revision) = Z3native.get_version ()
27
28  let full_version : string = Z3native.get_full_version()
29
30  let to_string =
31    string_of_int major ^ "." ^
32    string_of_int minor ^ "." ^
33    string_of_int build ^ "." ^
34    string_of_int revision
35end
36
37let mk_list f n =
38  let rec mk_list' i accu =
39    if i >= n then
40      List.rev accu
41    else
42      mk_list' (i + 1) ((f i)::accu)
43  in
44  mk_list' 0 []
45
46let check_int32 v = v = Int32.to_int (Int32.of_int v)
47
48let mk_int_expr ctx v ty =
49   if not (check_int32 v) then
50      Z3native.mk_numeral ctx (string_of_int v) ty
51   else
52      Z3native.mk_int ctx v ty
53
54let mk_context (settings:(string * string) list) =
55  let cfg = Z3native.mk_config () in
56  let f e = Z3native.set_param_value cfg (fst e) (snd e) in
57  List.iter f settings;
58  let res = Z3native.mk_context_rc cfg in
59  Z3native.del_config cfg;
60  Z3native.set_ast_print_mode res (Z3enums.int_of_ast_print_mode PRINT_SMTLIB2_COMPLIANT);
61  Z3native.set_internal_error_handler res;
62  res
63
64module Symbol =
65struct
66  type symbol = Z3native.symbol
67  let gc = Z3native.context_of_symbol
68
69  let kind o = symbol_kind_of_int (Z3native.get_symbol_kind (gc o) o)
70  let is_int_symbol o = kind o = INT_SYMBOL
71  let is_string_symbol o = kind o = STRING_SYMBOL
72  let get_int o = Z3native.get_symbol_int (gc o) o
73  let get_string o = Z3native.get_symbol_string (gc o) o
74  let to_string o =
75    match kind o with
76    | INT_SYMBOL -> string_of_int (Z3native.get_symbol_int (gc o) o)
77    | STRING_SYMBOL -> Z3native.get_symbol_string (gc o) o
78
79  let mk_int = Z3native.mk_int_symbol
80  let mk_string = Z3native.mk_string_symbol
81
82  let mk_ints ctx names = List.map (mk_int ctx) names
83  let mk_strings ctx names = List.map (mk_string ctx) names
84end
85
86module rec AST :
87sig
88  type ast = Z3native.ast
89  val gc : ast -> context
90  module ASTVector :
91  sig
92    type ast_vector = Z3native.ast_vector
93    val mk_ast_vector : context -> ast_vector
94    val get_size : ast_vector -> int
95    val get : ast_vector -> int -> ast
96    val set : ast_vector -> int -> ast -> unit
97    val resize : ast_vector -> int -> unit
98    val push : ast_vector -> ast -> unit
99    val translate : ast_vector -> context -> ast_vector
100    val to_list : ast_vector -> ast list
101    val to_expr_list : ast_vector -> Expr.expr list
102    val to_string : ast_vector -> string
103  end
104  module ASTMap :
105  sig
106    type ast_map = Z3native.ast_map
107    val mk_ast_map : context -> ast_map
108    val contains : ast_map -> ast -> bool
109    val find : ast_map -> ast -> ast
110    val insert : ast_map -> ast -> ast -> unit
111    val erase : ast_map -> ast -> unit
112    val reset : ast_map -> unit
113    val get_size : ast_map -> int
114    val get_keys : ast_map -> ast list
115    val to_string : ast_map -> string
116  end
117  val hash : ast -> int
118  val get_id : ast -> int
119  val get_ast_kind : ast -> Z3enums.ast_kind
120  val is_expr : ast -> bool
121  val is_app : ast -> bool
122  val is_var : ast -> bool
123  val is_quantifier : ast -> bool
124  val is_sort : ast -> bool
125  val is_func_decl : ast -> bool
126  val to_string : ast -> string
127  val to_sexpr : ast -> string
128  val equal : ast -> ast -> bool
129  val compare : ast -> ast -> int
130  val translate : ast -> context -> ast
131end = struct
132  type ast = Z3native.ast
133  let gc = Z3native.context_of_ast
134
135  module ASTVector =
136  struct
137    type ast_vector = Z3native.ast_vector
138    let gc = Z3native.context_of_ast_vector
139
140    let mk_ast_vector = Z3native.mk_ast_vector
141    let get_size (x:ast_vector) = Z3native.ast_vector_size (gc x) x
142    let get (x:ast_vector) (i:int) = Z3native.ast_vector_get (gc x) x i
143    let set (x:ast_vector) (i:int) (value:ast) = Z3native.ast_vector_set (gc x) x i value
144    let resize (x:ast_vector) (new_size:int) = Z3native.ast_vector_resize (gc x) x new_size
145    let push (x:ast_vector) (a:ast) = Z3native.ast_vector_push (gc x) x a
146    let translate (x:ast_vector) (to_ctx:context) = Z3native.ast_vector_translate (gc x) x to_ctx
147
148    let to_list (x:ast_vector) =
149      let xs = get_size x in
150      let f i = get x i in
151      mk_list f xs
152
153    let to_expr_list (x:ast_vector) =
154      let xs = get_size x in
155      let f i = get x i in
156      mk_list f xs
157
158    let to_string x = Z3native.ast_vector_to_string (gc x) x
159  end
160
161  module ASTMap =
162  struct
163    type ast_map = Z3native.ast_map
164    let gc = Z3native.context_of_ast_map
165
166    let mk_ast_map = Z3native.mk_ast_map
167    let contains (x:ast_map) (key:ast) = Z3native.ast_map_contains (gc x) x key
168    let find (x:ast_map) (key:ast) = Z3native.ast_map_find (gc x) x key
169    let insert (x:ast_map) (key:ast) (value:ast) = Z3native.ast_map_insert (gc x) x key value
170    let erase (x:ast_map) (key:ast) = Z3native.ast_map_erase (gc x) x key
171    let reset (x:ast_map) = Z3native.ast_map_reset (gc x) x
172    let get_size (x:ast_map) = Z3native.ast_map_size (gc x) x
173
174    let get_keys (x:ast_map) =
175      let av = Z3native.ast_map_keys (gc x) x in
176      ASTVector.to_list av
177
178    let to_string (x:ast_map) = Z3native.ast_map_to_string (gc x) x
179  end
180
181  let hash (x:ast) = Z3native.get_ast_hash (gc x) x
182  let get_id (x:ast) = Z3native.get_ast_id (gc x) x
183  let get_ast_kind (x:ast) = ast_kind_of_int (Z3native.get_ast_kind (gc x) x)
184
185  let is_expr (x:ast) =
186    match get_ast_kind x with
187    | APP_AST
188    | NUMERAL_AST
189    | QUANTIFIER_AST
190    | VAR_AST -> true
191    | _ -> false
192
193  let is_app (x:ast) = get_ast_kind x = APP_AST
194  let is_var (x:ast) = get_ast_kind x = VAR_AST
195  let is_quantifier (x:ast) = get_ast_kind x = QUANTIFIER_AST
196  let is_sort (x:ast) = get_ast_kind x = SORT_AST
197  let is_func_decl (x:ast) = get_ast_kind x = FUNC_DECL_AST
198
199  let to_string (x:ast) = Z3native.ast_to_string (gc x) x
200  let to_sexpr (x:ast) = Z3native.ast_to_string (gc x) x
201
202  (* The built-in equality uses the custom operations of the C layer *)
203  let equal = (=)
204
205  (* The standard comparison uses the custom operations of the C layer *)
206  let compare = Pervasives.compare
207
208  let translate (x:ast) (to_ctx:context) =
209    if gc x = to_ctx then
210      x
211    else
212      Z3native.translate (gc x) x to_ctx
213end
214
215and Sort :
216sig
217  type sort = AST.ast
218  val gc : sort -> context
219  val equal : sort -> sort -> bool
220  val get_id : sort -> int
221  val get_sort_kind : sort -> Z3enums.sort_kind
222  val get_name : sort -> Symbol.symbol
223  val to_string : sort -> string
224  val mk_uninterpreted : context -> Symbol.symbol -> sort
225  val mk_uninterpreted_s : context -> string -> sort
226end = struct
227  type sort = Z3native.sort
228  let gc = Z3native.context_of_ast
229
230  let equal a b = (a = b) || (gc a = gc b && Z3native.is_eq_sort (gc a) a b)
231
232  let get_id (x:sort) = Z3native.get_sort_id (gc x) x
233  let get_sort_kind (x:sort) = sort_kind_of_int (Z3native.get_sort_kind (gc x) x)
234  let get_name (x:sort) = Z3native.get_sort_name (gc x) x
235  let to_string (x:sort) = Z3native.sort_to_string (gc x) x
236  let mk_uninterpreted = Z3native.mk_uninterpreted_sort
237  let mk_uninterpreted_s (ctx:context) (s:string) = mk_uninterpreted ctx (Symbol.mk_string ctx s)
238end
239
240and FuncDecl :
241sig
242  type func_decl = Z3native.func_decl
243  val gc : func_decl -> context
244  module Parameter :
245  sig
246    type parameter =
247        P_Int of int
248      | P_Dbl of float
249      | P_Sym of Symbol.symbol
250      | P_Srt of Sort.sort
251      | P_Ast of AST.ast
252      | P_Fdl of func_decl
253      | P_Rat of string
254
255    val get_kind : parameter -> Z3enums.parameter_kind
256    val get_int : parameter -> int
257    val get_float : parameter -> float
258    val get_symbol : parameter -> Symbol.symbol
259    val get_sort : parameter -> Sort.sort
260    val get_ast : parameter -> AST.ast
261    val get_func_decl : parameter -> func_decl
262    val get_rational : parameter -> string
263  end
264  val mk_func_decl : context -> Symbol.symbol -> Sort.sort list -> Sort.sort -> func_decl
265  val mk_func_decl_s : context -> string -> Sort.sort list -> Sort.sort -> func_decl
266  val mk_rec_func_decl : context -> Symbol.symbol -> Sort.sort list -> Sort.sort -> func_decl
267  val mk_rec_func_decl_s : context -> string -> Sort.sort list -> Sort.sort -> func_decl
268  val add_rec_def : context -> func_decl -> Expr.expr list -> Expr.expr -> unit
269  val mk_fresh_func_decl : context -> string -> Sort.sort list -> Sort.sort -> func_decl
270  val mk_const_decl : context -> Symbol.symbol -> Sort.sort -> func_decl
271  val mk_const_decl_s : context -> string -> Sort.sort -> func_decl
272  val mk_fresh_const_decl : context -> string -> Sort.sort -> func_decl
273  val equal : func_decl -> func_decl -> bool
274  val to_string : func_decl -> string
275  val get_id : func_decl -> int
276  val get_arity : func_decl -> int
277  val get_domain_size : func_decl -> int
278  val get_domain : func_decl -> Sort.sort list
279  val get_range : func_decl -> Sort.sort
280  val get_decl_kind : func_decl -> Z3enums.decl_kind
281  val get_name : func_decl -> Symbol.symbol
282  val get_num_parameters : func_decl -> int
283  val get_parameters : func_decl -> Parameter.parameter list
284  val apply : func_decl -> Expr.expr list -> Expr.expr
285end = struct
286  type func_decl = AST.ast
287  let gc = Z3native.context_of_ast
288
289  module Parameter =
290  struct
291    type parameter =
292      | P_Int of int
293      | P_Dbl of float
294      | P_Sym of Symbol.symbol
295      | P_Srt of Sort.sort
296      | P_Ast of AST.ast
297      | P_Fdl of func_decl
298      | P_Rat of string
299
300    let get_kind = function
301      | P_Int _ -> PARAMETER_INT
302      | P_Dbl _ -> PARAMETER_DOUBLE
303      | P_Sym _ -> PARAMETER_SYMBOL
304      | P_Srt _ -> PARAMETER_SORT
305      | P_Ast _ -> PARAMETER_AST
306      | P_Fdl _ -> PARAMETER_FUNC_DECL
307      | P_Rat _ -> PARAMETER_RATIONAL
308
309    let get_int = function
310      | P_Int x -> x
311      | _ -> raise (Error "parameter is not an int")
312
313    let get_float = function
314      | P_Dbl x -> x
315      | _ -> raise (Error "parameter is not a float")
316
317    let get_symbol = function
318      | P_Sym x -> x
319      | _ -> raise (Error "parameter is not a symbol")
320
321    let get_sort = function
322      | P_Srt x -> x
323      | _ -> raise (Error "parameter is not a sort")
324
325    let get_ast = function
326      | P_Ast x -> x
327      | _ -> raise (Error "parameter is not an ast")
328
329    let get_func_decl = function
330      | P_Fdl x -> x
331      | _ -> raise (Error "parameter is not a func_decl")
332
333    let get_rational = function
334      | P_Rat x -> x
335      | _ -> raise (Error "parameter is not a rational string")
336  end
337
338  let mk_func_decl (ctx:context) (name:Symbol.symbol) (domain:Sort.sort list) (range:Sort.sort) =
339    Z3native.mk_func_decl ctx name (List.length domain) domain range
340
341  let mk_func_decl_s (ctx:context) (name:string) (domain:Sort.sort list) (range:Sort.sort) =
342    mk_func_decl ctx (Symbol.mk_string ctx name) domain range
343
344  let mk_rec_func_decl (ctx:context) (name:Symbol.symbol) (domain:Sort.sort list) (range:Sort.sort) =
345    Z3native.mk_rec_func_decl ctx name (List.length domain) domain range
346
347  let mk_rec_func_decl_s (ctx:context) (name:string) (domain:Sort.sort list) (range:Sort.sort) =
348    mk_rec_func_decl ctx (Symbol.mk_string ctx name) domain range
349
350  let add_rec_def (ctx:context) (f:func_decl) (args:Expr.expr list) (body:Expr.expr) =
351    Z3native.add_rec_def ctx f (List.length args) args body
352
353  let mk_fresh_func_decl (ctx:context) (prefix:string) (domain:Sort.sort list) (range:Sort.sort) =
354    Z3native.mk_fresh_func_decl ctx prefix (List.length domain) domain range
355
356  let mk_const_decl (ctx:context) (name:Symbol.symbol) (range:Sort.sort) =
357    Z3native.mk_func_decl ctx name 0 [] range
358
359  let mk_const_decl_s (ctx:context) (name:string) (range:Sort.sort) =
360    Z3native.mk_func_decl ctx (Symbol.mk_string ctx name) 0 [] range
361
362  let mk_fresh_const_decl (ctx:context) (prefix:string) (range:Sort.sort) =
363    Z3native.mk_fresh_func_decl ctx prefix 0 [] range
364
365  let equal a b = (a = b) || (gc a = gc b && Z3native.is_eq_func_decl (gc a) a b)
366
367  let to_string (x:func_decl) = Z3native.func_decl_to_string (gc x) x
368  let get_id (x:func_decl) = Z3native.get_func_decl_id (gc x) x
369  let get_arity (x:func_decl) = Z3native.get_arity (gc x) x
370  let get_domain_size (x:func_decl) = Z3native.get_domain_size (gc x) x
371
372  let get_domain (x:func_decl) =
373    let n = get_domain_size x in
374    let f i = Z3native.get_domain (gc x) x i in
375    mk_list f n
376
377  let get_range (x:func_decl) = Z3native.get_range (gc x) x
378  let get_decl_kind (x:func_decl) = decl_kind_of_int (Z3native.get_decl_kind (gc x) x)
379  let get_name (x:func_decl) = Z3native.get_decl_name (gc x) x
380  let get_num_parameters (x:func_decl) = Z3native.get_decl_num_parameters (gc x) x
381
382  let get_parameters (x:func_decl) =
383    let n = get_num_parameters x in
384    let f i =
385      match parameter_kind_of_int (Z3native.get_decl_parameter_kind (gc x) x i) with
386      | PARAMETER_INT -> Parameter.P_Int (Z3native.get_decl_int_parameter (gc x) x i)
387      | PARAMETER_DOUBLE -> Parameter.P_Dbl (Z3native.get_decl_double_parameter (gc x) x i)
388      | PARAMETER_SYMBOL-> Parameter.P_Sym (Z3native.get_decl_symbol_parameter (gc x) x i)
389      | PARAMETER_SORT -> Parameter.P_Srt (Z3native.get_decl_sort_parameter (gc x) x i)
390      | PARAMETER_AST -> Parameter.P_Ast (Z3native.get_decl_ast_parameter (gc x) x i)
391      | PARAMETER_FUNC_DECL -> Parameter.P_Fdl (Z3native.get_decl_func_decl_parameter (gc x) x i)
392      | PARAMETER_RATIONAL -> Parameter.P_Rat (Z3native.get_decl_rational_parameter (gc x) x i)
393    in
394    mk_list f n
395
396  let apply (x:func_decl) (args:Expr.expr list) = Expr.expr_of_func_app (gc x) x args
397end
398
399
400and Params:
401sig
402  type params = Z3native.params
403  module ParamDescrs :
404  sig
405    type param_descrs = Z3native.param_descrs
406    val validate : param_descrs -> params -> unit
407    val get_kind : param_descrs -> Symbol.symbol -> Z3enums.param_kind
408    val get_names : param_descrs -> Symbol.symbol list
409    val get_size : param_descrs -> int
410    val to_string : param_descrs -> string
411  end
412  val add_bool : params -> Symbol.symbol -> bool -> unit
413  val add_int : params -> Symbol.symbol -> int -> unit
414  val add_float : params -> Symbol.symbol -> float -> unit
415  val add_symbol : params -> Symbol.symbol -> Symbol.symbol -> unit
416  val mk_params : context -> params
417  val to_string : params -> string
418
419  val update_param_value : context -> string -> string -> unit
420  val set_print_mode : context -> Z3enums.ast_print_mode -> unit
421end = struct
422  type params = Z3native.params
423  let gc = Z3native.context_of_params
424
425  module ParamDescrs =
426  struct
427    type param_descrs = Z3native.param_descrs
428    let gc = Z3native.context_of_param_descrs
429
430    let validate (x:param_descrs) (p:params) = Z3native.params_validate (gc x) p x
431    let get_kind (x:param_descrs) (name:Symbol.symbol) = param_kind_of_int (Z3native.param_descrs_get_kind (gc x) x name)
432
433    let get_names (x:param_descrs) =
434      let n = Z3native.param_descrs_size (gc x) x in
435      let f i = Z3native.param_descrs_get_name (gc x) x i in
436      mk_list f n
437
438    let get_size (x:param_descrs) = Z3native.param_descrs_size (gc x) x
439    let to_string (x:param_descrs) = Z3native.param_descrs_to_string (gc x) x
440  end
441
442  let add_bool (x:params) (name:Symbol.symbol) (value:bool) = Z3native.params_set_bool (gc x) x name value
443  let add_int (x:params)  (name:Symbol.symbol) (value:int) = Z3native.params_set_uint (gc x) x name value
444  let add_float (x:params) (name:Symbol.symbol) (value:float) = Z3native.params_set_double (gc x) x name value
445  let add_symbol (x:params) (name:Symbol.symbol) (value:Symbol.symbol) = Z3native.params_set_symbol (gc x) x name value
446  let mk_params (ctx:context) = Z3native.mk_params ctx
447  let to_string (x:params) = Z3native.params_to_string (gc x) x
448
449  let update_param_value (ctx:context) (id:string) (value:string) = Z3native.update_param_value ctx id value
450  let set_print_mode (ctx:context) (value:ast_print_mode) = Z3native.set_ast_print_mode ctx (int_of_ast_print_mode value)
451end
452
453(** General expressions (terms) *)
454and Expr :
455sig
456  type expr = AST.ast
457  val gc : expr -> context
458  val ast_of_expr  :  expr -> AST.ast
459  val expr_of_ast  :  AST.ast -> expr
460  val expr_of_func_app : context -> FuncDecl.func_decl -> expr list -> expr
461  val simplify : expr -> Params.params option -> expr
462  val get_simplify_help : context -> string
463  val get_simplify_parameter_descrs : context -> Params.ParamDescrs.param_descrs
464  val get_func_decl : expr -> FuncDecl.func_decl
465  val get_num_args : expr -> int
466  val get_args : expr -> expr list
467  val update : expr -> expr list -> expr
468  val substitute : expr -> expr list -> expr list -> expr
469  val substitute_one : expr -> expr -> expr -> expr
470  val substitute_vars : expr -> expr list -> expr
471  val translate : expr -> context -> expr
472  val to_string : expr -> string
473  val is_numeral : expr -> bool
474  val is_well_sorted : expr -> bool
475  val get_sort : expr -> Sort.sort
476  val is_const : expr -> bool
477  val mk_const : context -> Symbol.symbol -> Sort.sort -> expr
478  val mk_const_s : context -> string -> Sort.sort -> expr
479  val mk_const_f : context -> FuncDecl.func_decl -> expr
480  val mk_fresh_const : context -> string -> Sort.sort -> expr
481  val mk_app : context -> FuncDecl.func_decl -> expr list -> expr
482  val mk_numeral_string : context -> string -> Sort.sort -> expr
483  val mk_numeral_int : context -> int -> Sort.sort -> expr
484  val equal : expr -> expr -> bool
485  val compare : expr -> expr -> int
486end = struct
487  type expr = AST.ast
488  let gc = Z3native.context_of_ast
489
490  let expr_of_ast a =
491    let q = Z3enums.ast_kind_of_int (Z3native.get_ast_kind (gc a) a) in
492    if q <> Z3enums.APP_AST && q <> VAR_AST && q <> QUANTIFIER_AST && q <> NUMERAL_AST then
493      raise (Error "Invalid coercion")
494    else
495      a
496
497  let ast_of_expr e = e
498
499  let expr_of_func_app ctx f args =
500    Z3native.mk_app ctx f (List.length args) args
501
502  let simplify (x:expr) (p:Params.params option) =
503    match p with
504    | None -> Z3native.simplify (gc x) x
505    | Some pp -> Z3native.simplify_ex (gc x) x pp
506
507  let get_simplify_help = Z3native.simplify_get_help
508  let get_simplify_parameter_descrs = Z3native.simplify_get_param_descrs
509  let get_func_decl (x:expr) = Z3native.get_app_decl (gc x) x
510  let get_num_args (x:expr) = Z3native.get_app_num_args (gc x) x
511  let get_args (x:expr) =
512    let n = get_num_args x in
513    let f i = Z3native.get_app_arg (gc x) x i in
514    mk_list f n
515
516  let update (x:expr) (args:expr list) =
517    if AST.is_app x && List.length args <> get_num_args x then
518      raise (Error "Number of arguments does not match")
519    else
520      Z3native.update_term (gc x) x (List.length args) args
521
522  let substitute (x:expr) (from:expr list) (to_:expr list) =
523    let len = List.length from in
524    if List.length to_ <> len then
525      raise (Error "Argument sizes do not match")
526    else
527      Z3native.substitute (gc x) x len from to_
528
529  let substitute_one x from to_ = substitute x [ from ] [ to_ ]
530  let substitute_vars x to_ =
531    Z3native.substitute_vars (gc x) x (List.length to_) to_
532
533  let translate (x:expr) to_ctx =
534    if gc x = to_ctx then
535      x
536    else
537      Z3native.translate (gc x) x to_ctx
538
539  let to_string (x:expr) = Z3native.ast_to_string (gc x) x
540  let is_numeral (x:expr) = Z3native.is_numeral_ast (gc x) x
541  let is_well_sorted (x:expr) = Z3native.is_well_sorted (gc x) x
542  let get_sort (x:expr) = Z3native.get_sort (gc x) x
543  let is_const (x:expr) =
544    AST.is_app x
545    && get_num_args x = 0
546    && FuncDecl.get_domain_size (get_func_decl x) = 0
547
548  let mk_const (ctx:context) (name:Symbol.symbol) (range:Sort.sort) = Z3native.mk_const ctx name range
549  let mk_const_s (ctx:context) (name:string) (range:Sort.sort) = mk_const ctx (Symbol.mk_string ctx name) range
550  let mk_const_f (ctx:context) (f:FuncDecl.func_decl) = expr_of_func_app ctx f []
551  let mk_fresh_const (ctx:context) (prefix:string) (range:Sort.sort) = Z3native.mk_fresh_const ctx prefix range
552  let mk_app (ctx:context) (f:FuncDecl.func_decl) (args:expr list) = expr_of_func_app ctx f args
553  let mk_numeral_string (ctx:context) (v:string) (ty:Sort.sort) = Z3native.mk_numeral ctx v ty
554  let mk_numeral_int (ctx:context) (v:int) (ty:Sort.sort) = mk_int_expr ctx v ty
555  let equal (a:expr) (b:expr) = AST.equal a b
556  let compare (a:expr) (b:expr) = AST.compare a b
557end
558
559open FuncDecl
560open Expr
561
562module Boolean =
563struct
564  let mk_sort = Z3native.mk_bool_sort
565  let mk_const (ctx:context) (name:Symbol.symbol) = Expr.mk_const ctx name (mk_sort ctx)
566  let mk_const_s (ctx:context) (name:string) = mk_const ctx (Symbol.mk_string ctx name)
567  let mk_true = Z3native.mk_true
568  let mk_false = Z3native.mk_false
569  let mk_val (ctx:context) (value:bool) = if value then mk_true ctx else mk_false ctx
570  let mk_not = Z3native.mk_not
571  let mk_ite = Z3native.mk_ite
572  let mk_iff = Z3native.mk_iff
573  let mk_implies = Z3native.mk_implies
574  let mk_xor = Z3native.mk_xor
575
576  let mk_and ctx args = Z3native.mk_and ctx (List.length args) args
577
578  let mk_or ctx args = Z3native.mk_or ctx (List.length args) args
579
580  let mk_eq = Z3native.mk_eq
581  let mk_distinct ctx args = Z3native.mk_distinct ctx (List.length args) args
582
583  let get_bool_value x = lbool_of_int (Z3native.get_bool_value (gc x) x)
584
585  let is_bool x =
586    AST.is_expr x
587    && Z3native.is_eq_sort (gc x) (Z3native.mk_bool_sort (gc x)) (Z3native.get_sort (gc x) x)
588
589  let is_true x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_TRUE
590  let is_false x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_FALSE
591  let is_eq x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_EQ
592  let is_distinct x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_DISTINCT
593  let is_ite x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_ITE
594  let is_and x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_AND
595  let is_or x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_OR
596  let is_iff x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_IFF
597  let is_xor x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_XOR
598  let is_not x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_NOT
599  let is_implies x = AST.is_app x && FuncDecl.get_decl_kind (get_func_decl x) = OP_IMPLIES
600end
601
602
603module Quantifier =
604struct
605  type quantifier = AST.ast
606  let gc = Z3native.context_of_ast
607
608  let expr_of_quantifier q = q
609
610  let quantifier_of_expr e =
611    let q = Z3enums.ast_kind_of_int (Z3native.get_ast_kind (gc e) e) in
612    if q <> Z3enums.QUANTIFIER_AST then
613      raise (Error "Invalid coercion")
614    else
615      e
616
617  module Pattern =
618  struct
619    type pattern = Z3native.pattern
620    let gc = Z3native.context_of_ast
621
622    let get_num_terms x = Z3native.get_pattern_num_terms (gc x) x
623
624    let get_terms x =
625      let n = get_num_terms x in
626      let f i = Z3native.get_pattern (gc x) x i in
627      mk_list f n
628
629    let to_string x = Z3native.pattern_to_string (gc x) x
630  end
631
632  let get_index (x:expr) =
633    if not (AST.is_var x) then
634      raise (Error "Term is not a bound variable.")
635    else
636      Z3native.get_index_value (gc x) x
637
638  let is_universal x = Z3native.is_quantifier_forall (gc x) x
639  let is_existential x = not (is_universal x)
640  let get_weight x = Z3native.get_quantifier_weight (gc x) x
641  let get_num_patterns x = Z3native.get_quantifier_num_patterns (gc x) x
642  let get_patterns x =
643    let n = get_num_patterns x in
644    let f i = Z3native.get_quantifier_pattern_ast (gc x) x i in
645    mk_list f n
646
647  let get_num_no_patterns x = Z3native.get_quantifier_num_no_patterns (gc x) x
648
649  let get_no_patterns x =
650    let n = get_num_patterns x in
651    let f i = Z3native.get_quantifier_no_pattern_ast (gc x) x i in
652    mk_list f n
653
654  let get_num_bound x = Z3native.get_quantifier_num_bound (gc x) x
655
656  let get_bound_variable_names x =
657    let n = get_num_bound x in
658    let f i = Z3native.get_quantifier_bound_name (gc x) x i in
659    mk_list f n
660
661  let get_bound_variable_sorts x =
662    let n = get_num_bound x in
663    let f i = Z3native.get_quantifier_bound_sort (gc x) x i in
664    mk_list f n
665
666  let get_body x = Z3native.get_quantifier_body (gc x) x
667  let mk_bound = Z3native.mk_bound
668
669  let mk_pattern ctx terms =
670    let len = List.length terms in
671    if len = 0 then
672      raise (Error "Cannot create a pattern from zero terms")
673    else
674      Z3native.mk_pattern ctx len terms
675
676  let _internal_mk_quantifier ~universal ctx sorts names body weight patterns nopatterns quantifier_id skolem_id =
677    let len = List.length sorts in
678    if List.length names <> len then
679      raise (Error "Number of sorts does not match number of names")
680    else
681      match nopatterns, quantifier_id, skolem_id with
682      | [], None, None ->
683        Z3native.mk_quantifier ctx universal
684          (match weight with | None -> 1 | Some x -> x)
685          (List.length patterns) patterns
686          len sorts
687          names body
688      | _ ->
689        Z3native.mk_quantifier_ex ctx universal
690          (match weight with | None -> 1 | Some x -> x)
691          (match quantifier_id with | None -> Z3native.mk_null_symbol ctx | Some x -> x)
692          (match skolem_id with | None -> Z3native.mk_null_symbol ctx | Some x -> x)
693          (List.length patterns) patterns
694          (List.length nopatterns) nopatterns
695          len sorts
696          names body
697
698  let _internal_mk_quantifier_const ~universal ctx bound_constants body weight patterns nopatterns quantifier_id skolem_id =
699    match nopatterns, quantifier_id, skolem_id with
700    | [], None, None ->
701      Z3native.mk_quantifier_const ctx universal
702        (match weight with | None -> 1 | Some x -> x)
703        (List.length bound_constants) bound_constants
704        (List.length patterns) patterns
705        body
706    | _ ->
707      Z3native.mk_quantifier_const_ex ctx universal
708        (match weight with | None -> 1 | Some x -> x)
709        (match quantifier_id with | None -> Z3native.mk_null_symbol ctx | Some x -> x)
710        (match skolem_id with | None -> Z3native.mk_null_symbol ctx | Some x -> x)
711        (List.length bound_constants) bound_constants
712        (List.length patterns) patterns
713        (List.length nopatterns) nopatterns
714        body
715
716  let mk_forall = _internal_mk_quantifier ~universal:true
717  let mk_forall_const = _internal_mk_quantifier_const ~universal:true
718  let mk_exists = _internal_mk_quantifier ~universal:false
719  let mk_exists_const = _internal_mk_quantifier_const ~universal:false
720  let mk_lambda_const ctx bound body = Z3native.mk_lambda_const ctx (List.length bound) bound body
721  let mk_lambda ctx bound body =
722      let names = List.map (fun (x,_) -> x) bound in
723      let sorts = List.map (fun (_,y) -> y) bound in
724      Z3native.mk_lambda ctx (List.length bound) sorts names body
725
726  let mk_quantifier (ctx:context) (universal:bool) (sorts:Sort.sort list) (names:Symbol.symbol list) (body:expr) (weight:int option) (patterns:Pattern.pattern list) (nopatterns:expr list) (quantifier_id:Symbol.symbol option) (skolem_id:Symbol.symbol option) =
727    if universal then
728      mk_forall ctx sorts names body weight patterns nopatterns quantifier_id skolem_id
729    else
730      mk_exists ctx sorts names body weight patterns nopatterns quantifier_id skolem_id
731
732  let mk_quantifier_const (ctx:context) (universal:bool) (bound_constants:expr list) (body:expr) (weight:int option) (patterns:Pattern.pattern list) (nopatterns:expr list) (quantifier_id:Symbol.symbol option) (skolem_id:Symbol.symbol option) =
733    if universal then
734      mk_forall_const ctx bound_constants body weight patterns nopatterns quantifier_id skolem_id
735    else
736      mk_exists_const ctx bound_constants body weight patterns nopatterns quantifier_id skolem_id
737
738  let to_string x = Expr.to_string x
739end
740
741module Z3Array =
742struct
743  let mk_sort = Z3native.mk_array_sort
744  let is_store x = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_STORE
745  let is_select x = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SELECT
746  let is_constant_array x = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_CONST_ARRAY
747  let is_default_array x = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ARRAY_DEFAULT
748  let is_array_map x = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ARRAY_MAP
749  let is_as_array x = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_AS_ARRAY
750
751  let is_array x =
752    Z3native.is_app (Expr.gc x) x &&
753    sort_kind_of_int (Z3native.get_sort_kind (Expr.gc x) (Z3native.get_sort (Expr.gc x) x)) = ARRAY_SORT
754
755  let get_domain x = Z3native.get_array_sort_domain (Sort.gc x) x
756  let get_range x = Z3native.get_array_sort_range (Sort.gc x) x
757
758  let mk_const ctx name domain range = Expr.mk_const ctx name (mk_sort ctx domain range)
759
760  let mk_const_s ctx name domain range = mk_const ctx (Symbol.mk_string ctx name) domain range
761
762  let mk_select = Z3native.mk_select
763  let mk_store = Z3native.mk_store
764  let mk_const_array = Z3native.mk_const_array
765
766  let mk_map ctx f args =
767    Z3native.mk_map ctx f (List.length args) args
768
769  let mk_term_array = Z3native.mk_array_default
770  let mk_array_ext = Z3native.mk_array_ext
771end
772
773
774module Set =
775struct
776  let mk_sort = Z3native.mk_set_sort
777
778  let is_union (x:expr) = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SET_UNION
779  let is_intersect (x:expr) = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SET_INTERSECT
780  let is_difference (x:expr) = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SET_DIFFERENCE
781  let is_complement (x:expr) = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SET_COMPLEMENT
782  let is_subset (x:expr) = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SET_SUBSET
783
784  let mk_empty = Z3native.mk_empty_set
785  let mk_full = Z3native.mk_full_set
786  let mk_set_add = Z3native.mk_set_add
787  let mk_del = Z3native.mk_set_del
788  let mk_union ctx args =
789    Z3native.mk_set_union ctx (List.length args) args
790
791  let mk_intersection ctx args =
792    Z3native.mk_set_intersect ctx (List.length args) args
793
794  let mk_difference = Z3native.mk_set_difference
795  let mk_complement = Z3native.mk_set_complement
796  let mk_membership = Z3native.mk_set_member
797  let mk_subset = Z3native.mk_set_subset
798end
799
800
801module FiniteDomain =
802struct
803  let mk_sort = Z3native.mk_finite_domain_sort
804  let mk_sort_s ctx name size = mk_sort ctx (Symbol.mk_string ctx name) size
805
806  let is_finite_domain (x:expr) =
807    let nc = Expr.gc x in
808    Z3native.is_app nc x &&
809    sort_kind_of_int (Z3native.get_sort_kind nc (Z3native.get_sort nc x)) = FINITE_DOMAIN_SORT
810
811  let is_lt (x:expr) = AST.is_app x && FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FD_LT
812
813  let get_size x =
814    match Z3native.get_finite_domain_sort_size (Sort.gc x) x with
815    | true, v -> v
816    | false, _ -> raise (Error "Conversion failed.")
817end
818
819
820module Relation =
821struct
822  let is_relation x =
823    let nc = Expr.gc x in
824    Z3native.is_app nc x
825    && sort_kind_of_int (Z3native.get_sort_kind nc (Z3native.get_sort nc x)) = RELATION_SORT
826
827  let is_store (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_STORE)
828  let is_empty (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_EMPTY)
829  let is_is_empty (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_IS_EMPTY)
830  let is_join (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_JOIN)
831  let is_union (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_UNION)
832  let is_widen (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_WIDEN)
833  let is_project (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_PROJECT)
834  let is_filter (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_FILTER)
835  let is_negation_filter (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_NEGATION_FILTER)
836  let is_rename (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_RENAME)
837  let is_complement (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_COMPLEMENT)
838  let is_select (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_SELECT)
839  let is_clone (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_RA_CLONE)
840
841  let get_arity (x:Sort.sort) = Z3native.get_relation_arity (Sort.gc x) x
842
843  let get_column_sorts (x:Sort.sort) =
844    let n = get_arity x in
845    let f i = Z3native.get_relation_column (Sort.gc x) x i in
846    mk_list f n
847end
848
849
850module Datatype =
851struct
852  module Constructor =
853  struct
854    type constructor = Z3native.constructor
855
856    module FieldNumTable = Hashtbl.Make(struct
857        type t = AST.ast
858        let equal x y = AST.compare x y = 0
859        let hash = AST.hash
860      end)
861
862    let _field_nums = FieldNumTable.create 0
863
864    let create (ctx:context) (name:Symbol.symbol) (recognizer:Symbol.symbol) (field_names:Symbol.symbol list) (sorts:Sort.sort option list) (sort_refs:int list) =
865      let n = List.length field_names in
866      if n <> List.length sorts then
867        raise (Error "Number of field names does not match number of sorts")
868      else
869      if n <> List.length sort_refs then
870        raise (Error "Number of field names does not match number of sort refs")
871      else
872        let no = Z3native.mk_constructor ctx name
873            recognizer
874            n
875            field_names
876            (let f x = match x with None -> Z3native.mk_null_ast ctx | Some s -> s in
877             List.map f sorts)
878            sort_refs in
879        FieldNumTable.add _field_nums no n;
880        no
881
882    let get_num_fields (x:constructor) = FieldNumTable.find _field_nums x
883
884    let get_constructor_decl (x:constructor) =
885      let (a, _, _) = (Z3native.query_constructor (gc x) x (get_num_fields x)) in
886      a
887
888    let get_tester_decl (x:constructor) =
889      let (_, b, _) = (Z3native.query_constructor (gc x) x (get_num_fields x)) in
890      b
891
892    let get_accessor_decls (x:constructor) =
893      let (_, _, c) = (Z3native.query_constructor (gc x) x (get_num_fields x)) in
894      c
895  end
896
897  module ConstructorList =
898  struct
899    type constructor_list = Z3native.constructor_list
900
901    let create (ctx:context) (c:Constructor.constructor list) =
902      Z3native.mk_constructor_list ctx (List.length c) c
903  end
904
905  let mk_constructor (ctx:context) (name:Symbol.symbol) (recognizer:Symbol.symbol) (field_names:Symbol.symbol list) (sorts:Sort.sort option list) (sort_refs:int list) =
906    Constructor.create ctx name recognizer field_names sorts sort_refs
907
908  let mk_constructor_s (ctx:context) (name:string) (recognizer:Symbol.symbol) (field_names:Symbol.symbol list) (sorts:Sort.sort option list) (sort_refs:int list) =
909    mk_constructor ctx (Symbol.mk_string ctx name) recognizer field_names sorts sort_refs
910
911  let mk_sort (ctx:context) (name:Symbol.symbol) (constructors:Constructor.constructor list) =
912    let (x,_) = Z3native.mk_datatype ctx name (List.length constructors) constructors in
913    x
914
915  let mk_sort_s (ctx:context) (name:string) (constructors:Constructor.constructor list) =
916    mk_sort ctx (Symbol.mk_string ctx name) constructors
917
918  let mk_sorts (ctx:context) (names:Symbol.symbol list) (c:Constructor.constructor list list) =
919    let n = List.length names in
920    let f e = ConstructorList.create ctx e in
921    let cla = List.map f c in
922    let (r, _) = Z3native.mk_datatypes ctx n names cla in
923    r
924
925  let mk_sorts_s (ctx:context) (names:string list) (c:Constructor.constructor list list) =
926    mk_sorts ctx (List.map (fun x -> Symbol.mk_string ctx x) names) c
927
928  let get_num_constructors (x:Sort.sort) = Z3native.get_datatype_sort_num_constructors (Sort.gc x) x
929
930  let get_constructors (x:Sort.sort) =
931    let n = get_num_constructors x in
932    let f i = Z3native.get_datatype_sort_constructor (Sort.gc x) x i in
933    mk_list f n
934
935  let get_recognizers (x:Sort.sort) =
936    let n = (get_num_constructors x) in
937    let f i = Z3native.get_datatype_sort_recognizer (Sort.gc x) x i in
938    mk_list f n
939
940  let get_accessors (x:Sort.sort) =
941    let n = (get_num_constructors x) in
942    let f i = (
943      let fd = Z3native.get_datatype_sort_constructor (Sort.gc x) x i in
944      let ds = Z3native.get_domain_size (FuncDecl.gc fd) fd in
945      let g j = Z3native.get_datatype_sort_constructor_accessor (Sort.gc x) x i j in
946      mk_list g ds) in
947    mk_list f n
948end
949
950
951module Enumeration =
952struct
953  let mk_sort (ctx:context) (name:Symbol.symbol) (enum_names:Symbol.symbol list) =
954    let (a, _, _) = Z3native.mk_enumeration_sort ctx name (List.length enum_names) enum_names in
955    a
956
957  let mk_sort_s (ctx:context) (name:string) (enum_names:string list) =
958    mk_sort ctx (Symbol.mk_string ctx name) (Symbol.mk_strings ctx enum_names)
959
960  let get_const_decls (x:Sort.sort) =
961    let n = Z3native.get_datatype_sort_num_constructors (Sort.gc x) x  in
962    let f i = Z3native.get_datatype_sort_constructor (Sort.gc x) x i in
963    mk_list f n
964
965  let get_const_decl (x:Sort.sort) (inx:int) = Z3native.get_datatype_sort_constructor (Sort.gc x) x inx
966
967  let get_consts (x:Sort.sort) =
968    let n = Z3native.get_datatype_sort_num_constructors (Sort.gc x) x  in
969    let f i = Expr.mk_const_f (Sort.gc x) (get_const_decl x i) in
970    mk_list f n
971
972  let get_const (x:Sort.sort) (inx:int) = Expr.mk_const_f (Sort.gc x) (get_const_decl x inx)
973
974  let get_tester_decls (x:Sort.sort) =
975    let n = Z3native.get_datatype_sort_num_constructors (Sort.gc x) x  in
976    let f i = Z3native.get_datatype_sort_recognizer (Sort.gc x) x i in
977    mk_list f n
978
979  let get_tester_decl (x:Sort.sort) (inx:int) = Z3native.get_datatype_sort_recognizer (Sort.gc x) x inx
980end
981
982
983module Z3List =
984struct
985  let mk_sort (ctx:context) (name:Symbol.symbol) (elem_sort:Sort.sort) =
986    let (r, _, _, _, _, _, _) = Z3native.mk_list_sort ctx name elem_sort in
987    r
988
989  let mk_list_s (ctx:context) (name:string) elem_sort = mk_sort ctx (Symbol.mk_string ctx name) elem_sort
990  let get_nil_decl (x:Sort.sort) = Z3native.get_datatype_sort_constructor (Sort.gc x) x 0
991  let get_is_nil_decl (x:Sort.sort) = Z3native.get_datatype_sort_recognizer (Sort.gc x) x 0
992  let get_cons_decl (x:Sort.sort) = Z3native.get_datatype_sort_constructor (Sort.gc x) x 1
993  let get_is_cons_decl (x:Sort.sort) =Z3native.get_datatype_sort_recognizer (Sort.gc x) x 1
994  let get_head_decl (x:Sort.sort) = Z3native.get_datatype_sort_constructor_accessor (Sort.gc x) x 1 0
995  let get_tail_decl (x:Sort.sort) = Z3native.get_datatype_sort_constructor_accessor (Sort.gc x) x 1 1
996  let nil (x:Sort.sort) = expr_of_func_app (Sort.gc x) (get_nil_decl x) []
997end
998
999
1000module Tuple =
1001struct
1002  let mk_sort (ctx:context) (name:Symbol.symbol) (field_names:Symbol.symbol list) (field_sorts:Sort.sort list) =
1003    let (r, _, _) = Z3native.mk_tuple_sort ctx name (List.length field_names) field_names field_sorts in
1004    r
1005
1006  let get_mk_decl (x:Sort.sort) = Z3native.get_tuple_sort_mk_decl (Sort.gc x) x
1007  let get_num_fields (x:Sort.sort) = Z3native.get_tuple_sort_num_fields (Sort.gc x) x
1008
1009  let get_field_decls (x:Sort.sort) =
1010    let n = get_num_fields x in
1011    let f i =Z3native.get_tuple_sort_field_decl (Sort.gc x) x i in
1012    mk_list f n
1013end
1014
1015
1016module Arithmetic =
1017struct
1018  let is_int (x:expr) =
1019    ((sort_kind_of_int (Z3native.get_sort_kind (Expr.gc x) (Z3native.get_sort (Expr.gc x) x))) = INT_SORT)
1020
1021  let is_arithmetic_numeral (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ANUM)
1022  let is_le (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_LE)
1023  let is_ge (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_GE)
1024  let is_lt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_LT)
1025  let is_gt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_GT)
1026  let is_add (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ADD)
1027  let is_sub (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SUB)
1028  let is_uminus (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_UMINUS)
1029  let is_mul (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_MUL)
1030  let is_div (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_DIV)
1031  let is_idiv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_IDIV)
1032  let is_remainder (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_REM)
1033  let is_modulus (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_MOD)
1034  let is_int2real (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_TO_REAL)
1035  let is_real2int (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_TO_INT)
1036  let is_real_is_int (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_IS_INT)
1037  let is_real (x:expr) = ((sort_kind_of_int (Z3native.get_sort_kind (Expr.gc x) (Z3native.get_sort (Expr.gc x) x))) = REAL_SORT)
1038  let is_int_numeral (x:expr) = (Expr.is_numeral x) && (is_int x)
1039  let is_rat_numeral (x:expr) = (Expr.is_numeral x) && (is_real x)
1040  let is_algebraic_number (x:expr) = Z3native.is_algebraic_number (Expr.gc x) x
1041
1042  module Integer =
1043  struct
1044    let mk_sort = Z3native.mk_int_sort
1045
1046    let get_int x =
1047      match Z3native.get_numeral_int (Expr.gc x) x with
1048      | true, v -> v
1049      | false, _ -> raise (Error "Conversion failed.")
1050
1051    let get_big_int (x:expr) =
1052      if is_int_numeral x then
1053        let s = (Z3native.get_numeral_string (Expr.gc x) x) in
1054        Z.of_string s
1055      else
1056        raise (Error "Conversion failed.")
1057
1058    let numeral_to_string (x:expr) = Z3native.get_numeral_string (Expr.gc x) x
1059    let mk_const (ctx:context) (name:Symbol.symbol) = Expr.mk_const ctx name (mk_sort ctx)
1060    let mk_const_s (ctx:context) (name:string) = mk_const ctx (Symbol.mk_string ctx name)
1061    let mk_mod = Z3native.mk_mod
1062    let mk_rem = Z3native.mk_rem
1063    let mk_numeral_s (ctx:context) (v:string) = Z3native.mk_numeral ctx v (mk_sort ctx)
1064    let mk_numeral_i (ctx:context) (v:int) = mk_int_expr ctx v (mk_sort ctx)
1065    let mk_int2real = Z3native.mk_int2real
1066    let mk_int2bv = Z3native.mk_int2bv
1067  end
1068
1069  module Real =
1070  struct
1071    let mk_sort = Z3native.mk_real_sort
1072    let get_numerator x = Z3native.get_numerator (Expr.gc x) x
1073    let get_denominator x = Z3native.get_denominator (Expr.gc x) x
1074
1075    let get_ratio x =
1076      if is_rat_numeral x then
1077        let s = Z3native.get_numeral_string (Expr.gc x) x in
1078        Q.of_string s
1079      else
1080        raise (Error "Conversion failed.")
1081
1082    let to_decimal_string (x:expr) (precision:int) = Z3native.get_numeral_decimal_string (Expr.gc x) x precision
1083    let numeral_to_string (x:expr) = Z3native.get_numeral_string (Expr.gc x) x
1084    let mk_const (ctx:context) (name:Symbol.symbol) = Expr.mk_const ctx name (mk_sort ctx)
1085    let mk_const_s (ctx:context) (name:string) = mk_const ctx (Symbol.mk_string ctx name)
1086    let mk_numeral_nd (ctx:context) (num:int) (den:int) =
1087      if den = 0 then
1088        raise (Error "Denominator is zero")
1089      else if not (check_int32 num) || not (check_int32 den) then
1090        raise (Error "numerals don't fit in 32 bits")
1091      else
1092        Z3native.mk_real ctx num den
1093
1094    let mk_numeral_s (ctx:context) (v:string) = Z3native.mk_numeral ctx v (mk_sort ctx)
1095    let mk_numeral_i (ctx:context) (v:int) = mk_int_expr ctx v (mk_sort ctx)
1096    let mk_is_integer = Z3native.mk_is_int
1097    let mk_real2int = Z3native.mk_real2int
1098
1099    module AlgebraicNumber =
1100    struct
1101      let to_upper (x:expr) (precision:int) = Z3native.get_algebraic_number_upper (Expr.gc x) x precision
1102      let to_lower (x:expr) (precision:int) = Z3native.get_algebraic_number_lower (Expr.gc x) x precision
1103      let to_decimal_string (x:expr) (precision:int) = Z3native.get_numeral_decimal_string (Expr.gc x) x precision
1104      let numeral_to_string (x:expr) = Z3native.get_numeral_string (Expr.gc x) x
1105    end
1106  end
1107
1108  let mk_add (ctx:context) (t:expr list) =
1109    Z3native.mk_add ctx (List.length t) t
1110
1111  let mk_mul (ctx:context) (t:expr list) =
1112    Z3native.mk_mul ctx (List.length t) t
1113
1114  let mk_sub (ctx:context) (t:expr list) =
1115    Z3native.mk_sub ctx (List.length t) t
1116
1117  let mk_unary_minus = Z3native.mk_unary_minus
1118  let mk_div = Z3native.mk_div
1119  let mk_power = Z3native.mk_power
1120  let mk_lt = Z3native.mk_lt
1121  let mk_le = Z3native.mk_le
1122  let mk_gt = Z3native.mk_gt
1123  let mk_ge = Z3native.mk_ge
1124end
1125
1126
1127module BitVector =
1128struct
1129  let mk_sort (ctx:context) size = Z3native.mk_bv_sort ctx size
1130  let is_bv (x:expr) =
1131    ((sort_kind_of_int (Z3native.get_sort_kind (Expr.gc x) (Z3native.get_sort (Expr.gc x) x))) = BV_SORT)
1132  let is_bv_numeral (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BNUM)
1133  let is_bv_bit1 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BIT1)
1134  let is_bv_bit0 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BIT0)
1135  let is_bv_uminus (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BNEG)
1136  let is_bv_add (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BADD)
1137  let is_bv_sub (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSUB)
1138  let is_bv_mul (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BMUL)
1139  let is_bv_sdiv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSDIV)
1140  let is_bv_udiv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BUDIV)
1141  let is_bv_SRem (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSREM)
1142  let is_bv_urem (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BUREM)
1143  let is_bv_smod (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSMOD)
1144  let is_bv_sdiv0 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSDIV0)
1145  let is_bv_udiv0 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BUDIV0)
1146  let is_bv_srem0 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSREM0)
1147  let is_bv_urem0 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BUREM0)
1148  let is_bv_smod0 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSMOD0)
1149  let is_bv_ule (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ULEQ)
1150  let is_bv_sle (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SLEQ)
1151  let is_bv_uge (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_UGEQ)
1152  let is_bv_sge (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SGEQ)
1153  let is_bv_ult (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ULT)
1154  let is_bv_slt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SLT)
1155  let is_bv_ugt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_UGT)
1156  let is_bv_sgt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SGT)
1157  let is_bv_and (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BAND)
1158  let is_bv_or (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BOR)
1159  let is_bv_not (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BNOT)
1160  let is_bv_xor (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BXOR)
1161  let is_bv_nand (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BNAND)
1162  let is_bv_nor (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BNOR)
1163  let is_bv_xnor (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BXNOR)
1164  let is_bv_concat (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_CONCAT)
1165  let is_bv_signextension (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_SIGN_EXT)
1166  let is_bv_zeroextension (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ZERO_EXT)
1167  let is_bv_extract (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_EXTRACT)
1168  let is_bv_repeat (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_REPEAT)
1169  let is_bv_reduceor (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BREDOR)
1170  let is_bv_reduceand (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BREDAND)
1171  let is_bv_comp (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BCOMP)
1172  let is_bv_shiftleft (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BSHL)
1173  let is_bv_shiftrightlogical (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BLSHR)
1174  let is_bv_shiftrightarithmetic (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BASHR)
1175  let is_bv_rotateleft (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ROTATE_LEFT)
1176  let is_bv_rotateright (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_ROTATE_RIGHT)
1177  let is_bv_rotateleftextended (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_EXT_ROTATE_LEFT)
1178  let is_bv_rotaterightextended (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_EXT_ROTATE_RIGHT)
1179  let is_int2bv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_INT2BV)
1180  let is_bv2int (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_BV2INT)
1181  let is_bv_carry (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_CARRY)
1182  let is_bv_xor3 (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_XOR3)
1183  let get_size (x:Sort.sort) = Z3native.get_bv_sort_size (Sort.gc x) x
1184
1185  let numeral_to_string (x:expr) = Z3native.get_numeral_string (Expr.gc x) x
1186  let mk_const (ctx:context) (name:Symbol.symbol) (size:int) =
1187    Expr.mk_const ctx name (mk_sort ctx size)
1188  let mk_const_s (ctx:context) (name:string) (size:int) =
1189    mk_const ctx (Symbol.mk_string ctx name) size
1190  let mk_not = Z3native.mk_bvnot
1191  let mk_redand = Z3native.mk_bvredand
1192  let mk_redor = Z3native.mk_bvredor
1193  let mk_and = Z3native.mk_bvand
1194  let mk_or = Z3native.mk_bvor
1195  let mk_xor = Z3native.mk_bvxor
1196  let mk_nand = Z3native.mk_bvnand
1197  let mk_nor = Z3native.mk_bvnor
1198  let mk_xnor = Z3native.mk_bvxnor
1199  let mk_neg = Z3native.mk_bvneg
1200  let mk_add = Z3native.mk_bvadd
1201  let mk_sub = Z3native.mk_bvsub
1202  let mk_mul = Z3native.mk_bvmul
1203  let mk_udiv = Z3native.mk_bvudiv
1204  let mk_sdiv = Z3native.mk_bvsdiv
1205  let mk_urem = Z3native.mk_bvurem
1206  let mk_srem = Z3native.mk_bvsrem
1207  let mk_smod = Z3native.mk_bvsmod
1208  let mk_ult = Z3native.mk_bvult
1209  let mk_slt = Z3native.mk_bvslt
1210  let mk_ule = Z3native.mk_bvule
1211  let mk_sle = Z3native.mk_bvsle
1212  let mk_uge = Z3native.mk_bvuge
1213  let mk_sge = Z3native.mk_bvsge
1214  let mk_ugt = Z3native.mk_bvugt
1215  let mk_sgt = Z3native.mk_bvsgt
1216  let mk_concat = Z3native.mk_concat
1217  let mk_extract = Z3native.mk_extract
1218  let mk_sign_ext = Z3native.mk_sign_ext
1219  let mk_zero_ext = Z3native.mk_zero_ext
1220  let mk_repeat = Z3native.mk_repeat
1221  let mk_shl = Z3native.mk_bvshl
1222  let mk_lshr = Z3native.mk_bvlshr
1223  let mk_ashr = Z3native.mk_bvashr
1224  let mk_rotate_left = Z3native.mk_rotate_left
1225  let mk_rotate_right = Z3native.mk_rotate_right
1226  let mk_ext_rotate_left = Z3native.mk_ext_rotate_left
1227  let mk_ext_rotate_right = Z3native.mk_ext_rotate_right
1228  let mk_bv2int = Z3native.mk_bv2int
1229  let mk_add_no_overflow = Z3native.mk_bvadd_no_overflow
1230  let mk_add_no_underflow = Z3native.mk_bvadd_no_underflow
1231  let mk_sub_no_overflow = Z3native.mk_bvsub_no_overflow
1232  let mk_sub_no_underflow = Z3native.mk_bvsub_no_underflow
1233  let mk_sdiv_no_overflow = Z3native.mk_bvsdiv_no_overflow
1234  let mk_neg_no_overflow = Z3native.mk_bvneg_no_overflow
1235  let mk_mul_no_overflow = Z3native.mk_bvmul_no_overflow
1236  let mk_mul_no_underflow = Z3native.mk_bvmul_no_underflow
1237  let mk_numeral ctx v size = Z3native.mk_numeral ctx v (mk_sort ctx size)
1238end
1239
1240module Seq =
1241struct
1242  let mk_seq_sort  = Z3native.mk_seq_sort
1243  let is_seq_sort = Z3native.is_seq_sort
1244  let mk_re_sort = Z3native.mk_re_sort
1245  let is_re_sort = Z3native.is_re_sort
1246  let mk_string_sort = Z3native.mk_string_sort
1247  let is_string_sort = Z3native.is_string_sort
1248  let mk_string = Z3native.mk_string
1249  let is_string = Z3native.is_string
1250  let get_string = Z3native.get_string
1251  let mk_seq_empty = Z3native.mk_seq_empty
1252  let mk_seq_unit = Z3native.mk_seq_unit
1253  let mk_seq_concat ctx args = Z3native.mk_seq_concat ctx (List.length args) args
1254  let mk_seq_prefix = Z3native.mk_seq_prefix
1255  let mk_seq_suffix = Z3native.mk_seq_suffix
1256  let mk_seq_contains = Z3native.mk_seq_contains
1257  let mk_seq_extract = Z3native.mk_seq_extract
1258  let mk_seq_replace = Z3native.mk_seq_replace
1259  let mk_seq_at = Z3native.mk_seq_at
1260  let mk_seq_length = Z3native.mk_seq_length
1261  let mk_seq_index = Z3native.mk_seq_index
1262  let mk_str_to_int = Z3native.mk_str_to_int
1263  let mk_str_le = Z3native.mk_str_le
1264  let mk_str_lt = Z3native.mk_str_lt
1265  let mk_int_to_str = Z3native.mk_int_to_str
1266  let mk_seq_to_re = Z3native.mk_seq_to_re
1267  let mk_seq_in_re = Z3native.mk_seq_in_re
1268  let mk_re_plus = Z3native.mk_re_plus
1269  let mk_re_star = Z3native.mk_re_star
1270  let mk_re_option = Z3native.mk_re_option
1271  let mk_re_union ctx args = Z3native.mk_re_union ctx (List.length args) args
1272  let mk_re_concat ctx args = Z3native.mk_re_concat ctx (List.length args) args
1273  let mk_re_range = Z3native.mk_re_range
1274  let mk_re_loop = Z3native.mk_re_loop
1275  let mk_re_intersect ctx args = Z3native.mk_re_intersect ctx (List.length args) args
1276  let mk_re_complement = Z3native.mk_re_complement
1277  let mk_re_empty = Z3native.mk_re_empty
1278  let mk_re_full = Z3native.mk_re_full
1279end
1280
1281module FloatingPoint =
1282struct
1283  module RoundingMode =
1284  struct
1285    let mk_sort = Z3native.mk_fpa_rounding_mode_sort
1286    let is_fprm x = Sort.get_sort_kind (Expr.get_sort x) = ROUNDING_MODE_SORT
1287    let mk_round_nearest_ties_to_even = Z3native.mk_fpa_round_nearest_ties_to_even
1288    let mk_rne = Z3native.mk_fpa_rne
1289    let mk_round_nearest_ties_to_away = Z3native.mk_fpa_round_nearest_ties_to_away
1290    let mk_rna = Z3native.mk_fpa_rna
1291    let mk_round_toward_positive = Z3native.mk_fpa_round_toward_positive
1292    let mk_rtp = Z3native.mk_fpa_rtp
1293    let mk_round_toward_negative = Z3native.mk_fpa_round_toward_negative
1294    let mk_rtn = Z3native.mk_fpa_rtn
1295    let mk_round_toward_zero = Z3native.mk_fpa_round_toward_zero
1296    let mk_rtz = Z3native.mk_fpa_rtz
1297  end
1298
1299  let mk_sort = Z3native.mk_fpa_sort
1300  let mk_sort_half = Z3native.mk_fpa_sort_half
1301  let mk_sort_16 = Z3native.mk_fpa_sort_16
1302  let mk_sort_single = Z3native.mk_fpa_sort_single
1303  let mk_sort_32 = Z3native.mk_fpa_sort_32
1304  let mk_sort_double = Z3native.mk_fpa_sort_double
1305  let mk_sort_64 = Z3native.mk_fpa_sort_64
1306  let mk_sort_quadruple = Z3native.mk_fpa_sort_quadruple
1307  let mk_sort_128 = Z3native.mk_fpa_sort_128
1308
1309  let mk_nan = Z3native.mk_fpa_nan
1310  let mk_inf = Z3native.mk_fpa_inf
1311  let mk_zero = Z3native.mk_fpa_zero
1312  let mk_fp = Z3native.mk_fpa_fp
1313  let mk_numeral_f = Z3native.mk_fpa_numeral_double
1314  let mk_numeral_i = Z3native.mk_fpa_numeral_int
1315  let mk_numeral_i_u = Z3native.mk_fpa_numeral_int64_uint64
1316  let mk_numeral_s = Z3native.mk_numeral
1317
1318  let is_fp (x:expr) = (Sort.get_sort_kind (Expr.get_sort x)) = FLOATING_POINT_SORT
1319  let is_abs (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_ABS)
1320  let is_neg (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_NEG)
1321  let is_add (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_ADD)
1322  let is_sub (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_SUB)
1323  let is_mul (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_MUL)
1324  let is_div (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_DIV)
1325  let is_fma (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_FMA)
1326  let is_sqrt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_SQRT)
1327  let is_rem (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_REM)
1328  let is_round_to_integral (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_ROUND_TO_INTEGRAL)
1329  let is_min (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_MIN)
1330  let is_max (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_MAX)
1331  let is_leq (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_LE)
1332  let is_lt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_LT)
1333  let is_geq (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_GE)
1334  let is_gt (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_GT)
1335  let is_eq (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_EQ)
1336  let is_is_normal (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_NORMAL)
1337  let is_is_subnormal (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_SUBNORMAL)
1338  let is_is_zero (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_ZERO)
1339  let is_is_infinite (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_INF)
1340  let is_is_nan (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_NAN)
1341  let is_is_negative (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_NEGATIVE)
1342  let is_is_positive (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_IS_POSITIVE)
1343  let is_to_fp (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_TO_FP)
1344  let is_to_fp_unsigned (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_TO_FP_UNSIGNED)
1345  let is_to_ubv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_TO_UBV)
1346  let is_to_sbv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_TO_SBV)
1347  let is_to_real (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_TO_REAL)
1348  let is_to_ieee_bv (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_FPA_TO_IEEE_BV)
1349
1350  let numeral_to_string (x:expr) = Z3native.get_numeral_string (Expr.gc x) x
1351
1352  let mk_const = Expr.mk_const
1353  let mk_const_s = Expr.mk_const_s
1354
1355  let mk_abs = Z3native.mk_fpa_abs
1356  let mk_neg = Z3native.mk_fpa_neg
1357  let mk_add = Z3native.mk_fpa_add
1358  let mk_sub = Z3native.mk_fpa_sub
1359  let mk_mul = Z3native.mk_fpa_mul
1360  let mk_div = Z3native.mk_fpa_div
1361  let mk_fma = Z3native.mk_fpa_fma
1362  let mk_sqrt = Z3native.mk_fpa_sqrt
1363  let mk_rem = Z3native.mk_fpa_rem
1364  let mk_round_to_integral = Z3native.mk_fpa_round_to_integral
1365  let mk_min = Z3native.mk_fpa_min
1366  let mk_max = Z3native.mk_fpa_max
1367  let mk_leq = Z3native.mk_fpa_leq
1368  let mk_lt = Z3native.mk_fpa_lt
1369  let mk_geq = Z3native.mk_fpa_geq
1370  let mk_gt = Z3native.mk_fpa_gt
1371  let mk_eq = Z3native.mk_fpa_eq
1372  let mk_is_normal = Z3native.mk_fpa_is_normal
1373  let mk_is_subnormal = Z3native.mk_fpa_is_subnormal
1374  let mk_is_zero = Z3native.mk_fpa_is_zero
1375  let mk_is_infinite = Z3native.mk_fpa_is_infinite
1376  let mk_is_nan = Z3native.mk_fpa_is_nan
1377  let mk_is_negative = Z3native.mk_fpa_is_negative
1378  let mk_is_positive = Z3native.mk_fpa_is_positive
1379  let mk_to_fp_bv = Z3native.mk_fpa_to_fp_bv
1380  let mk_to_fp_float = Z3native.mk_fpa_to_fp_float
1381  let mk_to_fp_real = Z3native.mk_fpa_to_fp_real
1382  let mk_to_fp_signed = Z3native.mk_fpa_to_fp_signed
1383  let mk_to_fp_unsigned = Z3native.mk_fpa_to_fp_unsigned
1384  let mk_to_ubv = Z3native.mk_fpa_to_ubv
1385  let mk_to_sbv = Z3native.mk_fpa_to_sbv
1386  let mk_to_real = Z3native.mk_fpa_to_real
1387  let get_ebits = Z3native.fpa_get_ebits
1388  let get_sbits = Z3native.fpa_get_sbits
1389  let get_numeral_sign = Z3native.fpa_get_numeral_sign
1390  let get_numeral_sign_bv = Z3native.fpa_get_numeral_sign_bv
1391  let get_numeral_exponent_string = Z3native.fpa_get_numeral_exponent_string
1392  let get_numeral_exponent_int = Z3native.fpa_get_numeral_exponent_int64
1393  let get_numeral_exponent_bv = Z3native.fpa_get_numeral_exponent_bv
1394  let get_numeral_significand_string = Z3native.fpa_get_numeral_significand_string
1395  let get_numeral_significand_uint = Z3native.fpa_get_numeral_significand_uint64
1396  let get_numeral_significand_bv = Z3native.fpa_get_numeral_significand_bv
1397  let is_numeral_nan = Z3native.fpa_is_numeral_nan
1398  let is_numeral_inf = Z3native.fpa_is_numeral_inf
1399  let is_numeral_zero = Z3native.fpa_is_numeral_zero
1400  let is_numeral_normal = Z3native.fpa_is_numeral_normal
1401  let is_numeral_subnormal = Z3native.fpa_is_numeral_subnormal
1402  let is_numeral_positive = Z3native.fpa_is_numeral_positive
1403  let is_numeral_negative = Z3native.fpa_is_numeral_negative
1404  let mk_to_ieee_bv = Z3native.mk_fpa_to_ieee_bv
1405  let mk_to_fp_int_real = Z3native.mk_fpa_to_fp_int_real
1406  let numeral_to_string x = Z3native.get_numeral_string (Expr.gc x) x
1407end
1408
1409
1410module Proof =
1411struct
1412  let is_true (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_TRUE)
1413  let is_asserted (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_ASSERTED)
1414  let is_goal (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_GOAL)
1415  let is_oeq (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_OEQ)
1416  let is_modus_ponens (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_MODUS_PONENS)
1417  let is_reflexivity (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_REFLEXIVITY)
1418  let is_symmetry (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_SYMMETRY)
1419  let is_transitivity (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_TRANSITIVITY)
1420  let is_Transitivity_star (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_TRANSITIVITY_STAR)
1421  let is_monotonicity (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_MONOTONICITY)
1422  let is_quant_intro (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_QUANT_INTRO)
1423  let is_distributivity (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_DISTRIBUTIVITY)
1424  let is_and_elimination (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_AND_ELIM)
1425  let is_or_elimination (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_NOT_OR_ELIM)
1426  let is_rewrite (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_REWRITE)
1427  let is_rewrite_star (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_REWRITE_STAR)
1428  let is_pull_quant (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_PULL_QUANT)
1429  let is_push_quant (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_PUSH_QUANT)
1430  let is_elim_unused_vars (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_ELIM_UNUSED_VARS)
1431  let is_der (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_DER)
1432  let is_quant_inst (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_QUANT_INST)
1433  let is_hypothesis (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_HYPOTHESIS)
1434  let is_lemma (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_LEMMA)
1435  let is_unit_resolution (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_UNIT_RESOLUTION)
1436  let is_iff_true (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_IFF_TRUE)
1437  let is_iff_false (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_IFF_FALSE)
1438  let is_commutativity (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_COMMUTATIVITY) (*  *)
1439  let is_def_axiom (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_DEF_AXIOM)
1440  let is_def_intro (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_DEF_INTRO)
1441  let is_apply_def (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_APPLY_DEF)
1442  let is_iff_oeq (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_IFF_OEQ)
1443  let is_nnf_pos (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_NNF_POS)
1444  let is_nnf_neg (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_NNF_NEG)
1445  let is_skolemize (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_SKOLEMIZE)
1446  let is_modus_ponens_oeq (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_MODUS_PONENS_OEQ)
1447  let is_theory_lemma (x:expr) = (AST.is_app x) && (FuncDecl.get_decl_kind (Expr.get_func_decl x) = OP_PR_TH_LEMMA)
1448end
1449
1450
1451module Goal =
1452struct
1453  type goal = Z3native.goal
1454  let gc = Z3native.context_of_goal
1455
1456  let get_precision (x:goal) = goal_prec_of_int (Z3native.goal_precision (gc x) x)
1457  let is_precise (x:goal) = (get_precision x) = GOAL_PRECISE
1458  let is_underapproximation (x:goal) = (get_precision x) = GOAL_UNDER
1459  let is_overapproximation (x:goal) = (get_precision x) = GOAL_OVER
1460  let is_garbage (x:goal) = (get_precision x) = GOAL_UNDER_OVER
1461
1462  let add x constraints =
1463    List.iter (Z3native.goal_assert (gc x) x) constraints
1464
1465  let is_inconsistent (x:goal) = Z3native.goal_inconsistent (gc x) x
1466  let get_depth (x:goal) = Z3native.goal_depth (gc x) x
1467  let reset (x:goal) =  Z3native.goal_reset (gc x) x
1468  let get_size (x:goal) = Z3native.goal_size (gc x) x
1469
1470  let get_formulas (x:goal) =
1471    let n = get_size x in
1472    let f i = Z3native.goal_formula (gc x) x i in
1473    mk_list f n
1474
1475  let get_num_exprs (x:goal) = Z3native.goal_num_exprs (gc x) x
1476  let is_decided_sat (x:goal) = Z3native.goal_is_decided_sat (gc x) x
1477  let is_decided_unsat (x:goal) = Z3native.goal_is_decided_unsat (gc x) x
1478  let translate (x:goal) (to_ctx:context) = Z3native.goal_translate (gc x) x to_ctx
1479
1480  let simplify (x:goal) (p:Params.params option) =
1481    let tn = Z3native.mk_tactic (gc x) "simplify" in
1482    Z3native.tactic_inc_ref (gc x) tn;
1483    let arn = match p with
1484      | None -> Z3native.tactic_apply (gc x) tn x
1485      | Some pn -> Z3native.tactic_apply_ex (gc x) tn x pn
1486    in
1487    Z3native.apply_result_inc_ref (gc x) arn;
1488    let sg = Z3native.apply_result_get_num_subgoals (gc x) arn in
1489    let res = if sg = 0 then
1490        raise (Error "No subgoals")
1491      else
1492        Z3native.apply_result_get_subgoal (gc x) arn 0 in
1493    Z3native.apply_result_dec_ref (gc x) arn;
1494    Z3native.tactic_dec_ref (gc x) tn;
1495    res
1496
1497  let mk_goal = Z3native.mk_goal
1498
1499  let to_string (x:goal) = Z3native.goal_to_string (gc x) x
1500
1501  let as_expr (x:goal) =
1502    match get_size x with
1503    | 0 -> Boolean.mk_true (gc x)
1504    | 1 -> List.hd (get_formulas x)
1505    | _ -> Boolean.mk_and (gc x) (get_formulas x)
1506end
1507
1508
1509module Model =
1510struct
1511  type model = Z3native.model
1512  let gc = Z3native.context_of_model
1513
1514  module FuncInterp =
1515  struct
1516    type func_interp = Z3native.func_interp
1517    let gc = Z3native.context_of_func_interp
1518
1519    module FuncEntry =
1520    struct
1521      type func_entry = Z3native.func_entry
1522      let gc = Z3native.context_of_func_entry
1523
1524      let get_value (x:func_entry) = Z3native.func_entry_get_value (gc x) x
1525      let get_num_args (x:func_entry) = Z3native.func_entry_get_num_args (gc x) x
1526
1527      let get_args (x:func_entry) =
1528        let n = get_num_args x in
1529        let f i = Z3native.func_entry_get_arg (gc x) x i in
1530        mk_list f n
1531
1532      let to_string (x:func_entry) =
1533        let a = get_args x in
1534        let f c p = (p ^ (Expr.to_string c) ^ ", ") in
1535        "[" ^ List.fold_right f a ((Expr.to_string (get_value x)) ^ "]")
1536    end
1537
1538    let get_num_entries (x:func_interp) = Z3native.func_interp_get_num_entries (gc x) x
1539
1540    let get_entries (x:func_interp) =
1541      let n = get_num_entries x in
1542      let f i = Z3native.func_interp_get_entry (gc x) x i in
1543      mk_list f n
1544
1545    let get_else (x:func_interp) = Z3native.func_interp_get_else (gc x) x
1546
1547    let get_arity (x:func_interp) = Z3native.func_interp_get_arity (gc x) x
1548
1549    let to_string (x:func_interp) =
1550      let f c p = (
1551        let n = FuncEntry.get_num_args c in
1552        p ^
1553        let g c p = (p ^ (Expr.to_string c) ^ ", ") in
1554        (if n > 1 then "[" else "") ^
1555        (List.fold_right
1556           g
1557           (FuncEntry.get_args c)
1558           ((if n > 1 then "]" else "") ^ " -> " ^ (Expr.to_string (FuncEntry.get_value c)) ^ ", "))) in
1559      List.fold_right f (get_entries x) ("else -> " ^ (Expr.to_string (get_else x)) ^ "]")
1560  end
1561
1562  let get_const_interp (x:model) (f:func_decl) =
1563    if FuncDecl.get_arity f <> 0 then
1564      raise (Error "Non-zero arity functions have FunctionInterpretations as a model. Use FuncInterp.")
1565    else
1566      let np = Z3native.model_get_const_interp (gc x) x f  in
1567      if Z3native.is_null_ast np then
1568        None
1569      else
1570        Some np
1571
1572  let get_const_interp_e (x:model) (a:expr) = get_const_interp x (Expr.get_func_decl a)
1573
1574  let rec get_func_interp (x:model) (f:func_decl) =
1575    let sk = sort_kind_of_int (Z3native.get_sort_kind (gc x) (Z3native.get_range (FuncDecl.gc f) f)) in
1576    if FuncDecl.get_arity f = 0 then
1577      let n = Z3native.model_get_const_interp (gc x) x f in
1578      if Z3native.is_null_ast n then
1579        None
1580      else
1581        match sk with
1582        | ARRAY_SORT ->
1583          if not (Z3native.is_as_array (gc x) n) then
1584            raise (Error "Argument was not an array constant")
1585          else
1586            let fd = Z3native.get_as_array_func_decl (gc x) n in
1587            get_func_interp x fd
1588        | _ -> raise (Error "Constant functions do not have a function interpretation; use ConstInterp");
1589    else
1590      let n = Z3native.model_get_func_interp (gc x) x f in
1591      if Z3native.is_null_func_interp n then None else Some n
1592
1593  (** The number of constants that have an interpretation in the model. *)
1594  let get_num_consts (x:model) = Z3native.model_get_num_consts (gc x) x
1595
1596  let get_const_decls (x:model) =
1597    let n = (get_num_consts x) in
1598    let f i = Z3native.model_get_const_decl (gc x) x i in
1599    mk_list f n
1600
1601  let get_num_funcs (x:model) = Z3native.model_get_num_funcs (gc x) x
1602
1603  let get_func_decls (x:model) =
1604    let n = (get_num_funcs x) in
1605    let f i = Z3native.model_get_func_decl (gc x) x i in
1606    mk_list f n
1607
1608  let get_decls (x:model) =
1609    let n_funcs = get_num_funcs x in
1610    let n_consts = get_num_consts x in
1611    let f i = Z3native.model_get_func_decl (gc x) x i in
1612    let g i = Z3native.model_get_const_decl (gc x) x i in
1613    (mk_list f n_funcs) @ (mk_list g n_consts)
1614
1615  let eval (x:model) (t:expr) (completion:bool) =
1616    match Z3native.model_eval (gc x) x t completion with
1617    | (false, _) -> None
1618    | (true, v) -> Some v
1619
1620  let evaluate = eval
1621  let get_num_sorts (x:model) = Z3native.model_get_num_sorts (gc x) x
1622
1623  let get_sorts (x:model) =
1624    let n = get_num_sorts x in
1625    let f i = Z3native.model_get_sort (gc x) x i in
1626    mk_list f n
1627
1628  let sort_universe (x:model) (s:Sort.sort) =
1629    let av = Z3native.model_get_sort_universe (gc x) x s in
1630    AST.ASTVector.to_expr_list av
1631
1632  let to_string (x:model) = Z3native.model_to_string (gc x) x
1633end
1634
1635
1636module Probe =
1637struct
1638  type probe = Z3native.probe
1639
1640  let apply (x:probe) (g:Goal.goal) = Z3native.probe_apply (gc x) x g
1641  let get_num_probes = Z3native.get_num_probes
1642
1643  let get_probe_names (ctx:context) =
1644    let n = get_num_probes ctx in
1645    let f i = Z3native.get_probe_name ctx i in
1646    mk_list f n
1647
1648  let get_probe_description = Z3native.probe_get_descr
1649  let mk_probe = Z3native.mk_probe
1650  let const = Z3native.probe_const
1651  let lt = Z3native.probe_lt
1652  let gt = Z3native.probe_gt
1653  let le = Z3native.probe_le
1654  let ge = Z3native.probe_ge
1655  let eq = Z3native.probe_eq
1656  let and_ = Z3native.probe_and
1657  let or_ = Z3native.probe_or
1658  let not_ = Z3native.probe_not
1659end
1660
1661
1662module Tactic =
1663struct
1664  type tactic = Z3native.tactic
1665  let gc = Z3native.context_of_tactic
1666
1667  module ApplyResult =
1668  struct
1669    type apply_result = Z3native.apply_result
1670    let gc = Z3native.context_of_apply_result
1671
1672    let get_num_subgoals (x:apply_result) = Z3native.apply_result_get_num_subgoals (gc x) x
1673
1674    let get_subgoals (x:apply_result) =
1675      let n = get_num_subgoals x in
1676      let f i = Z3native.apply_result_get_subgoal (gc x) x i in
1677      mk_list f n
1678
1679    let get_subgoal (x:apply_result) (i:int) = Z3native.apply_result_get_subgoal (gc x) x i
1680    let to_string (x:apply_result) = Z3native.apply_result_to_string (gc x) x
1681  end
1682
1683  let get_help (x:tactic) = Z3native.tactic_get_help (gc x) x
1684  let get_param_descrs (x:tactic) = Z3native.tactic_get_param_descrs (gc x) x
1685
1686  let apply (x:tactic) (g:Goal.goal) (p:Params.params option) =
1687    match p with
1688    | None -> Z3native.tactic_apply (gc x) x g
1689    | Some pn -> Z3native.tactic_apply_ex (gc x) x g pn
1690
1691  let get_num_tactics = Z3native.get_num_tactics
1692
1693  let get_tactic_names (ctx:context) =
1694    let n = get_num_tactics ctx in
1695    let f i = Z3native.get_tactic_name ctx i in
1696    mk_list f n
1697
1698  let get_tactic_description = Z3native.tactic_get_descr
1699  let mk_tactic = Z3native.mk_tactic
1700
1701  let and_then (ctx:context) (t1:tactic) (t2:tactic) (ts:tactic list) =
1702    let f p c = (match p with
1703        | None -> Some c
1704        | Some(x) -> Some (Z3native.tactic_and_then ctx c x)) in
1705    match (List.fold_left f None ts) with
1706    | None -> Z3native.tactic_and_then ctx t1 t2
1707    | Some(x) -> let o = Z3native.tactic_and_then ctx t2 x in
1708      Z3native.tactic_and_then ctx t1 o
1709
1710  let or_else = Z3native.tactic_or_else
1711  let try_for = Z3native.tactic_try_for
1712  let when_ = Z3native.tactic_when
1713  let cond = Z3native.tactic_cond
1714  let repeat = Z3native.tactic_repeat
1715  let skip = Z3native.tactic_skip
1716  let fail = Z3native.tactic_fail
1717  let fail_if = Z3native.tactic_fail_if
1718  let fail_if_not_decided = Z3native.tactic_fail_if_not_decided
1719  let using_params = Z3native.tactic_using_params
1720  let with_ = using_params
1721  let par_or (ctx:context) (t:tactic list) = Z3native.tactic_par_or ctx (List.length t) t
1722  let par_and_then = Z3native.tactic_par_and_then
1723  let interrupt = Z3native.interrupt
1724end
1725
1726
1727module Statistics =
1728struct
1729  type statistics = Z3native.stats
1730  let gc = Z3native.context_of_stats
1731
1732  module Entry =
1733  struct
1734    type statistics_entry = {
1735      m_key:string;
1736      m_is_int:bool;
1737      m_is_float:bool;
1738      m_int:int;
1739      m_float:float }
1740
1741    let create_si k v =
1742      { m_key = k; m_is_int = true; m_is_float = false; m_int = v; m_float = 0.0 }
1743
1744    let create_sd k v =
1745      { m_key = k; m_is_int = false; m_is_float = true; m_int = 0; m_float = v }
1746
1747    let get_key (x:statistics_entry) = x.m_key
1748    let get_int (x:statistics_entry) = x.m_int
1749    let get_float (x:statistics_entry) = x.m_float
1750    let is_int (x:statistics_entry) = x.m_is_int
1751    let is_float (x:statistics_entry) = x.m_is_float
1752    let to_string_value (x:statistics_entry) =
1753      if is_int x then
1754        string_of_int (get_int x)
1755      else if is_float x then
1756        string_of_float (get_float x)
1757      else
1758        raise (Error "Unknown statistical entry type")
1759    let to_string (x:statistics_entry) = (get_key x) ^ ": " ^ (to_string_value x)
1760  end
1761
1762  let to_string (x:statistics) = Z3native.stats_to_string (gc x) x
1763  let get_size (x:statistics) = Z3native.stats_size (gc x) x
1764
1765  let get_entries (x:statistics) =
1766    let n = get_size x in
1767    let f i =
1768      let k = Z3native.stats_get_key (gc x) x i in
1769      if Z3native.stats_is_uint (gc x) x i then
1770        Entry.create_si k (Z3native.stats_get_uint_value (gc x) x i)
1771      else
1772        Entry.create_sd k (Z3native.stats_get_double_value (gc x) x i)
1773    in
1774    mk_list f n
1775
1776  let get_keys (x:statistics) =
1777    let n = get_size x in
1778    let f i = Z3native.stats_get_key (gc x) x i in
1779    mk_list f n
1780
1781  let get (x:statistics) (key:string) =
1782    try Some(List.find (fun c -> Entry.get_key c = key) (get_entries x)) with
1783    | Not_found -> None
1784end
1785
1786
1787module Solver =
1788struct
1789  type solver = Z3native.solver
1790  type status = UNSATISFIABLE | UNKNOWN | SATISFIABLE
1791  let gc = Z3native.context_of_solver
1792
1793  let string_of_status (s:status) = match s with
1794    | UNSATISFIABLE -> "unsatisfiable"
1795    | SATISFIABLE -> "satisfiable"
1796    | _ -> "unknown"
1797
1798  let get_help (x:solver) = Z3native.solver_get_help (gc x) x
1799  let set_parameters (x:solver) (p:Params.params) = Z3native.solver_set_params (gc x) x p
1800  let get_param_descrs (x:solver) = Z3native.solver_get_param_descrs (gc x) x
1801  let get_num_scopes (x:solver) = Z3native.solver_get_num_scopes (gc x) x
1802  let push (x:solver) = Z3native.solver_push (gc x) x
1803  let pop (x:solver) (n:int) = Z3native.solver_pop (gc x) x n
1804  let reset (x:solver) = Z3native.solver_reset (gc x) x
1805
1806  let add x constraints =
1807    List.iter (Z3native.solver_assert (gc x) x) constraints
1808
1809  let assert_and_track_l x cs ps =
1810    try List.iter2 (Z3native.solver_assert_and_track (gc x) x) cs ps with
1811    | Invalid_argument _ -> raise (Error "Argument size mismatch")
1812
1813  let assert_and_track x = Z3native.solver_assert_and_track (gc x) x
1814
1815  let get_num_assertions x =
1816    let a = Z3native.solver_get_assertions (gc x) x in
1817    AST.ASTVector.get_size a
1818
1819  let get_assertions x =
1820    let av = Z3native.solver_get_assertions (gc x) x in
1821    AST.ASTVector.to_expr_list av
1822
1823  let check (x:solver) (assumptions:expr list) =
1824    let result =
1825      match assumptions with
1826      | [] -> Z3native.solver_check (gc x) x
1827      | _::_ ->
1828        Z3native.solver_check_assumptions (gc x) x (List.length assumptions) assumptions
1829    in
1830    match lbool_of_int result with
1831    | L_TRUE -> SATISFIABLE
1832    | L_FALSE -> UNSATISFIABLE
1833    | _ -> UNKNOWN
1834
1835  let get_model x =
1836    try
1837       let q = Z3native.solver_get_model (gc x) x in
1838       if Z3native.is_null_model q then None else Some q
1839    with | _ -> None
1840
1841  let get_proof x =
1842    let q = Z3native.solver_get_proof (gc x) x in
1843    if Z3native.is_null_ast q then None else Some q
1844
1845  let get_unsat_core x =
1846    let av = Z3native.solver_get_unsat_core (gc x) x in
1847    AST.ASTVector.to_expr_list av
1848
1849  let get_reason_unknown x =  Z3native.solver_get_reason_unknown (gc x) x
1850  let get_statistics x = Z3native.solver_get_statistics (gc x) x
1851
1852  let mk_solver ctx logic =
1853    match logic with
1854    | None -> Z3native.mk_solver ctx
1855    | Some x -> Z3native.mk_solver_for_logic ctx x
1856
1857  let mk_solver_s ctx logic = mk_solver ctx (Some (Symbol.mk_string ctx logic))
1858  let mk_simple_solver = Z3native.mk_simple_solver
1859  let mk_solver_t = Z3native.mk_solver_from_tactic
1860  let translate x = Z3native.solver_translate (gc x) x
1861  let to_string x = Z3native.solver_to_string (gc x) x
1862end
1863
1864
1865module Fixedpoint =
1866struct
1867  type fixedpoint = Z3native.fixedpoint
1868  let gc = Z3native.context_of_fixedpoint
1869
1870  let get_help x = Z3native.fixedpoint_get_help (gc x) x
1871  let set_parameters x = Z3native.fixedpoint_set_params (gc x) x
1872  let get_param_descrs x = Z3native.fixedpoint_get_param_descrs (gc x) x
1873
1874  let add x constraints =
1875    List.iter (Z3native.fixedpoint_assert (gc x) x) constraints
1876
1877  let register_relation x = Z3native.fixedpoint_register_relation (gc x) x
1878
1879  let add_rule (x:fixedpoint) (rule:expr) (name:Symbol.symbol option) =
1880    match name with
1881    | None -> Z3native.fixedpoint_add_rule (gc x) x rule (Z3native.mk_null_symbol (gc x))
1882    | Some y -> Z3native.fixedpoint_add_rule (gc x) x rule y
1883
1884  let add_fact (x:fixedpoint) (pred:func_decl) (args:int list) =
1885    Z3native.fixedpoint_add_fact (gc x) x pred (List.length args) args
1886
1887  let query (x:fixedpoint) (query:expr) =
1888    match lbool_of_int (Z3native.fixedpoint_query (gc x) x query) with
1889    | L_TRUE -> Solver.SATISFIABLE
1890    | L_FALSE -> Solver.UNSATISFIABLE
1891    | _ -> Solver.UNKNOWN
1892
1893  let query_r (x:fixedpoint) (relations:func_decl list) =
1894    match lbool_of_int (Z3native.fixedpoint_query_relations (gc x) x (List.length relations) relations) with
1895    | L_TRUE -> Solver.SATISFIABLE
1896    | L_FALSE -> Solver.UNSATISFIABLE
1897    | _ -> Solver.UNKNOWN
1898
1899  let update_rule x = Z3native.fixedpoint_update_rule (gc x) x
1900
1901  let get_answer x =
1902    let q = Z3native.fixedpoint_get_answer (gc x) x in
1903    if Z3native.is_null_ast q then None else Some q
1904
1905  let get_reason_unknown x = Z3native.fixedpoint_get_reason_unknown (gc x) x
1906  let get_num_levels x = Z3native.fixedpoint_get_num_levels (gc x) x
1907
1908  let get_cover_delta (x:fixedpoint) (level:int) (predicate:func_decl) =
1909    let q = Z3native.fixedpoint_get_cover_delta (gc x) x level predicate in
1910    if Z3native.is_null_ast q then None else Some q
1911
1912  let add_cover (x:fixedpoint) (level:int) (predicate:func_decl) (property:expr) =
1913    Z3native.fixedpoint_add_cover (gc x) x level predicate property
1914
1915  let to_string (x:fixedpoint) = Z3native.fixedpoint_to_string (gc x) x 0 []
1916
1917  let set_predicate_representation (x:fixedpoint) (f:func_decl) (kinds:Symbol.symbol list) =
1918    Z3native.fixedpoint_set_predicate_representation (gc x) x f (List.length kinds) kinds
1919
1920  let to_string_q (x:fixedpoint) (queries:expr list) =
1921    Z3native.fixedpoint_to_string (gc x) x (List.length queries) queries
1922
1923  let get_rules (x:fixedpoint) =
1924    let av = Z3native.fixedpoint_get_rules (gc x) x in
1925    AST.ASTVector.to_expr_list av
1926
1927  let get_assertions (x:fixedpoint) =
1928    let av = Z3native.fixedpoint_get_assertions (gc x) x in
1929    (AST.ASTVector.to_expr_list av)
1930
1931  let mk_fixedpoint (ctx:context) = Z3native.mk_fixedpoint ctx
1932  let get_statistics (x:fixedpoint) = Z3native.fixedpoint_get_statistics (gc x) x
1933
1934  let parse_string (x:fixedpoint) (s:string) =
1935    let av = Z3native.fixedpoint_from_string (gc x) x s in
1936    AST.ASTVector.to_expr_list av
1937
1938  let parse_file (x:fixedpoint) (filename:string) =
1939    let av = Z3native.fixedpoint_from_file (gc x) x filename in
1940    AST.ASTVector.to_expr_list av
1941end
1942
1943
1944module Optimize =
1945struct
1946  type optimize = Z3native.optimize
1947  type handle = { opt:optimize; h:int }
1948
1949  let mk_handle opt h = { opt; h }
1950
1951  let mk_opt (ctx:context) = Z3native.mk_optimize ctx
1952  let get_help (x:optimize) = Z3native.optimize_get_help (gc x) x
1953  let set_parameters (x:optimize) (p:Params.params) = Z3native.optimize_set_params (gc x) x p
1954  let get_param_descrs (x:optimize) = Z3native.optimize_get_param_descrs (gc x) x
1955
1956  let add x constraints =
1957    List.iter (Z3native.optimize_assert (gc x) x) constraints
1958
1959  let add_soft (x:optimize) (e:Expr.expr) (w:string) (s:Symbol.symbol) =
1960    mk_handle x (Z3native.optimize_assert_soft (gc x) x e w s)
1961
1962  let maximize (x:optimize) (e:Expr.expr) = mk_handle x (Z3native.optimize_maximize (gc x) x e)
1963  let minimize (x:optimize) (e:Expr.expr) = mk_handle x (Z3native.optimize_minimize (gc x) x e)
1964
1965  let check (x:optimize) =
1966    let r = lbool_of_int (Z3native.optimize_check (gc x) x 0 []) in
1967    match r with
1968    | L_TRUE -> Solver.SATISFIABLE
1969    | L_FALSE -> Solver.UNSATISFIABLE
1970    | _ -> Solver.UNKNOWN
1971
1972  let get_model (x:optimize) =
1973    try
1974      let q = Z3native.optimize_get_model (gc x) x in
1975      if Z3native.is_null_model q then None else Some q
1976    with | _ -> None
1977
1978  let get_lower (x:handle) = Z3native.optimize_get_lower (gc x.opt) x.opt x.h
1979  let get_upper (x:handle) = Z3native.optimize_get_upper (gc x.opt) x.opt x.h
1980  let push (x:optimize) = Z3native.optimize_push (gc x) x
1981  let pop (x:optimize) = Z3native.optimize_pop (gc x) x
1982  let get_reason_unknown (x:optimize) = Z3native.optimize_get_reason_unknown (gc x) x
1983  let to_string (x:optimize) = Z3native.optimize_to_string (gc x) x
1984  let get_statistics (x:optimize) = Z3native.optimize_get_statistics (gc x) x
1985  let from_file (x:optimize) (s:string) = Z3native.optimize_from_file (gc x) x s
1986  let from_string (x:optimize) (s:string) = Z3native.optimize_from_string (gc x) x s
1987  let get_assertions (x:optimize) = AST.ASTVector.to_expr_list (Z3native.optimize_get_assertions (gc x) x)
1988  let get_objectives (x:optimize) = AST.ASTVector.to_expr_list (Z3native.optimize_get_objectives (gc x) x)
1989end
1990
1991
1992module SMT =
1993struct
1994  let benchmark_to_smtstring (ctx:context) (name:string) (logic:string) (status:string) (attributes:string) (assumptions:expr list) (formula:expr) =
1995    Z3native.benchmark_to_smtlib_string ctx name logic status attributes
1996      (List.length assumptions) assumptions
1997      formula
1998
1999  let parse_smtlib2_string (ctx:context) (str:string) (sort_names:Symbol.symbol list) (sorts:Sort.sort list) (decl_names:Symbol.symbol list) (decls:func_decl list) =
2000    let csn = List.length sort_names in
2001    let cs = List.length sorts in
2002    let cdn = List.length decl_names in
2003    let cd = List.length decls in
2004    if csn <> cs || cdn <> cd then
2005      raise (Error "Argument size mismatch")
2006    else
2007      Z3native.parse_smtlib2_string ctx str
2008        cs sort_names sorts cd decl_names decls
2009
2010  let parse_smtlib2_file (ctx:context) (file_name:string) (sort_names:Symbol.symbol list) (sorts:Sort.sort list) (decl_names:Symbol.symbol list) (decls:func_decl list) =
2011    let csn = List.length sort_names in
2012    let cs = List.length sorts in
2013    let cdn = List.length decl_names in
2014    let cd = List.length decls in
2015    if csn <> cs || cdn <> cd then
2016      raise (Error "Argument size mismatch")
2017    else
2018      Z3native.parse_smtlib2_file ctx file_name
2019        cs sort_names sorts cd decl_names decls
2020end
2021
2022
2023let set_global_param = Z3native.global_param_set
2024
2025let get_global_param id =
2026  match Z3native.global_param_get id with
2027  | (false, _) -> None
2028  | (true, v) -> Some v
2029
2030let global_param_reset_all = Z3native.global_param_reset_all
2031
2032let toggle_warning_messages = Z3native.toggle_warning_messages
2033
2034let enable_trace = Z3native.enable_trace
2035
2036let disable_trace = Z3native.enable_trace
2037
2038module Memory = struct
2039  let reset = Z3native.reset_memory
2040end
2041