z3_sys/generated/functions.rs
1// Auto-generated by z3-sys bindgen feature — do not edit manually.
2
3unsafe extern "C" {
4 /// Set a global (or module) parameter.
5 /// This setting is shared by all Z3 contexts.
6 ///
7 /// When a Z3 module is initialized it will use the value of these parameters
8 /// when Z3_params objects are not provided.
9 ///
10 /// The name of parameter can be composed of characters \[a-z]\[A-Z], digits \[0-9], '-' and '_'.
11 /// The character '.' is a delimiter (more later).
12 ///
13 /// The parameter names are case-insensitive. The character '-' should be viewed as an "alias" for '_'.
14 /// Thus, the following parameter names are considered equivalent: "pp.decimal-precision" and "PP.DECIMAL_PRECISION".
15 ///
16 /// This function can be used to set parameters for a specific Z3 module.
17 /// This can be done by using `<module-name>.<parameter-name>`.
18 /// For example:
19 /// Z3_global_param_set('pp.decimal', 'true')
20 /// will set the parameter "decimal" in the module "pp" to true.
21 ///
22 /// # See also
23 ///
24 /// - [`Z3_global_param_get`]
25 /// - [`Z3_global_param_reset_all`]
26 pub fn Z3_global_param_set(param_id: Z3_string, param_value: Z3_string);
27 /// Restore the value of all global (and module) parameters.
28 /// This command will not affect already created objects (such as tactics and solvers).
29 ///
30 /// # See also
31 ///
32 /// - [`Z3_global_param_get`]
33 /// - [`Z3_global_param_set`]
34 pub fn Z3_global_param_reset_all();
35 /// Get a global (or module) parameter.
36 ///
37 /// Returns `false` if the parameter value does not exist.
38 ///
39 ///
40 /// **Remark:** This function cannot be invoked simultaneously from different threads without synchronization.
41 /// The result string stored in param_value is stored in shared location.
42 ///
43 /// # See also
44 ///
45 /// - [`Z3_global_param_reset_all`]
46 /// - [`Z3_global_param_set`]
47 pub fn Z3_global_param_get(param_id: Z3_string, param_value: Z3_string_ptr) -> bool;
48 /// Create a configuration object for the Z3 context object.
49 ///
50 /// Configurations are created in order to assign parameters prior to creating
51 /// contexts for Z3 interaction. For example, if the users wishes to use proof
52 /// generation, then call:
53 ///
54 /// `Z3_set_param_value(cfg, "proof", "true")`
55 ///
56 /// **Remark:** In previous versions of Z3, the `Z3_config` was used to store
57 /// global and module configurations. Now, we should use `Z3_global_param_set`.
58 ///
59 /// The following parameters can be set:
60 ///
61 /// - proof (Boolean) Enable proof generation
62 /// - debug_ref_count (Boolean) Enable debug support for Z3_ast reference counting
63 /// - trace (Boolean) Tracing support for VCC
64 /// - trace_file_name (String) Trace out file for VCC traces
65 /// - timeout (unsigned) default timeout (in milliseconds) used for solvers
66 /// - well_sorted_check type checker
67 /// - auto_config use heuristics to automatically select solver and configure it
68 /// - model model generation for solvers, this parameter can be overwritten when creating a solver
69 /// - model_validate validate models produced by solvers
70 /// - unsat_core unsat-core generation for solvers, this parameter can be overwritten when creating a solver
71 /// - encoding the string encoding used internally (must be either "unicode" - 18 bit, "bmp" - 16 bit or "ascii" - 8 bit)
72 ///
73 /// # See also
74 ///
75 /// - [`Z3_set_param_value`]
76 /// - [`Z3_del_config`]
77 pub fn Z3_mk_config() -> Option<Z3_config>;
78 /// Delete the given configuration object.
79 ///
80 /// # See also
81 ///
82 /// - [`Z3_mk_config`]
83 pub fn Z3_del_config(c: Z3_config);
84 /// Set a configuration parameter.
85 ///
86 /// The following parameters can be set for
87 ///
88 /// # See also
89 ///
90 /// - [`Z3_mk_config`]
91 pub fn Z3_set_param_value(c: Z3_config, param_id: Z3_string, param_value: Z3_string);
92 /// Create a context using the given configuration.
93 ///
94 /// After a context is created, the configuration cannot be changed,
95 /// although some parameters can be changed using [`Z3_update_param_value`].
96 /// All main interaction with Z3 happens in the context of a `Z3_context`.
97 ///
98 /// In contrast to `Z3_mk_context_rc` the life time of `Z3_ast` objects
99 /// persists with the life time of the context.
100 ///
101 /// Note that all other reference counted objects, including `Z3_model`,
102 /// `Z3_solver`, `Z3_func_interp` have to be managed by the caller.
103 /// Their reference counts are not handled by the context.
104 ///
105 /// **Remark:** Thread safety: objects created using a given context should not be
106 /// accessed from different threads without synchronization. In other words,
107 /// operations on a context are not thread safe. To use Z3 from different threads
108 /// create separate context objects. The `Z3_translate`, `Z3_solver_translate`,
109 /// `Z3_model_translate`, `Z3_goal_translate`
110 /// methods are exposed to allow copying state from one context to another.
111 ///
112 /// **Remark:**
113 /// - `Z3_sort`, `Z3_func_decl`, `Z3_app`, `Z3_pattern` are `Z3_ast`'s.
114 /// - Z3 uses hash-consing, i.e., when the same `Z3_ast` is created twice,
115 /// Z3 will return the same pointer twice.
116 ///
117 /// # See also
118 ///
119 /// - [`Z3_del_context`]
120 pub fn Z3_mk_context(c: Z3_config) -> Option<Z3_context>;
121 /// Create a context using the given configuration.
122 /// This function is similar to [`Z3_mk_context`]. However,
123 /// in the context returned by this function, the user
124 /// is responsible for managing `Z3_ast` reference counters.
125 /// Managing reference counters is a burden and error-prone,
126 /// but allows the user to use the memory more efficiently.
127 /// The user must invoke [`Z3_inc_ref`] for any `Z3_ast` returned
128 /// by Z3, and [`Z3_dec_ref`] whenever the `Z3_ast` is not needed
129 /// anymore. This idiom is similar to the one used in
130 /// BDD (binary decision diagrams) packages such as CUDD.
131 ///
132 /// Remarks:
133 ///
134 /// - `Z3_sort`, `Z3_func_decl`, `Z3_app`, `Z3_pattern` are `Z3_ast`'s.
135 /// - After a context is created, the configuration cannot be changed.
136 /// - All main interaction with Z3 happens in the context of a `Z3_context`.
137 /// - Z3 uses hash-consing, i.e., when the same `Z3_ast` is created twice,
138 /// Z3 will return the same pointer twice.
139 pub fn Z3_mk_context_rc(c: Z3_config) -> Option<Z3_context>;
140 /// Delete the given logical context.
141 ///
142 /// # See also
143 ///
144 /// - [`Z3_mk_context`]
145 pub fn Z3_del_context(c: Z3_context);
146 /// Increment the reference counter of the given AST.
147 /// The context `c` should have been created using [`Z3_mk_context_rc`].
148 /// This function is a NOOP if `c` was created using [`Z3_mk_context`].
149 pub fn Z3_inc_ref(c: Z3_context, a: Z3_ast);
150 /// Decrement the reference counter of the given AST.
151 /// The context `c` should have been created using [`Z3_mk_context_rc`].
152 /// This function is a NOOP if `c` was created using [`Z3_mk_context`].
153 pub fn Z3_dec_ref(c: Z3_context, a: Z3_ast);
154 /// Set a value of a context parameter.
155 ///
156 /// # See also
157 ///
158 /// - [`Z3_global_param_set`]
159 pub fn Z3_update_param_value(
160 c: Z3_context,
161 param_id: Z3_string,
162 param_value: Z3_string,
163 );
164 /// Retrieve description of global parameters.
165 pub fn Z3_get_global_param_descrs(c: Z3_context) -> Option<Z3_param_descrs>;
166 /// Interrupt the execution of a Z3 procedure.
167 /// This procedure can be used to interrupt: solvers, simplifiers and tactics.
168 pub fn Z3_interrupt(c: Z3_context);
169 /// use concurrency control for dec-ref.
170 /// Reference counting decrements are allowed in separate threads from the context.
171 /// If this setting is not invoked, reference counting decrements are not going to be thread safe.
172 pub fn Z3_enable_concurrent_dec_ref(c: Z3_context);
173 /// Create a Z3 (empty) parameter set.
174 /// Starting at Z3 4.0, parameter sets are used to configure many components such as:
175 /// simplifiers, tactics, solvers, etc.
176 ///
177 /// **Remark:** Reference counting must be used to manage parameter sets, even when the `Z3_context` was
178 /// created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
179 pub fn Z3_mk_params(c: Z3_context) -> Option<Z3_params>;
180 /// Increment the reference counter of the given parameter set.
181 pub fn Z3_params_inc_ref(c: Z3_context, p: Z3_params);
182 /// Decrement the reference counter of the given parameter set.
183 pub fn Z3_params_dec_ref(c: Z3_context, p: Z3_params);
184 /// Add a Boolean parameter `k` with value `v` to the parameter set `p`.
185 pub fn Z3_params_set_bool(c: Z3_context, p: Z3_params, k: Z3_symbol, v: bool);
186 /// Add a unsigned parameter `k` with value `v` to the parameter set `p`.
187 pub fn Z3_params_set_uint(
188 c: Z3_context,
189 p: Z3_params,
190 k: Z3_symbol,
191 v: ::core::ffi::c_uint,
192 );
193 /// Add a double parameter `k` with value `v` to the parameter set `p`.
194 pub fn Z3_params_set_double(c: Z3_context, p: Z3_params, k: Z3_symbol, v: f64);
195 /// Add a symbol parameter `k` with value `v` to the parameter set `p`.
196 pub fn Z3_params_set_symbol(c: Z3_context, p: Z3_params, k: Z3_symbol, v: Z3_symbol);
197 /// Convert a parameter set into a string. This function is mainly used for printing the
198 /// contents of a parameter set.
199 pub fn Z3_params_to_string(c: Z3_context, p: Z3_params) -> Z3_string;
200 /// Validate the parameter set `p` against the parameter description set `d`.
201 ///
202 /// The procedure invokes the error handler if `p` is invalid.
203 pub fn Z3_params_validate(c: Z3_context, p: Z3_params, d: Z3_param_descrs);
204 /// Increment the reference counter of the given parameter description set.
205 pub fn Z3_param_descrs_inc_ref(c: Z3_context, p: Z3_param_descrs);
206 /// Decrement the reference counter of the given parameter description set.
207 pub fn Z3_param_descrs_dec_ref(c: Z3_context, p: Z3_param_descrs);
208 /// Return the kind associated with the given parameter name `n`.
209 pub fn Z3_param_descrs_get_kind(
210 c: Z3_context,
211 p: Z3_param_descrs,
212 n: Z3_symbol,
213 ) -> Z3_param_kind;
214 /// Return the number of parameters in the given parameter description set.
215 pub fn Z3_param_descrs_size(
216 c: Z3_context,
217 p: Z3_param_descrs,
218 ) -> ::core::ffi::c_uint;
219 /// Return the name of the parameter at given index `i`.
220 ///
221 /// # Preconditions
222 ///
223 /// - `i < Z3_param_descrs_size(c, p)`
224 pub fn Z3_param_descrs_get_name(
225 c: Z3_context,
226 p: Z3_param_descrs,
227 i: ::core::ffi::c_uint,
228 ) -> Option<Z3_symbol>;
229 /// Retrieve documentation string corresponding to parameter name `s`.
230 pub fn Z3_param_descrs_get_documentation(
231 c: Z3_context,
232 p: Z3_param_descrs,
233 s: Z3_symbol,
234 ) -> Z3_string;
235 /// Convert a parameter description set into a string. This function is mainly used for printing the
236 /// contents of a parameter description set.
237 pub fn Z3_param_descrs_to_string(c: Z3_context, p: Z3_param_descrs) -> Z3_string;
238 /// Create a Z3 symbol using an integer.
239 ///
240 /// Symbols are used to name several term and type constructors.
241 ///
242 /// NB. Not all integers can be passed to this function.
243 /// The legal range of unsigned integers is 0 to 2^30-1.
244 ///
245 /// # See also
246 ///
247 /// - [`Z3_get_symbol_int`]
248 /// - [`Z3_mk_string_symbol`]
249 pub fn Z3_mk_int_symbol(c: Z3_context, i: ::core::ffi::c_int) -> Option<Z3_symbol>;
250 /// Create a Z3 symbol using a C string.
251 ///
252 /// Symbols are used to name several term and type constructors.
253 ///
254 /// # See also
255 ///
256 /// - [`Z3_get_symbol_string`]
257 /// - [`Z3_mk_int_symbol`]
258 pub fn Z3_mk_string_symbol(c: Z3_context, s: Z3_string) -> Option<Z3_symbol>;
259 /// Create a free (uninterpreted) type using the given name (symbol).
260 ///
261 /// Two free types are considered the same iff the have the same name.
262 pub fn Z3_mk_uninterpreted_sort(c: Z3_context, s: Z3_symbol) -> Option<Z3_sort>;
263 /// Create a type variable.
264 ///
265 /// Functions using type variables can be applied to instantiations that match the signature
266 /// of the function. Assertions using type variables correspond to assertions over all possible
267 /// instantiations.
268 pub fn Z3_mk_type_variable(c: Z3_context, s: Z3_symbol) -> Option<Z3_sort>;
269 /// Create the Boolean type.
270 ///
271 /// This type is used to create propositional variables and predicates.
272 pub fn Z3_mk_bool_sort(c: Z3_context) -> Option<Z3_sort>;
273 /// Create the integer type.
274 ///
275 /// This type is not the int type found in programming languages.
276 /// A machine integer can be represented using bit-vectors. The function
277 /// [`Z3_mk_bv_sort`] creates a bit-vector type.
278 ///
279 /// # See also
280 ///
281 /// - [`Z3_mk_bv_sort`]
282 pub fn Z3_mk_int_sort(c: Z3_context) -> Option<Z3_sort>;
283 /// Create the real type.
284 ///
285 /// Note that this type is not a floating point number.
286 pub fn Z3_mk_real_sort(c: Z3_context) -> Option<Z3_sort>;
287 /// Create a bit-vector type of the given size.
288 ///
289 /// This type can also be seen as a machine integer.
290 ///
291 /// **Remark:** The size of the bit-vector type must be greater than zero.
292 pub fn Z3_mk_bv_sort(c: Z3_context, sz: ::core::ffi::c_uint) -> Option<Z3_sort>;
293 /// Create a named finite domain sort.
294 ///
295 /// To create constants that belong to the finite domain,
296 /// use the APIs for creating numerals and pass a numeric
297 /// constant together with the sort returned by this call.
298 /// The numeric constant should be between 0 and the less
299 /// than the size of the domain.
300 ///
301 /// # See also
302 ///
303 /// - [`Z3_get_finite_domain_sort_size`]
304 pub fn Z3_mk_finite_domain_sort(
305 c: Z3_context,
306 name: Z3_symbol,
307 size: u64,
308 ) -> Option<Z3_sort>;
309 /// Create an array type.
310 ///
311 /// We usually represent the array type as: `[domain -> range]`.
312 /// Arrays are usually used to model the heap/memory in software verification.
313 ///
314 /// # See also
315 ///
316 /// - [`Z3_mk_select`]
317 /// - [`Z3_mk_store`]
318 pub fn Z3_mk_array_sort(
319 c: Z3_context,
320 domain: Z3_sort,
321 range: Z3_sort,
322 ) -> Option<Z3_sort>;
323 /// Create an array type with N arguments
324 ///
325 /// # See also
326 ///
327 /// - [`Z3_mk_select_n`]
328 /// - [`Z3_mk_store_n`]
329 pub fn Z3_mk_array_sort_n(
330 c: Z3_context,
331 n: ::core::ffi::c_uint,
332 domain: *const Z3_sort,
333 range: Z3_sort,
334 ) -> Option<Z3_sort>;
335 /// Create a tuple type.
336 ///
337 /// A tuple with `n` fields has a constructor and `n` projections.
338 /// This function will also declare the constructor and projection functions.
339 ///
340 /// - `c`: logical context
341 /// - `mk_tuple_name`: name of the constructor function associated with the tuple type.
342 /// - `num_fields`: number of fields in the tuple type.
343 /// - `field_names`: name of the projection functions.
344 /// - `field_sorts`: type of the tuple fields.
345 /// - `mk_tuple_decl`: output parameter that will contain the constructor declaration.
346 /// - `proj_decl`: output parameter that will contain the projection function declarations. This field must be a buffer of size `num_fields` allocated by the user.
347 pub fn Z3_mk_tuple_sort(
348 c: Z3_context,
349 mk_tuple_name: Z3_symbol,
350 num_fields: ::core::ffi::c_uint,
351 field_names: *const Z3_symbol,
352 field_sorts: *const Z3_sort,
353 mk_tuple_decl: *mut Z3_func_decl,
354 proj_decl: *mut Z3_func_decl,
355 ) -> Option<Z3_sort>;
356 /// Create a enumeration sort.
357 ///
358 /// An enumeration sort with `n` elements.
359 /// This function will also declare the functions corresponding to the enumerations.
360 ///
361 /// - `c`: logical context
362 /// - `name`: name of the enumeration sort.
363 /// - `n`: number of elements in enumeration sort.
364 /// - `enum_names`: names of the enumerated elements.
365 /// - `enum_consts`: constants corresponding to the enumerated elements.
366 /// - `enum_testers`: predicates testing if terms of the enumeration sort correspond to an enumeration.
367 ///
368 /// For example, if this function is called with three symbols A, B, C and the name S, then
369 /// `s` is a sort whose name is S, and the function returns three terms corresponding to A, B, C in
370 /// `enum_consts`. The array `enum_testers` has three predicates of type `(s -> Bool)`.
371 /// The first predicate (corresponding to A) is true when applied to A, and false otherwise.
372 /// Similarly for the other predicates.
373 pub fn Z3_mk_enumeration_sort(
374 c: Z3_context,
375 name: Z3_symbol,
376 n: ::core::ffi::c_uint,
377 enum_names: *const Z3_symbol,
378 enum_consts: *mut Z3_func_decl,
379 enum_testers: *mut Z3_func_decl,
380 ) -> Option<Z3_sort>;
381 /// Create a list sort
382 ///
383 /// A list sort over `elem_sort`
384 /// This function declares the corresponding constructors and testers for lists.
385 ///
386 /// - `c`: logical context
387 /// - `name`: name of the list sort.
388 /// - `elem_sort`: sort of list elements.
389 /// - `nil_decl`: declaration for the empty list.
390 /// - `is_nil_decl`: test for the empty list.
391 /// - `cons_decl`: declaration for a cons cell.
392 /// - `is_cons_decl`: cons cell test.
393 /// - `head_decl`: list head.
394 /// - `tail_decl`: list tail.
395 pub fn Z3_mk_list_sort(
396 c: Z3_context,
397 name: Z3_symbol,
398 elem_sort: Z3_sort,
399 nil_decl: *mut Z3_func_decl,
400 is_nil_decl: *mut Z3_func_decl,
401 cons_decl: *mut Z3_func_decl,
402 is_cons_decl: *mut Z3_func_decl,
403 head_decl: *mut Z3_func_decl,
404 tail_decl: *mut Z3_func_decl,
405 ) -> Option<Z3_sort>;
406 /// Retrieve the number of fields of a constructor
407 ///
408 /// - `c`: logical context.
409 /// - `constr`: constructor.
410 pub fn Z3_constructor_num_fields(
411 c: Z3_context,
412 constr: Z3_constructor,
413 ) -> ::core::ffi::c_uint;
414 /// Reclaim memory allocated to constructor.
415 ///
416 /// - `c`: logical context.
417 /// - `constr`: constructor.
418 ///
419 /// # See also
420 ///
421 /// - [`Z3_mk_constructor`]
422 pub fn Z3_del_constructor(c: Z3_context, constr: Z3_constructor);
423 /// Create datatype, such as lists, trees, records, enumerations or unions of records.
424 /// The datatype may be recursive. Return the datatype sort.
425 ///
426 /// - `c`: logical context.
427 /// - `name`: name of datatype.
428 /// - `num_constructors`: number of constructors passed in.
429 /// - `constructors`: array of constructor containers.
430 ///
431 /// # See also
432 ///
433 /// - [`Z3_mk_constructor`]
434 /// - [`Z3_mk_constructor_list`]
435 /// - [`Z3_mk_datatypes`]
436 pub fn Z3_mk_datatype(
437 c: Z3_context,
438 name: Z3_symbol,
439 num_constructors: ::core::ffi::c_uint,
440 constructors: *mut Z3_constructor,
441 ) -> Option<Z3_sort>;
442 /// Create a parametric datatype with explicit type parameters.
443 ///
444 /// This function is similar to [`Z3_mk_datatype`], except it takes an explicit set of type parameters.
445 /// The parameters can be type variables created with [`Z3_mk_type_variable`], allowing the definition
446 /// of polymorphic datatypes that can be instantiated with different concrete types.
447 ///
448 /// - `c`: logical context
449 /// - `name`: name of the datatype
450 /// - `num_parameters`: number of type parameters (can be 0)
451 /// - `parameters`: array of type parameters (type variables or concrete sorts)
452 /// - `num_constructors`: number of constructors
453 /// - `constructors`: array of constructor specifications
454 ///
455 /// # See also
456 ///
457 /// - [`Z3_mk_datatype`]
458 /// - [`Z3_mk_type_variable`]
459 /// - [`Z3_mk_datatype_sort`]
460 pub fn Z3_mk_polymorphic_datatype(
461 c: Z3_context,
462 name: Z3_symbol,
463 num_parameters: ::core::ffi::c_uint,
464 parameters: *mut Z3_sort,
465 num_constructors: ::core::ffi::c_uint,
466 constructors: *mut Z3_constructor,
467 ) -> Option<Z3_sort>;
468 /// create a forward reference to a recursive datatype being declared.
469 /// The forward reference can be used in a nested occurrence: the range of an array
470 /// or as element sort of a sequence. The forward reference should only be used when
471 /// used in an accessor for a recursive datatype that gets declared.
472 ///
473 /// Forward references can replace the use sort references, that are unsigned integers
474 /// in the `Z3_mk_constructor` call
475 ///
476 /// - `c`: logical context
477 /// - `name`: name of the datatype
478 /// - `num_params`: number of sort parameters
479 /// - `params`: array of sort parameters
480 pub fn Z3_mk_datatype_sort(
481 c: Z3_context,
482 name: Z3_symbol,
483 num_params: ::core::ffi::c_uint,
484 params: *const Z3_sort,
485 ) -> Option<Z3_sort>;
486 /// Create list of constructors.
487 ///
488 /// - `c`: logical context.
489 /// - `num_constructors`: number of constructors in list.
490 /// - `constructors`: list of constructors.
491 ///
492 /// # See also
493 ///
494 /// - [`Z3_del_constructor_list`]
495 /// - [`Z3_mk_constructor`]
496 pub fn Z3_mk_constructor_list(
497 c: Z3_context,
498 num_constructors: ::core::ffi::c_uint,
499 constructors: *const Z3_constructor,
500 ) -> Option<Z3_constructor_list>;
501 /// Reclaim memory allocated for constructor list.
502 ///
503 /// Each constructor inside the constructor list must be independently reclaimed using [`Z3_del_constructor`].
504 ///
505 /// - `c`: logical context.
506 /// - `clist`: constructor list container.
507 ///
508 /// # See also
509 ///
510 /// - [`Z3_mk_constructor_list`]
511 pub fn Z3_del_constructor_list(c: Z3_context, clist: Z3_constructor_list);
512 /// Create mutually recursive datatypes.
513 ///
514 /// - `c`: logical context.
515 /// - `num_sorts`: number of datatype sorts.
516 /// - `sort_names`: names of datatype sorts.
517 /// - `sorts`: array of datatype sorts.
518 /// - `constructor_lists`: list of constructors, one list per sort.
519 ///
520 /// # See also
521 ///
522 /// - [`Z3_mk_constructor`]
523 /// - [`Z3_mk_constructor_list`]
524 /// - [`Z3_mk_datatype`]
525 pub fn Z3_mk_datatypes(
526 c: Z3_context,
527 num_sorts: ::core::ffi::c_uint,
528 sort_names: *const Z3_symbol,
529 sorts: *mut Z3_sort,
530 constructor_lists: *mut Z3_constructor_list,
531 );
532 /// Query constructor for declared functions.
533 ///
534 /// - `c`: logical context.
535 /// - `constr`: constructor container. The container must have been passed into a [`Z3_mk_datatype`] call.
536 /// - `num_fields`: number of accessor fields in the constructor.
537 /// - `constructor`: constructor function declaration, allocated by user.
538 /// - `tester`: constructor test function declaration, allocated by user.
539 /// - `accessors`: array of accessor function declarations allocated by user. The array must contain num_fields elements.
540 ///
541 /// # See also
542 ///
543 /// - [`Z3_mk_constructor`]
544 pub fn Z3_query_constructor(
545 c: Z3_context,
546 constr: Z3_constructor,
547 num_fields: ::core::ffi::c_uint,
548 constructor: *mut Z3_func_decl,
549 tester: *mut Z3_func_decl,
550 accessors: *mut Z3_func_decl,
551 );
552 /// Declare a constant or function.
553 ///
554 /// - `c`: logical context.
555 /// - `s`: name of the constant or function.
556 /// - `domain_size`: number of arguments. It is 0 when declaring a constant.
557 /// - `domain`: array containing the sort of each argument. The array must contain domain_size elements. It is 0 when declaring a constant.
558 /// - `range`: sort of the constant or the return sort of the function.
559 ///
560 /// After declaring a constant or function, the function
561 /// [`Z3_mk_app`] can be used to create a constant or function
562 /// application.
563 ///
564 /// # See also
565 ///
566 /// - [`Z3_mk_app`]
567 /// - [`Z3_mk_fresh_func_decl`]
568 /// - [`Z3_mk_rec_func_decl`]
569 pub fn Z3_mk_func_decl(
570 c: Z3_context,
571 s: Z3_symbol,
572 domain_size: ::core::ffi::c_uint,
573 domain: *const Z3_sort,
574 range: Z3_sort,
575 ) -> Option<Z3_func_decl>;
576 /// Create a constant or function application.
577 ///
578 /// # See also
579 ///
580 /// - [`Z3_mk_fresh_func_decl`]
581 /// - [`Z3_mk_func_decl`]
582 /// - [`Z3_mk_rec_func_decl`]
583 pub fn Z3_mk_app(
584 c: Z3_context,
585 d: Z3_func_decl,
586 num_args: ::core::ffi::c_uint,
587 args: *const Z3_ast,
588 ) -> Option<Z3_ast>;
589 /// Declare and create a constant.
590 ///
591 /// This function is a shorthand for:
592 /// ```c
593 /// Z3_func_decl d = Z3_mk_func_decl(c, s, 0, 0, ty);
594 /// Z3_ast n = Z3_mk_app(c, d, 0, 0);
595 /// ```
596 ///
597 /// # See also
598 ///
599 /// - [`Z3_mk_app`]
600 /// - [`Z3_mk_fresh_const`]
601 /// - [`Z3_mk_func_decl`]
602 pub fn Z3_mk_const(c: Z3_context, s: Z3_symbol, ty: Z3_sort) -> Option<Z3_ast>;
603 /// Declare a fresh constant or function.
604 ///
605 /// Z3 will generate an unique name for this function declaration.
606 /// If prefix is different from `NULL`, then the name generate by Z3 will start with `prefix`.
607 ///
608 /// **Remark:** If `prefix` is `NULL`, then it is assumed to be the empty string.
609 ///
610 /// # See also
611 ///
612 /// - [`Z3_mk_func_decl`]
613 pub fn Z3_mk_fresh_func_decl(
614 c: Z3_context,
615 prefix: Z3_string,
616 domain_size: ::core::ffi::c_uint,
617 domain: *const Z3_sort,
618 range: Z3_sort,
619 ) -> Option<Z3_func_decl>;
620 /// Declare and create a fresh constant.
621 ///
622 /// This function is a shorthand for:
623 /// `Z3_func_decl d = Z3_mk_fresh_func_decl(c, prefix, 0, 0, ty); Z3_ast n = Z3_mk_app(c, d, 0, 0);`
624 ///
625 /// **Remark:** If `prefix` is `NULL`, then it is assumed to be the empty string.
626 ///
627 /// # See also
628 ///
629 /// - [`Z3_mk_app`]
630 /// - [`Z3_mk_const`]
631 /// - [`Z3_mk_fresh_func_decl`]
632 /// - [`Z3_mk_func_decl`]
633 pub fn Z3_mk_fresh_const(
634 c: Z3_context,
635 prefix: Z3_string,
636 ty: Z3_sort,
637 ) -> Option<Z3_ast>;
638 /// Declare a recursive function
639 ///
640 /// - `c`: logical context.
641 /// - `s`: name of the function.
642 /// - `domain_size`: number of arguments. It should be greater than 0.
643 /// - `domain`: array containing the sort of each argument. The array must contain domain_size elements.
644 /// - `range`: sort of the constant or the return sort of the function.
645 ///
646 /// After declaring recursive function, it should be associated with a recursive definition [`Z3_add_rec_def`].
647 /// The function [`Z3_mk_app`] can be used to create a constant or function
648 /// application.
649 ///
650 /// # See also
651 ///
652 /// - [`Z3_add_rec_def`]
653 /// - [`Z3_mk_app`]
654 /// - [`Z3_mk_func_decl`]
655 pub fn Z3_mk_rec_func_decl(
656 c: Z3_context,
657 s: Z3_symbol,
658 domain_size: ::core::ffi::c_uint,
659 domain: *const Z3_sort,
660 range: Z3_sort,
661 ) -> Option<Z3_func_decl>;
662 /// Define the body of a recursive function.
663 ///
664 /// - `c`: logical context.
665 /// - `f`: function declaration.
666 /// - `n`: number of arguments to the function
667 /// - `args`: constants that are used as arguments to the recursive function in the definition.
668 /// - `body`: body of the recursive function
669 ///
670 /// After declaring a recursive function or a collection of mutually recursive functions, use
671 /// this function to provide the definition for the recursive function.
672 ///
673 /// # See also
674 ///
675 /// - [`Z3_mk_rec_func_decl`]
676 pub fn Z3_add_rec_def(
677 c: Z3_context,
678 f: Z3_func_decl,
679 n: ::core::ffi::c_uint,
680 args: *mut Z3_ast,
681 body: Z3_ast,
682 );
683 /// Create an AST node representing `true`.
684 pub fn Z3_mk_true(c: Z3_context) -> Option<Z3_ast>;
685 /// Create an AST node representing `false`.
686 pub fn Z3_mk_false(c: Z3_context) -> Option<Z3_ast>;
687 /// Create an AST node representing `l = r`.
688 ///
689 /// The nodes `l` and `r` must have the same type.
690 pub fn Z3_mk_eq(c: Z3_context, l: Z3_ast, r: Z3_ast) -> Option<Z3_ast>;
691 /// Create an AST node representing `distinct(args[0], ..., args[num_args-1])`.
692 ///
693 /// The `distinct` construct is used for declaring the arguments pairwise distinct.
694 /// That is, `Forall 0 <= i < j < num_args. not args[i] = args[j]`.
695 ///
696 /// All arguments must have the same sort.
697 ///
698 /// **Remark:** The number of arguments of a distinct construct must be greater than one.
699 pub fn Z3_mk_distinct(
700 c: Z3_context,
701 num_args: ::core::ffi::c_uint,
702 args: *const Z3_ast,
703 ) -> Option<Z3_ast>;
704 /// Create an AST node representing `not(a)`.
705 ///
706 /// The node `a` must have Boolean sort.
707 pub fn Z3_mk_not(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
708 /// Create an AST node representing an if-then-else: `ite(t1, t2, t3)`.
709 ///
710 /// The node `t1` must have Boolean sort, `t2` and `t3` must have the same sort.
711 /// The sort of the new node is equal to the sort of `t2` and `t3`.
712 pub fn Z3_mk_ite(
713 c: Z3_context,
714 t1: Z3_ast,
715 t2: Z3_ast,
716 t3: Z3_ast,
717 ) -> Option<Z3_ast>;
718 /// Create an AST node representing `t1 iff t2`.
719 ///
720 /// The nodes `t1` and `t2` must have Boolean sort.
721 pub fn Z3_mk_iff(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
722 /// Create an AST node representing `t1 implies t2`.
723 ///
724 /// The nodes `t1` and `t2` must have Boolean sort.
725 pub fn Z3_mk_implies(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
726 /// Create an AST node representing `t1 xor t2`.
727 ///
728 /// The nodes `t1` and `t2` must have Boolean sort.
729 pub fn Z3_mk_xor(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
730 /// Create an AST node representing `args[0] and ... and args[num_args-1]`.
731 ///
732 /// The array `args` must have `num_args` elements.
733 /// All arguments must have Boolean sort.
734 ///
735 /// **Remark:** The number of arguments must be greater than zero.
736 pub fn Z3_mk_and(
737 c: Z3_context,
738 num_args: ::core::ffi::c_uint,
739 args: *const Z3_ast,
740 ) -> Option<Z3_ast>;
741 /// Create an AST node representing `args[0] or ... or args[num_args-1]`.
742 ///
743 /// The array `args` must have `num_args` elements.
744 /// All arguments must have Boolean sort.
745 ///
746 /// **Remark:** The number of arguments must be greater than zero.
747 pub fn Z3_mk_or(
748 c: Z3_context,
749 num_args: ::core::ffi::c_uint,
750 args: *const Z3_ast,
751 ) -> Option<Z3_ast>;
752 /// Create an AST node representing `args[0] + ... + args[num_args-1]`.
753 ///
754 /// The array `args` must have `num_args` elements.
755 /// All arguments must have int or real sort.
756 ///
757 /// **Remark:** The number of arguments must be greater than zero.
758 pub fn Z3_mk_add(
759 c: Z3_context,
760 num_args: ::core::ffi::c_uint,
761 args: *const Z3_ast,
762 ) -> Option<Z3_ast>;
763 /// Create an AST node representing `args[0] * ... * args[num_args-1]`.
764 ///
765 /// The array `args` must have `num_args` elements.
766 /// All arguments must have int or real sort.
767 ///
768 /// **Remark:** Z3 has limited support for non-linear arithmetic.
769 /// **Remark:** The number of arguments must be greater than zero.
770 pub fn Z3_mk_mul(
771 c: Z3_context,
772 num_args: ::core::ffi::c_uint,
773 args: *const Z3_ast,
774 ) -> Option<Z3_ast>;
775 /// Create an AST node representing `args[0] - ... - args[num_args - 1]`.
776 ///
777 /// The array `args` must have `num_args` elements.
778 /// All arguments must have int or real sort.
779 ///
780 /// **Remark:** The number of arguments must be greater than zero.
781 pub fn Z3_mk_sub(
782 c: Z3_context,
783 num_args: ::core::ffi::c_uint,
784 args: *const Z3_ast,
785 ) -> Option<Z3_ast>;
786 /// Create an AST node representing `- arg`.
787 ///
788 /// The arguments must have int or real type.
789 pub fn Z3_mk_unary_minus(c: Z3_context, arg: Z3_ast) -> Option<Z3_ast>;
790 /// Create an AST node representing `arg1 div arg2`.
791 ///
792 /// The arguments must either both have int type or both have real type.
793 /// If the arguments have int type, then the result type is an int type, otherwise the
794 /// the result type is real.
795 pub fn Z3_mk_div(c: Z3_context, arg1: Z3_ast, arg2: Z3_ast) -> Option<Z3_ast>;
796 /// Create an AST node representing `arg1 mod arg2`.
797 ///
798 /// The arguments must have int type.
799 pub fn Z3_mk_mod(c: Z3_context, arg1: Z3_ast, arg2: Z3_ast) -> Option<Z3_ast>;
800 /// Create an AST node representing `arg1 rem arg2`.
801 ///
802 /// The arguments must have int type.
803 pub fn Z3_mk_rem(c: Z3_context, arg1: Z3_ast, arg2: Z3_ast) -> Option<Z3_ast>;
804 /// Create an AST node representing `arg1 ^ arg2`.
805 ///
806 /// The arguments must have int or real type.
807 pub fn Z3_mk_power(c: Z3_context, arg1: Z3_ast, arg2: Z3_ast) -> Option<Z3_ast>;
808 /// Take the absolute value of an integer
809 pub fn Z3_mk_abs(c: Z3_context, arg: Z3_ast) -> Option<Z3_ast>;
810 /// Create less than.
811 ///
812 /// The nodes `t1` and `t2` must have the same sort, and must be int or real.
813 pub fn Z3_mk_lt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
814 /// Create less than or equal to.
815 ///
816 /// The nodes `t1` and `t2` must have the same sort, and must be int or real.
817 pub fn Z3_mk_le(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
818 /// Create greater than.
819 ///
820 /// The nodes `t1` and `t2` must have the same sort, and must be int or real.
821 pub fn Z3_mk_gt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
822 /// Create greater than or equal to.
823 ///
824 /// The nodes `t1` and `t2` must have the same sort, and must be int or real.
825 pub fn Z3_mk_ge(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
826 /// Create division predicate.
827 ///
828 /// The nodes `t1` and `t2` must be of integer sort.
829 /// The predicate is true when `t1` divides `t2`. For the predicate to be part of
830 /// linear integer arithmetic, the first argument `t1` must be a non-zero integer.
831 pub fn Z3_mk_divides(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
832 /// Coerce an integer to a real.
833 ///
834 /// There is also a converse operation exposed.
835 /// It follows the semantics prescribed by the SMT-LIB standard.
836 ///
837 /// You can take the floor of a real by
838 /// creating an auxiliary integer constant `k` and
839 /// and asserting `mk_int2real(k) <= t1 < mk_int2real(k)+1`.
840 ///
841 /// The node `t1` must have sort integer.
842 ///
843 /// # See also
844 ///
845 /// - [`Z3_mk_real2int`]
846 /// - [`Z3_mk_is_int`]
847 pub fn Z3_mk_int2real(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
848 /// Coerce a real to an integer.
849 ///
850 /// The semantics of this function follows the SMT-LIB standard
851 /// for the function to_int
852 ///
853 /// # See also
854 ///
855 /// - [`Z3_mk_int2real`]
856 /// - [`Z3_mk_is_int`]
857 pub fn Z3_mk_real2int(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
858 /// Check if a real number is an integer.
859 ///
860 /// # See also
861 ///
862 /// - [`Z3_mk_int2real`]
863 /// - [`Z3_mk_real2int`]
864 pub fn Z3_mk_is_int(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
865 /// Bitwise negation.
866 ///
867 /// The node `t1` must have a bit-vector sort.
868 pub fn Z3_mk_bvnot(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
869 /// Take conjunction of bits in vector, return vector of length 1.
870 ///
871 /// The node `t1` must have a bit-vector sort.
872 pub fn Z3_mk_bvredand(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
873 /// Take disjunction of bits in vector, return vector of length 1.
874 ///
875 /// The node `t1` must have a bit-vector sort.
876 pub fn Z3_mk_bvredor(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
877 /// Bitwise and.
878 ///
879 /// The nodes `t1` and `t2` must have the same bit-vector sort.
880 pub fn Z3_mk_bvand(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
881 /// Bitwise or.
882 ///
883 /// The nodes `t1` and `t2` must have the same bit-vector sort.
884 pub fn Z3_mk_bvor(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
885 /// Bitwise exclusive-or.
886 ///
887 /// The nodes `t1` and `t2` must have the same bit-vector sort.
888 pub fn Z3_mk_bvxor(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
889 /// Bitwise nand.
890 ///
891 /// The nodes `t1` and `t2` must have the same bit-vector sort.
892 pub fn Z3_mk_bvnand(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
893 /// Bitwise nor.
894 ///
895 /// The nodes `t1` and `t2` must have the same bit-vector sort.
896 pub fn Z3_mk_bvnor(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
897 /// Bitwise xnor.
898 ///
899 /// The nodes `t1` and `t2` must have the same bit-vector sort.
900 pub fn Z3_mk_bvxnor(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
901 /// Standard two's complement unary minus.
902 ///
903 /// The node `t1` must have bit-vector sort.
904 pub fn Z3_mk_bvneg(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
905 /// Standard two's complement addition.
906 ///
907 /// The nodes `t1` and `t2` must have the same bit-vector sort.
908 pub fn Z3_mk_bvadd(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
909 /// Standard two's complement subtraction.
910 ///
911 /// The nodes `t1` and `t2` must have the same bit-vector sort.
912 pub fn Z3_mk_bvsub(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
913 /// Standard two's complement multiplication.
914 ///
915 /// The nodes `t1` and `t2` must have the same bit-vector sort.
916 pub fn Z3_mk_bvmul(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
917 /// Unsigned division.
918 ///
919 /// It is defined as the `floor` of `t1/t2` if `t2` is
920 /// different from zero. If `t2` is zero, then the result
921 /// is undefined.
922 ///
923 /// The nodes `t1` and `t2` must have the same bit-vector sort.
924 pub fn Z3_mk_bvudiv(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
925 /// Two's complement signed division.
926 ///
927 /// It is defined in the following way:
928 ///
929 /// - The `floor` of `t1/t2` if `t2` is different from zero, and `t1*t2 >= 0`.
930 ///
931 /// - The `ceiling` of `t1/t2` if `t2` is different from zero, and `t1*t2 < 0`.
932 ///
933 /// If `t2` is zero, then the result is undefined.
934 ///
935 /// The nodes `t1` and `t2` must have the same bit-vector sort.
936 pub fn Z3_mk_bvsdiv(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
937 /// Unsigned remainder.
938 ///
939 /// It is defined as `t1 - (t1 /u t2) * t2`, where `/u` represents unsigned division.
940 ///
941 /// If `t2` is zero, then the result is undefined.
942 ///
943 /// The nodes `t1` and `t2` must have the same bit-vector sort.
944 pub fn Z3_mk_bvurem(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
945 /// Two's complement signed remainder (sign follows dividend).
946 ///
947 /// It is defined as `t1 - (t1 /s t2) * t2`, where `/s` represents signed division.
948 /// The most significant bit (sign) of the result is equal to the most significant bit of `t1`.
949 ///
950 /// If `t2` is zero, then the result is undefined.
951 ///
952 /// The nodes `t1` and `t2` must have the same bit-vector sort.
953 ///
954 /// # See also
955 ///
956 /// - [`Z3_mk_bvsmod`]
957 pub fn Z3_mk_bvsrem(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
958 /// Two's complement signed remainder (sign follows divisor).
959 ///
960 /// If `t2` is zero, then the result is undefined.
961 ///
962 /// The nodes `t1` and `t2` must have the same bit-vector sort.
963 ///
964 /// # See also
965 ///
966 /// - [`Z3_mk_bvsrem`]
967 pub fn Z3_mk_bvsmod(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
968 /// Unsigned less than.
969 ///
970 /// The nodes `t1` and `t2` must have the same bit-vector sort.
971 pub fn Z3_mk_bvult(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
972 /// Two's complement signed less than.
973 ///
974 /// It abbreviates:
975 /// ```c
976 /// (or (and (= (extract[|m-1|:|m-1|] t1) bit1)
977 /// (= (extract[|m-1|:|m-1|] t2) bit0))
978 /// (and (= (extract[|m-1|:|m-1|] t1) (extract[|m-1|:|m-1|] t2))
979 /// (bvult t1 t2)))
980 /// ```
981 ///
982 /// The nodes `t1` and `t2` must have the same bit-vector sort.
983 pub fn Z3_mk_bvslt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
984 /// Unsigned less than or equal to.
985 ///
986 /// The nodes `t1` and `t2` must have the same bit-vector sort.
987 pub fn Z3_mk_bvule(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
988 /// Two's complement signed less than or equal to.
989 ///
990 /// The nodes `t1` and `t2` must have the same bit-vector sort.
991 pub fn Z3_mk_bvsle(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
992 /// Unsigned greater than or equal to.
993 ///
994 /// The nodes `t1` and `t2` must have the same bit-vector sort.
995 pub fn Z3_mk_bvuge(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
996 /// Two's complement signed greater than or equal to.
997 ///
998 /// The nodes `t1` and `t2` must have the same bit-vector sort.
999 pub fn Z3_mk_bvsge(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1000 /// Unsigned greater than.
1001 ///
1002 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1003 pub fn Z3_mk_bvugt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1004 /// Two's complement signed greater than.
1005 ///
1006 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1007 pub fn Z3_mk_bvsgt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1008 /// Concatenate the given bit-vectors.
1009 ///
1010 /// The nodes `t1` and `t2` must have (possibly different) bit-vector sorts
1011 ///
1012 /// The result is a bit-vector of size `n1+n2`, where `n1` (`n2`) is the size
1013 /// of `t1` (`t2`).
1014 pub fn Z3_mk_concat(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1015 /// Extract the bits `high` down to `low` from a bit-vector of
1016 /// size `m` to yield a new bit-vector of size `n`, where `n = high - low + 1`.
1017 ///
1018 /// The node `t1` must have a bit-vector sort.
1019 pub fn Z3_mk_extract(
1020 c: Z3_context,
1021 high: ::core::ffi::c_uint,
1022 low: ::core::ffi::c_uint,
1023 t1: Z3_ast,
1024 ) -> Option<Z3_ast>;
1025 /// Sign-extend of the given bit-vector to the (signed) equivalent bit-vector of
1026 /// size `m+i`, where `m` is the size of the given
1027 /// bit-vector.
1028 ///
1029 /// The node `t1` must have a bit-vector sort.
1030 pub fn Z3_mk_sign_ext(
1031 c: Z3_context,
1032 i: ::core::ffi::c_uint,
1033 t1: Z3_ast,
1034 ) -> Option<Z3_ast>;
1035 /// Extend the given bit-vector with zeros to the (unsigned) equivalent
1036 /// bit-vector of size `m+i`, where `m` is the size of the
1037 /// given bit-vector.
1038 ///
1039 /// The node `t1` must have a bit-vector sort.
1040 pub fn Z3_mk_zero_ext(
1041 c: Z3_context,
1042 i: ::core::ffi::c_uint,
1043 t1: Z3_ast,
1044 ) -> Option<Z3_ast>;
1045 /// Repeat the given bit-vector up length `i`.
1046 ///
1047 /// The node `t1` must have a bit-vector sort.
1048 pub fn Z3_mk_repeat(
1049 c: Z3_context,
1050 i: ::core::ffi::c_uint,
1051 t1: Z3_ast,
1052 ) -> Option<Z3_ast>;
1053 /// Extracts the bit at position `i` of a bit-vector and
1054 /// yields a boolean.
1055 ///
1056 /// The node `t1` must have a bit-vector sort.
1057 pub fn Z3_mk_bit2bool(
1058 c: Z3_context,
1059 i: ::core::ffi::c_uint,
1060 t1: Z3_ast,
1061 ) -> Option<Z3_ast>;
1062 /// Shift left.
1063 ///
1064 /// It is equivalent to multiplication by `2^x` where `x` is the value of the
1065 /// third argument.
1066 ///
1067 /// NB. The semantics of shift operations varies between environments. This
1068 /// definition does not necessarily capture directly the semantics of the
1069 /// programming language or assembly architecture you are modeling.
1070 ///
1071 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1072 pub fn Z3_mk_bvshl(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1073 /// Logical shift right.
1074 ///
1075 /// It is equivalent to unsigned division by `2^x` where `x` is the
1076 /// value of the third argument.
1077 ///
1078 /// NB. The semantics of shift operations varies between environments. This
1079 /// definition does not necessarily capture directly the semantics of the
1080 /// programming language or assembly architecture you are modeling.
1081 ///
1082 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1083 pub fn Z3_mk_bvlshr(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1084 /// Arithmetic shift right.
1085 ///
1086 /// It is like logical shift right except that the most significant
1087 /// bits of the result always copy the most significant bit of the
1088 /// second argument.
1089 ///
1090 /// The semantics of shift operations varies between environments. This
1091 /// definition does not necessarily capture directly the semantics of the
1092 /// programming language or assembly architecture you are modeling.
1093 ///
1094 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1095 pub fn Z3_mk_bvashr(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
1096 /// Rotate bits of `t1` to the left `i` times.
1097 ///
1098 /// The node `t1` must have a bit-vector sort.
1099 pub fn Z3_mk_rotate_left(
1100 c: Z3_context,
1101 i: ::core::ffi::c_uint,
1102 t1: Z3_ast,
1103 ) -> Option<Z3_ast>;
1104 /// Rotate bits of `t1` to the right `i` times.
1105 ///
1106 /// The node `t1` must have a bit-vector sort.
1107 pub fn Z3_mk_rotate_right(
1108 c: Z3_context,
1109 i: ::core::ffi::c_uint,
1110 t1: Z3_ast,
1111 ) -> Option<Z3_ast>;
1112 /// Rotate bits of `t1` to the left `t2` times.
1113 ///
1114 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1115 pub fn Z3_mk_ext_rotate_left(
1116 c: Z3_context,
1117 t1: Z3_ast,
1118 t2: Z3_ast,
1119 ) -> Option<Z3_ast>;
1120 /// Rotate bits of `t1` to the right `t2` times.
1121 ///
1122 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1123 pub fn Z3_mk_ext_rotate_right(
1124 c: Z3_context,
1125 t1: Z3_ast,
1126 t2: Z3_ast,
1127 ) -> Option<Z3_ast>;
1128 /// Create an `n` bit bit-vector from the integer argument `t1`.
1129 ///
1130 /// The resulting bit-vector has `n` bits, where the i'th bit (counting
1131 /// from 0 to `n`-1) is 1 if `(t1 div 2^i)` mod 2 is 1.
1132 ///
1133 /// The node `t1` must have integer sort.
1134 pub fn Z3_mk_int2bv(
1135 c: Z3_context,
1136 n: ::core::ffi::c_uint,
1137 t1: Z3_ast,
1138 ) -> Option<Z3_ast>;
1139 /// Create an integer from the bit-vector argument `t1`.
1140 /// If `is_signed` is false, then the bit-vector `t1` is treated as unsigned.
1141 /// So the result is non-negative
1142 /// and in the range `[0..2^N-1]`, where N are the number of bits in `t1`.
1143 /// If `is_signed` is true, `t1` is treated as a signed bit-vector.
1144 ///
1145 ///
1146 /// The node `t1` must have a bit-vector sort.
1147 pub fn Z3_mk_bv2int(c: Z3_context, t1: Z3_ast, is_signed: bool) -> Option<Z3_ast>;
1148 /// Create a predicate that checks that the bit-wise addition
1149 /// of `t1` and `t2` does not overflow.
1150 ///
1151 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1152 /// The returned node is of sort Bool.
1153 pub fn Z3_mk_bvadd_no_overflow(
1154 c: Z3_context,
1155 t1: Z3_ast,
1156 t2: Z3_ast,
1157 is_signed: bool,
1158 ) -> Option<Z3_ast>;
1159 /// Create a predicate that checks that the bit-wise signed addition
1160 /// of `t1` and `t2` does not underflow.
1161 ///
1162 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1163 /// The returned node is of sort Bool.
1164 pub fn Z3_mk_bvadd_no_underflow(
1165 c: Z3_context,
1166 t1: Z3_ast,
1167 t2: Z3_ast,
1168 ) -> Option<Z3_ast>;
1169 /// Create a predicate that checks that the bit-wise signed subtraction
1170 /// of `t1` and `t2` does not overflow.
1171 ///
1172 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1173 /// The returned node is of sort Bool.
1174 pub fn Z3_mk_bvsub_no_overflow(
1175 c: Z3_context,
1176 t1: Z3_ast,
1177 t2: Z3_ast,
1178 ) -> Option<Z3_ast>;
1179 /// Create a predicate that checks that the bit-wise subtraction
1180 /// of `t1` and `t2` does not underflow.
1181 ///
1182 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1183 /// The returned node is of sort Bool.
1184 pub fn Z3_mk_bvsub_no_underflow(
1185 c: Z3_context,
1186 t1: Z3_ast,
1187 t2: Z3_ast,
1188 is_signed: bool,
1189 ) -> Option<Z3_ast>;
1190 /// Create a predicate that checks that the bit-wise signed division
1191 /// of `t1` and `t2` does not overflow.
1192 ///
1193 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1194 /// The returned node is of sort Bool.
1195 pub fn Z3_mk_bvsdiv_no_overflow(
1196 c: Z3_context,
1197 t1: Z3_ast,
1198 t2: Z3_ast,
1199 ) -> Option<Z3_ast>;
1200 /// Check that bit-wise negation does not overflow when
1201 /// `t1` is interpreted as a signed bit-vector.
1202 ///
1203 /// The node `t1` must have bit-vector sort.
1204 /// The returned node is of sort Bool.
1205 pub fn Z3_mk_bvneg_no_overflow(c: Z3_context, t1: Z3_ast) -> Option<Z3_ast>;
1206 /// Create a predicate that checks that the bit-wise multiplication
1207 /// of `t1` and `t2` does not overflow.
1208 ///
1209 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1210 /// The returned node is of sort Bool.
1211 pub fn Z3_mk_bvmul_no_overflow(
1212 c: Z3_context,
1213 t1: Z3_ast,
1214 t2: Z3_ast,
1215 is_signed: bool,
1216 ) -> Option<Z3_ast>;
1217 /// Create a predicate that checks that the bit-wise signed multiplication
1218 /// of `t1` and `t2` does not underflow.
1219 ///
1220 /// The nodes `t1` and `t2` must have the same bit-vector sort.
1221 /// The returned node is of sort Bool.
1222 pub fn Z3_mk_bvmul_no_underflow(
1223 c: Z3_context,
1224 t1: Z3_ast,
1225 t2: Z3_ast,
1226 ) -> Option<Z3_ast>;
1227 /// Array read.
1228 /// The argument `a` is the array and `i` is the index of the array that gets read.
1229 ///
1230 /// The node `a` must have an array sort `[domain -> range]`,
1231 /// and `i` must have the sort `domain`.
1232 /// The sort of the result is `range`.
1233 ///
1234 /// # See also
1235 ///
1236 /// - [`Z3_mk_array_sort`]
1237 /// - [`Z3_mk_store`]
1238 pub fn Z3_mk_select(c: Z3_context, a: Z3_ast, i: Z3_ast) -> Option<Z3_ast>;
1239 /// n-ary Array read.
1240 /// The argument `a` is the array and `idxs` are the indices of the array that gets read.
1241 pub fn Z3_mk_select_n(
1242 c: Z3_context,
1243 a: Z3_ast,
1244 n: ::core::ffi::c_uint,
1245 idxs: *const Z3_ast,
1246 ) -> Option<Z3_ast>;
1247 /// Array update.
1248 ///
1249 /// The node `a` must have an array sort `[domain -> range]`, `i` must have sort `domain`,
1250 /// `v` must have sort range. The sort of the result is `[domain -> range]`.
1251 /// The semantics of this function is given by the theory of arrays described in the SMT-LIB
1252 /// standard. See <http://smtlib.org> for more details.
1253 /// The result of this function is an array that is equal to `a` (with respect to `select`)
1254 /// on all indices except for `i`, where it maps to `v` (and the `select` of `a` with
1255 /// respect to `i` may be a different value).
1256 ///
1257 /// # See also
1258 ///
1259 /// - [`Z3_mk_array_sort`]
1260 /// - [`Z3_mk_select`]
1261 pub fn Z3_mk_store(c: Z3_context, a: Z3_ast, i: Z3_ast, v: Z3_ast) -> Option<Z3_ast>;
1262 /// n-ary Array update.
1263 pub fn Z3_mk_store_n(
1264 c: Z3_context,
1265 a: Z3_ast,
1266 n: ::core::ffi::c_uint,
1267 idxs: *const Z3_ast,
1268 v: Z3_ast,
1269 ) -> Option<Z3_ast>;
1270 /// Create the constant array.
1271 ///
1272 /// The resulting term is an array, such that a `select` on an arbitrary index
1273 /// produces the value `v`.
1274 ///
1275 /// - `c`: logical context.
1276 /// - `domain`: domain sort for the array.
1277 /// - `v`: value that the array maps to.
1278 pub fn Z3_mk_const_array(
1279 c: Z3_context,
1280 domain: Z3_sort,
1281 v: Z3_ast,
1282 ) -> Option<Z3_ast>;
1283 /// Map f on the argument arrays.
1284 ///
1285 /// The `n` nodes `args` must be of array sorts `[domain_i -> range_i]`.
1286 /// The function declaration `f` must have type ` range_1 .. range_n -> range`.
1287 /// `v` must have sort range. The sort of the result is `[domain_i -> range]`.
1288 ///
1289 /// # See also
1290 ///
1291 /// - [`Z3_mk_array_sort`]
1292 /// - [`Z3_mk_store`]
1293 /// - [`Z3_mk_select`]
1294 pub fn Z3_mk_map(
1295 c: Z3_context,
1296 f: Z3_func_decl,
1297 n: ::core::ffi::c_uint,
1298 args: *const Z3_ast,
1299 ) -> Option<Z3_ast>;
1300 /// Access the array default value.
1301 /// Produces the default range value, for arrays that can be represented as
1302 /// finite maps with a default range value.
1303 ///
1304 /// - `c`: logical context.
1305 /// - `array`: array value whose default range value is accessed.
1306 pub fn Z3_mk_array_default(c: Z3_context, array: Z3_ast) -> Option<Z3_ast>;
1307 /// Create array with the same interpretation as a function.
1308 /// The array satisfies the property (f x) = (select (_ as-array f) x)
1309 /// for every argument x.
1310 pub fn Z3_mk_as_array(c: Z3_context, f: Z3_func_decl) -> Option<Z3_ast>;
1311 /// Create Set type.
1312 pub fn Z3_mk_set_sort(c: Z3_context, ty: Z3_sort) -> Option<Z3_sort>;
1313 /// Create the empty set.
1314 pub fn Z3_mk_empty_set(c: Z3_context, domain: Z3_sort) -> Option<Z3_ast>;
1315 /// Create the full set.
1316 pub fn Z3_mk_full_set(c: Z3_context, domain: Z3_sort) -> Option<Z3_ast>;
1317 /// Add an element to a set.
1318 ///
1319 /// The first argument must be a set, the second an element.
1320 pub fn Z3_mk_set_add(c: Z3_context, set: Z3_ast, elem: Z3_ast) -> Option<Z3_ast>;
1321 /// Remove an element to a set.
1322 ///
1323 /// The first argument must be a set, the second an element.
1324 pub fn Z3_mk_set_del(c: Z3_context, set: Z3_ast, elem: Z3_ast) -> Option<Z3_ast>;
1325 /// Take the union of a list of sets.
1326 pub fn Z3_mk_set_union(
1327 c: Z3_context,
1328 num_args: ::core::ffi::c_uint,
1329 args: *const Z3_ast,
1330 ) -> Option<Z3_ast>;
1331 /// Take the intersection of a list of sets.
1332 pub fn Z3_mk_set_intersect(
1333 c: Z3_context,
1334 num_args: ::core::ffi::c_uint,
1335 args: *const Z3_ast,
1336 ) -> Option<Z3_ast>;
1337 /// Take the set difference between two sets.
1338 pub fn Z3_mk_set_difference(
1339 c: Z3_context,
1340 arg1: Z3_ast,
1341 arg2: Z3_ast,
1342 ) -> Option<Z3_ast>;
1343 /// Take the complement of a set.
1344 pub fn Z3_mk_set_complement(c: Z3_context, arg: Z3_ast) -> Option<Z3_ast>;
1345 /// Check for set membership.
1346 ///
1347 /// The first argument should be an element type of the set.
1348 pub fn Z3_mk_set_member(c: Z3_context, elem: Z3_ast, set: Z3_ast) -> Option<Z3_ast>;
1349 /// Check for subsetness of sets.
1350 pub fn Z3_mk_set_subset(c: Z3_context, arg1: Z3_ast, arg2: Z3_ast) -> Option<Z3_ast>;
1351 /// Create array extensionality index given two arrays with the same sort.
1352 /// The meaning is given by the axiom:
1353 /// (=> (= (select A (array-ext A B)) (select B (array-ext A B))) (= A B))
1354 pub fn Z3_mk_array_ext(c: Z3_context, arg1: Z3_ast, arg2: Z3_ast) -> Option<Z3_ast>;
1355 /// Create a numeral of a given sort.
1356 ///
1357 /// - `c`: logical context.
1358 /// - `numeral`: A string representing the numeral value in decimal notation. The string may be of the form `[num]*[.[num]*][E[+|-][num]+]`.
1359 /// If the given sort is a real, then the numeral can be a rational, that is, a string of the form `[num]* / [num]*` .
1360 /// - `ty`: The sort of the numeral. In the current implementation, the given sort can be an int, real, finite-domain, or bit-vectors of arbitrary size.
1361 ///
1362 /// # See also
1363 ///
1364 /// - [`Z3_mk_int`]
1365 /// - [`Z3_mk_unsigned_int`]
1366 pub fn Z3_mk_numeral(
1367 c: Z3_context,
1368 numeral: Z3_string,
1369 ty: Z3_sort,
1370 ) -> Option<Z3_ast>;
1371 /// Create a real from a fraction.
1372 ///
1373 /// - `c`: logical context.
1374 /// - `num`: numerator of rational.
1375 /// - `den`: denominator of rational.
1376 ///
1377 /// # Preconditions
1378 ///
1379 /// - `den != 0`
1380 ///
1381 /// # See also
1382 ///
1383 /// - [`Z3_mk_numeral`]
1384 /// - [`Z3_mk_int`]
1385 /// - [`Z3_mk_real_int64`]
1386 /// - [`Z3_mk_unsigned_int`]
1387 pub fn Z3_mk_real(
1388 c: Z3_context,
1389 num: ::core::ffi::c_int,
1390 den: ::core::ffi::c_int,
1391 ) -> Option<Z3_ast>;
1392 /// Create a real from a fraction of int64.
1393 ///
1394 /// # See also
1395 ///
1396 /// - [`Z3_mk_real`]
1397 pub fn Z3_mk_real_int64(c: Z3_context, num: i64, den: i64) -> Option<Z3_ast>;
1398 /// Create a numeral of an int, bit-vector, or finite-domain sort.
1399 ///
1400 /// This function can be used to create numerals that fit in a machine integer.
1401 /// It is slightly faster than [`Z3_mk_numeral`] since it is not necessary to parse a string.
1402 ///
1403 /// # See also
1404 ///
1405 /// - [`Z3_mk_numeral`]
1406 pub fn Z3_mk_int(
1407 c: Z3_context,
1408 v: ::core::ffi::c_int,
1409 ty: Z3_sort,
1410 ) -> Option<Z3_ast>;
1411 /// Create a numeral of a int, bit-vector, or finite-domain sort.
1412 ///
1413 /// This function can be used to create numerals that fit in a machine unsigned integer.
1414 /// It is slightly faster than [`Z3_mk_numeral`] since it is not necessary to parse a string.
1415 ///
1416 /// # See also
1417 ///
1418 /// - [`Z3_mk_numeral`]
1419 pub fn Z3_mk_unsigned_int(
1420 c: Z3_context,
1421 v: ::core::ffi::c_uint,
1422 ty: Z3_sort,
1423 ) -> Option<Z3_ast>;
1424 /// Create a numeral of a int, bit-vector, or finite-domain sort.
1425 ///
1426 /// This function can be used to create numerals that fit in a machine `int64_t` integer.
1427 /// It is slightly faster than [`Z3_mk_numeral`] since it is not necessary to parse a string.
1428 ///
1429 /// # See also
1430 ///
1431 /// - [`Z3_mk_numeral`]
1432 pub fn Z3_mk_int64(c: Z3_context, v: i64, ty: Z3_sort) -> Option<Z3_ast>;
1433 /// Create a numeral of a int, bit-vector, or finite-domain sort.
1434 ///
1435 /// This function can be used to create numerals that fit in a machine `uint64_t` integer.
1436 /// It is slightly faster than [`Z3_mk_numeral`] since it is not necessary to parse a string.
1437 ///
1438 /// # See also
1439 ///
1440 /// - [`Z3_mk_numeral`]
1441 pub fn Z3_mk_unsigned_int64(c: Z3_context, v: u64, ty: Z3_sort) -> Option<Z3_ast>;
1442 /// create a bit-vector numeral from a vector of Booleans.
1443 ///
1444 /// # See also
1445 ///
1446 /// - [`Z3_mk_numeral`]
1447 pub fn Z3_mk_bv_numeral(
1448 c: Z3_context,
1449 sz: ::core::ffi::c_uint,
1450 bits: *const bool,
1451 ) -> Option<Z3_ast>;
1452 /// Create a sequence sort out of the sort for the elements.
1453 pub fn Z3_mk_seq_sort(c: Z3_context, s: Z3_sort) -> Option<Z3_sort>;
1454 /// Check if `s` is a sequence sort.
1455 pub fn Z3_is_seq_sort(c: Z3_context, s: Z3_sort) -> bool;
1456 /// Retrieve basis sort for sequence sort.
1457 pub fn Z3_get_seq_sort_basis(c: Z3_context, s: Z3_sort) -> Option<Z3_sort>;
1458 /// Create a regular expression sort out of a sequence sort.
1459 pub fn Z3_mk_re_sort(c: Z3_context, seq: Z3_sort) -> Option<Z3_sort>;
1460 /// Check if `s` is a regular expression sort.
1461 pub fn Z3_is_re_sort(c: Z3_context, s: Z3_sort) -> bool;
1462 /// Retrieve basis sort for regex sort.
1463 pub fn Z3_get_re_sort_basis(c: Z3_context, s: Z3_sort) -> Option<Z3_sort>;
1464 /// Create a sort for unicode strings.
1465 ///
1466 /// The sort for characters can be changed to ASCII by setting
1467 /// the global parameter `encoding` to `ascii`, or alternative
1468 /// to 16 bit characters by setting `encoding` to `bmp`.
1469 pub fn Z3_mk_string_sort(c: Z3_context) -> Option<Z3_sort>;
1470 /// Create a sort for unicode characters.
1471 ///
1472 /// The sort for characters can be changed to ASCII by setting
1473 /// the global parameter `encoding` to `ascii`, or alternative
1474 /// to 16 bit characters by setting `encoding` to `bmp`.
1475 pub fn Z3_mk_char_sort(c: Z3_context) -> Option<Z3_sort>;
1476 /// Check if `s` is a string sort.
1477 pub fn Z3_is_string_sort(c: Z3_context, s: Z3_sort) -> bool;
1478 /// Check if `s` is a character sort.
1479 pub fn Z3_is_char_sort(c: Z3_context, s: Z3_sort) -> bool;
1480 /// Create a string constant out of the string that is passed in
1481 /// The string may contain escape encoding for non-printable characters
1482 /// or characters outside of the basic printable ASCII range. For example,
1483 /// the escape encoding \\u{0} represents the character 0 and the encoding
1484 /// \\u{100} represents the character 256.
1485 pub fn Z3_mk_string(c: Z3_context, s: Z3_string) -> Option<Z3_ast>;
1486 /// Create a string constant out of the string that is passed in
1487 /// It takes the length of the string as well to take into account
1488 /// 0 characters. The string is treated as if it is unescaped so a sequence
1489 /// of characters \\u{0} is treated as 5 characters and not the character 0.
1490 pub fn Z3_mk_lstring(
1491 c: Z3_context,
1492 len: ::core::ffi::c_uint,
1493 s: Z3_string,
1494 ) -> Option<Z3_ast>;
1495 /// Create a string constant out of the string that is passed in
1496 /// It takes the length of the string as well to take into account
1497 /// 0 characters. The string is unescaped.
1498 pub fn Z3_mk_u32string(
1499 c: Z3_context,
1500 len: ::core::ffi::c_uint,
1501 chars: *const ::core::ffi::c_uint,
1502 ) -> Option<Z3_ast>;
1503 /// Determine if `s` is a string constant.
1504 pub fn Z3_is_string(c: Z3_context, s: Z3_ast) -> bool;
1505 /// Retrieve the string constant stored in `s`.
1506 /// Characters outside the basic printable ASCII range are escaped.
1507 ///
1508 /// # Preconditions
1509 ///
1510 /// - ` Z3_is_string(c, s)`
1511 pub fn Z3_get_string(c: Z3_context, s: Z3_ast) -> Z3_string;
1512 /// Retrieve the string constant stored in `s`. The string can contain escape sequences.
1513 /// Characters in the range 1 to 255 are literal.
1514 /// Characters in the range 0, and 256 above are escaped.
1515 ///
1516 /// # Preconditions
1517 ///
1518 /// - ` Z3_is_string(c, s)`
1519 pub fn Z3_get_lstring(
1520 c: Z3_context,
1521 s: Z3_ast,
1522 length: *mut ::core::ffi::c_uint,
1523 ) -> Z3_char_ptr;
1524 /// Retrieve the length of the unescaped string constant stored in `s`.
1525 ///
1526 /// # Preconditions
1527 ///
1528 /// - ` Z3_is_string(c, s)`
1529 pub fn Z3_get_string_length(c: Z3_context, s: Z3_ast) -> ::core::ffi::c_uint;
1530 /// Retrieve the unescaped string constant stored in `s`.
1531 ///
1532 /// # Preconditions
1533 ///
1534 /// - ` Z3_is_string(c, s)`
1535 /// - `length contains the number of characters in s`
1536 pub fn Z3_get_string_contents(
1537 c: Z3_context,
1538 s: Z3_ast,
1539 length: ::core::ffi::c_uint,
1540 contents: *mut ::core::ffi::c_uint,
1541 );
1542 /// Create an empty sequence of the sequence sort `seq`.
1543 ///
1544 /// # Preconditions
1545 ///
1546 /// - `s is a sequence sort.`
1547 pub fn Z3_mk_seq_empty(c: Z3_context, seq: Z3_sort) -> Option<Z3_ast>;
1548 /// Create a unit sequence of `a`.
1549 pub fn Z3_mk_seq_unit(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
1550 /// Concatenate sequences.
1551 ///
1552 /// # Preconditions
1553 ///
1554 /// - `n > 0`
1555 pub fn Z3_mk_seq_concat(
1556 c: Z3_context,
1557 n: ::core::ffi::c_uint,
1558 args: *const Z3_ast,
1559 ) -> Option<Z3_ast>;
1560 /// Check if `prefix` is a prefix of `s`.
1561 ///
1562 /// # Preconditions
1563 ///
1564 /// - `prefix and s are the same sequence sorts.`
1565 pub fn Z3_mk_seq_prefix(c: Z3_context, prefix: Z3_ast, s: Z3_ast) -> Option<Z3_ast>;
1566 /// Check if `suffix` is a suffix of `s`.
1567 ///
1568 /// # Preconditions
1569 ///
1570 /// - ``suffix` and `s` are the same sequence sorts.`
1571 pub fn Z3_mk_seq_suffix(c: Z3_context, suffix: Z3_ast, s: Z3_ast) -> Option<Z3_ast>;
1572 /// Check if `container` contains `containee`.
1573 ///
1574 /// # Preconditions
1575 ///
1576 /// - ``container` and `containee` are the same sequence sorts.`
1577 pub fn Z3_mk_seq_contains(
1578 c: Z3_context,
1579 container: Z3_ast,
1580 containee: Z3_ast,
1581 ) -> Option<Z3_ast>;
1582 /// Check if `s1` is lexicographically strictly less than `s2`.
1583 ///
1584 /// # Preconditions
1585 ///
1586 /// - ``s1` and `s2` are strings`
1587 pub fn Z3_mk_str_lt(c: Z3_context, prefix: Z3_ast, s: Z3_ast) -> Option<Z3_ast>;
1588 /// Check if `s1` is equal or lexicographically strictly less than `s2`.
1589 ///
1590 /// # Preconditions
1591 ///
1592 /// - ``s1` and `s2` are strings`
1593 pub fn Z3_mk_str_le(c: Z3_context, prefix: Z3_ast, s: Z3_ast) -> Option<Z3_ast>;
1594 /// Extract subsequence starting at `offset` of `length`.
1595 pub fn Z3_mk_seq_extract(
1596 c: Z3_context,
1597 s: Z3_ast,
1598 offset: Z3_ast,
1599 length: Z3_ast,
1600 ) -> Option<Z3_ast>;
1601 /// Replace the first occurrence of `src` with `dst` in `s`.
1602 pub fn Z3_mk_seq_replace(
1603 c: Z3_context,
1604 s: Z3_ast,
1605 src: Z3_ast,
1606 dst: Z3_ast,
1607 ) -> Option<Z3_ast>;
1608 /// Replace all occurrences of `src` with `dst` in `s`.
1609 pub fn Z3_mk_seq_replace_all(
1610 c: Z3_context,
1611 s: Z3_ast,
1612 src: Z3_ast,
1613 dst: Z3_ast,
1614 ) -> Option<Z3_ast>;
1615 /// Replace the first occurrence of regular expression `re` with `dst` in `s`.
1616 pub fn Z3_mk_seq_replace_re(
1617 c: Z3_context,
1618 s: Z3_ast,
1619 re: Z3_ast,
1620 dst: Z3_ast,
1621 ) -> Option<Z3_ast>;
1622 /// Replace all occurrences of regular expression `re` with `dst` in `s`.
1623 pub fn Z3_mk_seq_replace_re_all(
1624 c: Z3_context,
1625 s: Z3_ast,
1626 re: Z3_ast,
1627 dst: Z3_ast,
1628 ) -> Option<Z3_ast>;
1629 /// Retrieve from `s` the unit sequence positioned at position `index`.
1630 /// The sequence is empty if the index is out of bounds.
1631 pub fn Z3_mk_seq_at(c: Z3_context, s: Z3_ast, index: Z3_ast) -> Option<Z3_ast>;
1632 /// Retrieve from `s` the element positioned at position `index`.
1633 /// The function is under-specified if the index is out of bounds.
1634 pub fn Z3_mk_seq_nth(c: Z3_context, s: Z3_ast, index: Z3_ast) -> Option<Z3_ast>;
1635 /// Return the length of the sequence `s`.
1636 pub fn Z3_mk_seq_length(c: Z3_context, s: Z3_ast) -> Option<Z3_ast>;
1637 /// Return index of the first occurrence of `substr` in `s` starting from offset `offset`.
1638 /// If `s` does not contain `substr`, then the value is -1, if `offset` is the length of `s`, then the value is -1 as well.
1639 /// The value is -1 if `offset` is negative or larger than the length of `s`.
1640 pub fn Z3_mk_seq_index(
1641 c: Z3_context,
1642 s: Z3_ast,
1643 substr: Z3_ast,
1644 offset: Z3_ast,
1645 ) -> Option<Z3_ast>;
1646 /// Return index of the last occurrence of `substr` in `s`.
1647 /// If `s` does not contain `substr`, then the value is -1,
1648 pub fn Z3_mk_seq_last_index(
1649 c: Z3_context,
1650 s: Z3_ast,
1651 substr: Z3_ast,
1652 ) -> Option<Z3_ast>;
1653 /// Create a map of the function `f` over the sequence `s`.
1654 pub fn Z3_mk_seq_map(c: Z3_context, f: Z3_ast, s: Z3_ast) -> Option<Z3_ast>;
1655 /// Create a map of the function `f` over the sequence `s` starting at index `i`.
1656 pub fn Z3_mk_seq_mapi(
1657 c: Z3_context,
1658 f: Z3_ast,
1659 i: Z3_ast,
1660 s: Z3_ast,
1661 ) -> Option<Z3_ast>;
1662 /// Create a fold of the function `f` over the sequence `s` with accumulator a.
1663 pub fn Z3_mk_seq_foldl(
1664 c: Z3_context,
1665 f: Z3_ast,
1666 a: Z3_ast,
1667 s: Z3_ast,
1668 ) -> Option<Z3_ast>;
1669 /// Create a fold with index tracking of the function `f` over the sequence `s` with accumulator `a` starting at index `i`.
1670 pub fn Z3_mk_seq_foldli(
1671 c: Z3_context,
1672 f: Z3_ast,
1673 i: Z3_ast,
1674 a: Z3_ast,
1675 s: Z3_ast,
1676 ) -> Option<Z3_ast>;
1677 /// Convert string to integer.
1678 pub fn Z3_mk_str_to_int(c: Z3_context, s: Z3_ast) -> Option<Z3_ast>;
1679 /// Integer to string conversion.
1680 pub fn Z3_mk_int_to_str(c: Z3_context, s: Z3_ast) -> Option<Z3_ast>;
1681 /// String to code conversion.
1682 pub fn Z3_mk_string_to_code(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
1683 /// Code to string conversion.
1684 pub fn Z3_mk_string_from_code(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
1685 /// Unsigned bit-vector to string conversion.
1686 pub fn Z3_mk_ubv_to_str(c: Z3_context, s: Z3_ast) -> Option<Z3_ast>;
1687 /// Signed bit-vector to string conversion.
1688 pub fn Z3_mk_sbv_to_str(c: Z3_context, s: Z3_ast) -> Option<Z3_ast>;
1689 /// Create a regular expression that accepts the sequence `seq`.
1690 pub fn Z3_mk_seq_to_re(c: Z3_context, seq: Z3_ast) -> Option<Z3_ast>;
1691 /// Check if `seq` is in the language generated by the regular expression `re`.
1692 pub fn Z3_mk_seq_in_re(c: Z3_context, seq: Z3_ast, re: Z3_ast) -> Option<Z3_ast>;
1693 /// Create the regular language `re`+.
1694 pub fn Z3_mk_re_plus(c: Z3_context, re: Z3_ast) -> Option<Z3_ast>;
1695 /// Create the regular language `re`*.
1696 pub fn Z3_mk_re_star(c: Z3_context, re: Z3_ast) -> Option<Z3_ast>;
1697 /// Create the regular language `[re]`.
1698 pub fn Z3_mk_re_option(c: Z3_context, re: Z3_ast) -> Option<Z3_ast>;
1699 /// Create the union of the regular languages.
1700 ///
1701 /// # Preconditions
1702 ///
1703 /// - `n > 0`
1704 pub fn Z3_mk_re_union(
1705 c: Z3_context,
1706 n: ::core::ffi::c_uint,
1707 args: *const Z3_ast,
1708 ) -> Option<Z3_ast>;
1709 /// Create the concatenation of the regular languages.
1710 ///
1711 /// # Preconditions
1712 ///
1713 /// - `n > 0`
1714 pub fn Z3_mk_re_concat(
1715 c: Z3_context,
1716 n: ::core::ffi::c_uint,
1717 args: *const Z3_ast,
1718 ) -> Option<Z3_ast>;
1719 /// Create the range regular expression over two sequences of length 1.
1720 pub fn Z3_mk_re_range(c: Z3_context, lo: Z3_ast, hi: Z3_ast) -> Option<Z3_ast>;
1721 /// Create a regular expression that accepts all singleton sequences of the regular expression sort
1722 pub fn Z3_mk_re_allchar(c: Z3_context, regex_sort: Z3_sort) -> Option<Z3_ast>;
1723 /// Create a regular expression loop. The supplied regular expression `r` is repeated
1724 /// between `lo` and `hi` times. The `lo` should be below `hi` with one exception: when
1725 /// supplying the value `hi` as 0, the meaning is to repeat the argument `r` at least
1726 /// `lo` number of times, and with an unbounded upper bound.
1727 pub fn Z3_mk_re_loop(
1728 c: Z3_context,
1729 r: Z3_ast,
1730 lo: ::core::ffi::c_uint,
1731 hi: ::core::ffi::c_uint,
1732 ) -> Option<Z3_ast>;
1733 /// Create a power regular expression.
1734 pub fn Z3_mk_re_power(
1735 c: Z3_context,
1736 re: Z3_ast,
1737 n: ::core::ffi::c_uint,
1738 ) -> Option<Z3_ast>;
1739 /// Create the intersection of the regular languages.
1740 ///
1741 /// # Preconditions
1742 ///
1743 /// - `n > 0`
1744 pub fn Z3_mk_re_intersect(
1745 c: Z3_context,
1746 n: ::core::ffi::c_uint,
1747 args: *const Z3_ast,
1748 ) -> Option<Z3_ast>;
1749 /// Create the complement of the regular language `re`.
1750 pub fn Z3_mk_re_complement(c: Z3_context, re: Z3_ast) -> Option<Z3_ast>;
1751 /// Create the difference of regular expressions.
1752 pub fn Z3_mk_re_diff(c: Z3_context, re1: Z3_ast, re2: Z3_ast) -> Option<Z3_ast>;
1753 /// Create an empty regular expression of sort `re`.
1754 ///
1755 /// # Preconditions
1756 ///
1757 /// - `re is a regular expression sort.`
1758 pub fn Z3_mk_re_empty(c: Z3_context, re: Z3_sort) -> Option<Z3_ast>;
1759 /// Create an universal regular expression of sort `re`.
1760 ///
1761 /// # Preconditions
1762 ///
1763 /// - `re is a regular expression sort.`
1764 pub fn Z3_mk_re_full(c: Z3_context, re: Z3_sort) -> Option<Z3_ast>;
1765 /// Create a character literal
1766 pub fn Z3_mk_char(c: Z3_context, ch: ::core::ffi::c_uint) -> Option<Z3_ast>;
1767 /// Create less than or equal to between two characters.
1768 pub fn Z3_mk_char_le(c: Z3_context, ch1: Z3_ast, ch2: Z3_ast) -> Option<Z3_ast>;
1769 /// Create an integer (code point) from character.
1770 pub fn Z3_mk_char_to_int(c: Z3_context, ch: Z3_ast) -> Option<Z3_ast>;
1771 /// Create a bit-vector (code point) from character.
1772 pub fn Z3_mk_char_to_bv(c: Z3_context, ch: Z3_ast) -> Option<Z3_ast>;
1773 /// Create a character from a bit-vector (code point).
1774 pub fn Z3_mk_char_from_bv(c: Z3_context, bv: Z3_ast) -> Option<Z3_ast>;
1775 /// Create a check if the character is a digit.
1776 pub fn Z3_mk_char_is_digit(c: Z3_context, ch: Z3_ast) -> Option<Z3_ast>;
1777 /// create a linear ordering relation over signature `a`.
1778 /// The relation is identified by the index `id`.
1779 pub fn Z3_mk_linear_order(
1780 c: Z3_context,
1781 a: Z3_sort,
1782 id: ::core::ffi::c_uint,
1783 ) -> Option<Z3_func_decl>;
1784 /// create a partial ordering relation over signature `a` and index `id`.
1785 pub fn Z3_mk_partial_order(
1786 c: Z3_context,
1787 a: Z3_sort,
1788 id: ::core::ffi::c_uint,
1789 ) -> Option<Z3_func_decl>;
1790 /// create a piecewise linear ordering relation over signature `a` and index `id`.
1791 pub fn Z3_mk_piecewise_linear_order(
1792 c: Z3_context,
1793 a: Z3_sort,
1794 id: ::core::ffi::c_uint,
1795 ) -> Option<Z3_func_decl>;
1796 /// create a tree ordering relation over signature `a` identified using index `id`.
1797 pub fn Z3_mk_tree_order(
1798 c: Z3_context,
1799 a: Z3_sort,
1800 id: ::core::ffi::c_uint,
1801 ) -> Option<Z3_func_decl>;
1802 /// create transitive closure of binary relation.
1803 ///
1804 ///
1805 /// The resulting relation f+ represents the transitive closure of f.
1806 ///
1807 /// # Preconditions
1808 ///
1809 /// - `f is a binary relation, such that the two arguments have the same sorts.`
1810 pub fn Z3_mk_transitive_closure(
1811 c: Z3_context,
1812 f: Z3_func_decl,
1813 ) -> Option<Z3_func_decl>;
1814 /// Create a pattern for quantifier instantiation.
1815 ///
1816 /// Z3 uses pattern matching to instantiate quantifiers. If a
1817 /// pattern is not provided for a quantifier, then Z3 will
1818 /// automatically compute a set of patterns for it. However, for
1819 /// optimal performance, the user should provide the patterns.
1820 ///
1821 /// Patterns comprise a list of terms. The list should be
1822 /// non-empty. If the list comprises of more than one term, it is
1823 /// a called a multi-pattern.
1824 ///
1825 /// In general, one can pass in a list of (multi-)patterns in the
1826 /// quantifier constructor.
1827 ///
1828 /// # See also
1829 ///
1830 /// - [`Z3_mk_forall`]
1831 /// - [`Z3_mk_exists`]
1832 pub fn Z3_mk_pattern(
1833 c: Z3_context,
1834 num_patterns: ::core::ffi::c_uint,
1835 terms: *const Z3_ast,
1836 ) -> Option<Z3_pattern>;
1837 /// Create a variable.
1838 ///
1839 /// Variables are intended to be bound by a scope created by a quantifier. So we call them bound variables
1840 /// even if they appear as free variables in the expression produced by `Z3_mk_bound`.
1841 ///
1842 /// Bound variables are indexed by de-Bruijn indices. It is perhaps easiest to explain
1843 /// the meaning of de-Bruijn indices by indicating the compilation process from
1844 /// non-de-Bruijn formulas to de-Bruijn format.
1845 ///
1846 /// ```text
1847 /// abs(forall (x1) phi) = forall (x1) abs1(phi, x1, 0)
1848 /// abs(forall (x1, x2) phi) = abs(forall (x1) abs(forall (x2) phi))
1849 /// abs1(x, x, n) = b_n
1850 /// abs1(y, x, n) = y
1851 /// abs1(f(t1,...,tn), x, n) = f(abs1(t1,x,n), ..., abs1(tn,x,n))
1852 /// abs1(forall (x1) phi, x, n) = forall (x1) (abs1(phi, x, n+1))
1853 /// ```
1854 ///
1855 /// The last line is significant: the index of a bound variable is different depending
1856 /// on the scope in which it appears. The deeper x appears, the higher is its
1857 /// index.
1858 ///
1859 /// - `c`: logical context
1860 /// - `index`: de-Bruijn index
1861 /// - `ty`: sort of the bound variable
1862 ///
1863 /// # See also
1864 ///
1865 /// - [`Z3_mk_forall`]
1866 /// - [`Z3_mk_exists`]
1867 pub fn Z3_mk_bound(
1868 c: Z3_context,
1869 index: ::core::ffi::c_uint,
1870 ty: Z3_sort,
1871 ) -> Option<Z3_ast>;
1872 /// Create a forall formula. It takes an expression `body` that contains bound variables
1873 /// of the same sorts as the sorts listed in the array `sorts`. The bound variables are de-Bruijn indices created
1874 /// using [`Z3_mk_bound`]. The array `decl_names` contains the names that the quantified formula uses for the
1875 /// bound variables. Z3 applies the convention that the last element in the `decl_names` and `sorts` array
1876 /// refers to the variable with index 0, the second to last element of `decl_names` and `sorts` refers
1877 /// to the variable with index 1, etc.
1878 ///
1879 /// - `c`: logical context.
1880 /// - `weight`: quantifiers are associated with weights indicating the importance of using the quantifier during instantiation. By default, pass the weight 0.
1881 /// - `num_patterns`: number of patterns.
1882 /// - `patterns`: array containing the patterns created using [`Z3_mk_pattern`].
1883 /// - `num_decls`: number of variables to be bound.
1884 /// - `sorts`: the sorts of the bound variables.
1885 /// - `decl_names`: names of the bound variables
1886 /// - `body`: the body of the quantifier.
1887 ///
1888 /// # See also
1889 ///
1890 /// - [`Z3_mk_pattern`]
1891 /// - [`Z3_mk_bound`]
1892 /// - [`Z3_mk_exists`]
1893 pub fn Z3_mk_forall(
1894 c: Z3_context,
1895 weight: ::core::ffi::c_uint,
1896 num_patterns: ::core::ffi::c_uint,
1897 patterns: *const Z3_pattern,
1898 num_decls: ::core::ffi::c_uint,
1899 sorts: *const Z3_sort,
1900 decl_names: *const Z3_symbol,
1901 body: Z3_ast,
1902 ) -> Option<Z3_ast>;
1903 /// Create an exists formula. Similar to [`Z3_mk_forall`].
1904 ///
1905 /// # See also
1906 ///
1907 /// - [`Z3_mk_pattern`]
1908 /// - [`Z3_mk_bound`]
1909 /// - [`Z3_mk_forall`]
1910 /// - [`Z3_mk_quantifier`]
1911 pub fn Z3_mk_exists(
1912 c: Z3_context,
1913 weight: ::core::ffi::c_uint,
1914 num_patterns: ::core::ffi::c_uint,
1915 patterns: *const Z3_pattern,
1916 num_decls: ::core::ffi::c_uint,
1917 sorts: *const Z3_sort,
1918 decl_names: *const Z3_symbol,
1919 body: Z3_ast,
1920 ) -> Option<Z3_ast>;
1921 /// Create a quantifier - universal or existential, with pattern hints.
1922 /// See the documentation for [`Z3_mk_forall`] for an explanation of the parameters.
1923 ///
1924 /// - `c`: logical context.
1925 /// - `is_forall`: flag to indicate if this is a universal or existential quantifier.
1926 /// - `weight`: quantifiers are associated with weights indicating the importance of using the quantifier during instantiation. By default, pass the weight 0.
1927 /// - `num_patterns`: number of patterns.
1928 /// - `patterns`: array containing the patterns created using [`Z3_mk_pattern`].
1929 /// - `num_decls`: number of variables to be bound.
1930 /// - `sorts`: array of sorts of the bound variables.
1931 /// - `decl_names`: names of the bound variables.
1932 /// - `body`: the body of the quantifier.
1933 ///
1934 /// # See also
1935 ///
1936 /// - [`Z3_mk_pattern`]
1937 /// - [`Z3_mk_bound`]
1938 /// - [`Z3_mk_forall`]
1939 /// - [`Z3_mk_exists`]
1940 pub fn Z3_mk_quantifier(
1941 c: Z3_context,
1942 is_forall: bool,
1943 weight: ::core::ffi::c_uint,
1944 num_patterns: ::core::ffi::c_uint,
1945 patterns: *const Z3_pattern,
1946 num_decls: ::core::ffi::c_uint,
1947 sorts: *const Z3_sort,
1948 decl_names: *const Z3_symbol,
1949 body: Z3_ast,
1950 ) -> Option<Z3_ast>;
1951 /// Create a quantifier - universal or existential, with pattern hints, no patterns, and attributes
1952 ///
1953 /// - `c`: logical context.
1954 /// - `is_forall`: flag to indicate if this is a universal or existential quantifier.
1955 /// - `quantifier_id`: identifier to identify quantifier
1956 /// - `skolem_id`: identifier to identify skolem constants introduced by quantifier.
1957 /// - `weight`: quantifiers are associated with weights indicating the importance of using the quantifier during instantiation. By default, pass the weight 0.
1958 /// - `num_patterns`: number of patterns.
1959 /// - `patterns`: array containing the patterns created using [`Z3_mk_pattern`].
1960 /// - `num_no_patterns`: number of no_patterns.
1961 /// - `no_patterns`: array containing subexpressions to be excluded from inferred patterns.
1962 /// - `num_decls`: number of variables to be bound.
1963 /// - `sorts`: array of sorts of the bound variables.
1964 /// - `decl_names`: names of the bound variables.
1965 /// - `body`: the body of the quantifier.
1966 ///
1967 /// # See also
1968 ///
1969 /// - [`Z3_mk_pattern`]
1970 /// - [`Z3_mk_bound`]
1971 /// - [`Z3_mk_forall`]
1972 /// - [`Z3_mk_exists`]
1973 pub fn Z3_mk_quantifier_ex(
1974 c: Z3_context,
1975 is_forall: bool,
1976 weight: ::core::ffi::c_uint,
1977 quantifier_id: Z3_symbol,
1978 skolem_id: Z3_symbol,
1979 num_patterns: ::core::ffi::c_uint,
1980 patterns: *const Z3_pattern,
1981 num_no_patterns: ::core::ffi::c_uint,
1982 no_patterns: *const Z3_ast,
1983 num_decls: ::core::ffi::c_uint,
1984 sorts: *const Z3_sort,
1985 decl_names: *const Z3_symbol,
1986 body: Z3_ast,
1987 ) -> Option<Z3_ast>;
1988 /// Create a universal quantifier using a list of constants that
1989 /// will form the set of bound variables.
1990 ///
1991 /// - `c`: logical context.
1992 /// - `weight`: quantifiers are associated with weights indicating the importance of using
1993 /// the quantifier during instantiation. By default, pass the weight 0.
1994 /// - `num_bound`: number of constants to be abstracted into bound variables.
1995 /// - `bound`: array of constants to be abstracted into bound variables.
1996 /// - `num_patterns`: number of patterns.
1997 /// - `patterns`: array containing the patterns created using [`Z3_mk_pattern`].
1998 /// - `body`: the body of the quantifier.
1999 ///
2000 /// # See also
2001 ///
2002 /// - [`Z3_mk_pattern`]
2003 /// - [`Z3_mk_exists_const`]
2004 pub fn Z3_mk_forall_const(
2005 c: Z3_context,
2006 weight: ::core::ffi::c_uint,
2007 num_bound: ::core::ffi::c_uint,
2008 bound: *const Z3_app,
2009 num_patterns: ::core::ffi::c_uint,
2010 patterns: *const Z3_pattern,
2011 body: Z3_ast,
2012 ) -> Option<Z3_ast>;
2013 /// Similar to [`Z3_mk_forall_const`].
2014 ///
2015 /// Create an existential quantifier using a list of constants that
2016 /// will form the set of bound variables.
2017 ///
2018 /// - `c`: logical context.
2019 /// - `weight`: quantifiers are associated with weights indicating the importance of using
2020 /// the quantifier during instantiation. By default, pass the weight 0.
2021 /// - `num_bound`: number of constants to be abstracted into bound variables.
2022 /// - `bound`: array of constants to be abstracted into bound variables.
2023 /// - `num_patterns`: number of patterns.
2024 /// - `patterns`: array containing the patterns created using [`Z3_mk_pattern`].
2025 /// - `body`: the body of the quantifier.
2026 ///
2027 /// # See also
2028 ///
2029 /// - [`Z3_mk_pattern`]
2030 /// - [`Z3_mk_forall_const`]
2031 pub fn Z3_mk_exists_const(
2032 c: Z3_context,
2033 weight: ::core::ffi::c_uint,
2034 num_bound: ::core::ffi::c_uint,
2035 bound: *const Z3_app,
2036 num_patterns: ::core::ffi::c_uint,
2037 patterns: *const Z3_pattern,
2038 body: Z3_ast,
2039 ) -> Option<Z3_ast>;
2040 /// Create a universal or existential quantifier using a list of
2041 /// constants that will form the set of bound variables.
2042 pub fn Z3_mk_quantifier_const(
2043 c: Z3_context,
2044 is_forall: bool,
2045 weight: ::core::ffi::c_uint,
2046 num_bound: ::core::ffi::c_uint,
2047 bound: *const Z3_app,
2048 num_patterns: ::core::ffi::c_uint,
2049 patterns: *const Z3_pattern,
2050 body: Z3_ast,
2051 ) -> Option<Z3_ast>;
2052 /// Create a universal or existential quantifier using a list of
2053 /// constants that will form the set of bound variables.
2054 pub fn Z3_mk_quantifier_const_ex(
2055 c: Z3_context,
2056 is_forall: bool,
2057 weight: ::core::ffi::c_uint,
2058 quantifier_id: Z3_symbol,
2059 skolem_id: Z3_symbol,
2060 num_bound: ::core::ffi::c_uint,
2061 bound: *const Z3_app,
2062 num_patterns: ::core::ffi::c_uint,
2063 patterns: *const Z3_pattern,
2064 num_no_patterns: ::core::ffi::c_uint,
2065 no_patterns: *const Z3_ast,
2066 body: Z3_ast,
2067 ) -> Option<Z3_ast>;
2068 /// Create a lambda expression. It takes an expression `body` that contains bound variables
2069 /// of the same sorts as the sorts listed in the array `sorts`. The bound variables are de-Bruijn indices created
2070 /// using [`Z3_mk_bound`]. The array `decl_names` contains the names that the quantified formula uses for the
2071 /// bound variables. Z3 applies the convention that the last element in the `decl_names` and `sorts` array
2072 /// refers to the variable with index 0, the second to last element of `decl_names` and `sorts` refers
2073 /// to the variable with index 1, etc.
2074 /// The sort of the resulting expression is `(Array sorts range)` where `range` is the sort of `body`.
2075 /// For example, if the lambda binds two variables of sort `Int` and `Bool`, and the `body` has sort `Real`,
2076 /// the sort of the expression is `(Array Int Bool Real)`.
2077 ///
2078 /// - `c`: logical context
2079 /// - `num_decls`: number of variables to be bound.
2080 /// - `sorts`: the sorts of the bound variables.
2081 /// - `decl_names`: names of the bound variables
2082 /// - `body`: the body of the lambda expression.
2083 ///
2084 /// # See also
2085 ///
2086 /// - [`Z3_mk_bound`]
2087 /// - [`Z3_mk_forall`]
2088 /// - [`Z3_mk_lambda_const`]
2089 pub fn Z3_mk_lambda(
2090 c: Z3_context,
2091 num_decls: ::core::ffi::c_uint,
2092 sorts: *const Z3_sort,
2093 decl_names: *const Z3_symbol,
2094 body: Z3_ast,
2095 ) -> Option<Z3_ast>;
2096 /// Create a lambda expression using a list of constants that form the set
2097 /// of bound variables
2098 ///
2099 /// - `c`: logical context.
2100 /// - `num_bound`: number of constants to be abstracted into bound variables.
2101 /// - `bound`: array of constants to be abstracted into bound variables.
2102 /// - `body`: the body of the lambda expression.
2103 ///
2104 /// # See also
2105 ///
2106 /// - [`Z3_mk_bound`]
2107 /// - [`Z3_mk_forall`]
2108 /// - [`Z3_mk_lambda`]
2109 pub fn Z3_mk_lambda_const(
2110 c: Z3_context,
2111 num_bound: ::core::ffi::c_uint,
2112 bound: *const Z3_app,
2113 body: Z3_ast,
2114 ) -> Option<Z3_ast>;
2115 /// Return `Z3_INT_SYMBOL` if the symbol was constructed
2116 /// using [`Z3_mk_int_symbol`], and `Z3_STRING_SYMBOL` if the symbol
2117 /// was constructed using [`Z3_mk_string_symbol`].
2118 pub fn Z3_get_symbol_kind(c: Z3_context, s: Z3_symbol) -> Z3_symbol_kind;
2119 /// Return the symbol int value.
2120 ///
2121 /// # Preconditions
2122 ///
2123 /// - `Z3_get_symbol_kind(s) == Z3_INT_SYMBOL`
2124 ///
2125 /// # See also
2126 ///
2127 /// - [`Z3_mk_int_symbol`]
2128 pub fn Z3_get_symbol_int(c: Z3_context, s: Z3_symbol) -> ::core::ffi::c_int;
2129 /// Return the symbol name.
2130 ///
2131 ///
2132 /// \warning The returned buffer is statically allocated by Z3. It will
2133 /// be automatically deallocated when [`Z3_del_context`] is invoked.
2134 /// So, the buffer is invalidated in the next call to `Z3_get_symbol_string`.
2135 ///
2136 /// # Preconditions
2137 ///
2138 /// - `Z3_get_symbol_kind(s) == Z3_STRING_SYMBOL`
2139 ///
2140 /// # See also
2141 ///
2142 /// - [`Z3_mk_string_symbol`]
2143 pub fn Z3_get_symbol_string(c: Z3_context, s: Z3_symbol) -> Z3_string;
2144 /// Return the sort name as a symbol.
2145 pub fn Z3_get_sort_name(c: Z3_context, d: Z3_sort) -> Option<Z3_symbol>;
2146 /// Return a unique identifier for `s`.
2147 pub fn Z3_get_sort_id(c: Z3_context, s: Z3_sort) -> ::core::ffi::c_uint;
2148 /// Convert a `Z3_sort` into `Z3_ast`. This is just type casting.
2149 pub fn Z3_sort_to_ast(c: Z3_context, s: Z3_sort) -> Option<Z3_ast>;
2150 /// compare sorts.
2151 pub fn Z3_is_eq_sort(c: Z3_context, s1: Z3_sort, s2: Z3_sort) -> bool;
2152 /// Return the sort kind (e.g., array, tuple, int, bool, etc).
2153 ///
2154 /// # See also
2155 ///
2156 /// - [`Z3_sort_kind`]
2157 pub fn Z3_get_sort_kind(c: Z3_context, t: Z3_sort) -> Z3_sort_kind;
2158 /// Return the size of the given bit-vector sort.
2159 ///
2160 /// # Preconditions
2161 ///
2162 /// - `Z3_get_sort_kind(c, t) == Z3_BV_SORT`
2163 ///
2164 /// # See also
2165 ///
2166 /// - [`Z3_mk_bv_sort`]
2167 /// - [`Z3_get_sort_kind`]
2168 pub fn Z3_get_bv_sort_size(c: Z3_context, t: Z3_sort) -> ::core::ffi::c_uint;
2169 /// Store the size of the sort in `r`. Return `false` if the call failed.
2170 /// That is, Z3_get_sort_kind(s) == Z3_FINITE_DOMAIN_SORT
2171 pub fn Z3_get_finite_domain_sort_size(
2172 c: Z3_context,
2173 s: Z3_sort,
2174 r: *mut u64,
2175 ) -> bool;
2176 /// Return the arity (number of dimensions) of the given array sort.
2177 ///
2178 /// # Preconditions
2179 ///
2180 /// - `Z3_get_sort_kind(s) == Z3_ARRAY_SORT`
2181 ///
2182 /// # See also
2183 ///
2184 /// - [`Z3_get_array_sort_domain_n`]
2185 pub fn Z3_get_array_arity(c: Z3_context, s: Z3_sort) -> ::core::ffi::c_uint;
2186 /// Return the domain of the given array sort.
2187 /// In the case of a multi-dimensional array, this function returns the sort of the first dimension.
2188 ///
2189 /// # Preconditions
2190 ///
2191 /// - `Z3_get_sort_kind(c, t) == Z3_ARRAY_SORT`
2192 ///
2193 /// # See also
2194 ///
2195 /// - [`Z3_mk_array_sort`]
2196 /// - [`Z3_get_sort_kind`]
2197 /// - [`Z3_get_array_sort_domain_n`]
2198 pub fn Z3_get_array_sort_domain(c: Z3_context, t: Z3_sort) -> Option<Z3_sort>;
2199 /// Return the i'th domain sort of an n-dimensional array.
2200 ///
2201 /// # Preconditions
2202 ///
2203 /// - `Z3_get_sort_kind(c, t) == Z3_ARRAY_SORT`
2204 ///
2205 /// # See also
2206 ///
2207 /// - [`Z3_mk_array_sort`]
2208 /// - [`Z3_get_sort_kind`]
2209 /// - [`Z3_get_array_sort_domain`]
2210 pub fn Z3_get_array_sort_domain_n(
2211 c: Z3_context,
2212 t: Z3_sort,
2213 idx: ::core::ffi::c_uint,
2214 ) -> Option<Z3_sort>;
2215 /// Return the range of the given array sort.
2216 ///
2217 /// # Preconditions
2218 ///
2219 /// - `Z3_get_sort_kind(c, t) == Z3_ARRAY_SORT`
2220 ///
2221 /// # See also
2222 ///
2223 /// - [`Z3_mk_array_sort`]
2224 /// - [`Z3_get_sort_kind`]
2225 pub fn Z3_get_array_sort_range(c: Z3_context, t: Z3_sort) -> Option<Z3_sort>;
2226 /// Return the constructor declaration of the given tuple
2227 /// sort.
2228 ///
2229 /// # Preconditions
2230 ///
2231 /// - `Z3_get_sort_kind(c, t) == Z3_DATATYPE_SORT`
2232 ///
2233 /// # See also
2234 ///
2235 /// - [`Z3_mk_tuple_sort`]
2236 /// - [`Z3_get_sort_kind`]
2237 pub fn Z3_get_tuple_sort_mk_decl(c: Z3_context, t: Z3_sort) -> Option<Z3_func_decl>;
2238 /// Return the number of fields of the given tuple sort.
2239 ///
2240 /// # Preconditions
2241 ///
2242 /// - `Z3_get_sort_kind(c, t) == Z3_DATATYPE_SORT`
2243 ///
2244 /// # See also
2245 ///
2246 /// - [`Z3_mk_tuple_sort`]
2247 /// - [`Z3_get_sort_kind`]
2248 pub fn Z3_get_tuple_sort_num_fields(
2249 c: Z3_context,
2250 t: Z3_sort,
2251 ) -> ::core::ffi::c_uint;
2252 /// Return the i-th field declaration (i.e., projection function declaration)
2253 /// of the given tuple sort.
2254 ///
2255 /// # Preconditions
2256 ///
2257 /// - `Z3_get_sort_kind(t) == Z3_DATATYPE_SORT`
2258 /// - `i < Z3_get_tuple_sort_num_fields(c, t)`
2259 ///
2260 /// # See also
2261 ///
2262 /// - [`Z3_mk_tuple_sort`]
2263 /// - [`Z3_get_sort_kind`]
2264 pub fn Z3_get_tuple_sort_field_decl(
2265 c: Z3_context,
2266 t: Z3_sort,
2267 i: ::core::ffi::c_uint,
2268 ) -> Option<Z3_func_decl>;
2269 /// Check if `s` is a recursive datatype sort.
2270 pub fn Z3_is_recursive_datatype_sort(c: Z3_context, s: Z3_sort) -> bool;
2271 /// Return number of constructors for datatype.
2272 ///
2273 /// # Preconditions
2274 ///
2275 /// - `Z3_get_sort_kind(t) == Z3_DATATYPE_SORT`
2276 ///
2277 /// # See also
2278 ///
2279 /// - [`Z3_get_datatype_sort_constructor`]
2280 /// - [`Z3_get_datatype_sort_recognizer`]
2281 /// - [`Z3_get_datatype_sort_constructor_accessor`]
2282 pub fn Z3_get_datatype_sort_num_constructors(
2283 c: Z3_context,
2284 t: Z3_sort,
2285 ) -> ::core::ffi::c_uint;
2286 /// Return idx'th constructor.
2287 ///
2288 /// # Preconditions
2289 ///
2290 /// - `Z3_get_sort_kind(t) == Z3_DATATYPE_SORT`
2291 /// - `idx < Z3_get_datatype_sort_num_constructors(c, t)`
2292 ///
2293 /// # See also
2294 ///
2295 /// - [`Z3_get_datatype_sort_num_constructors`]
2296 /// - [`Z3_get_datatype_sort_recognizer`]
2297 /// - [`Z3_get_datatype_sort_constructor_accessor`]
2298 pub fn Z3_get_datatype_sort_constructor(
2299 c: Z3_context,
2300 t: Z3_sort,
2301 idx: ::core::ffi::c_uint,
2302 ) -> Option<Z3_func_decl>;
2303 /// Return idx'th recognizer.
2304 ///
2305 /// # Preconditions
2306 ///
2307 /// - `Z3_get_sort_kind(t) == Z3_DATATYPE_SORT`
2308 /// - `idx < Z3_get_datatype_sort_num_constructors(c, t)`
2309 ///
2310 /// # See also
2311 ///
2312 /// - [`Z3_get_datatype_sort_num_constructors`]
2313 /// - [`Z3_get_datatype_sort_constructor`]
2314 /// - [`Z3_get_datatype_sort_constructor_accessor`]
2315 pub fn Z3_get_datatype_sort_recognizer(
2316 c: Z3_context,
2317 t: Z3_sort,
2318 idx: ::core::ffi::c_uint,
2319 ) -> Option<Z3_func_decl>;
2320 /// Return idx_a'th accessor for the idx_c'th constructor.
2321 ///
2322 /// # Preconditions
2323 ///
2324 /// - `Z3_get_sort_kind(t) == Z3_DATATYPE_SORT`
2325 /// - `idx_c < Z3_get_datatype_sort_num_constructors(c, t)`
2326 /// - `idx_a < Z3_get_domain_size(c, Z3_get_datatype_sort_constructor(c, idx_c))`
2327 ///
2328 /// # See also
2329 ///
2330 /// - [`Z3_get_datatype_sort_num_constructors`]
2331 /// - [`Z3_get_datatype_sort_constructor`]
2332 /// - [`Z3_get_datatype_sort_recognizer`]
2333 pub fn Z3_get_datatype_sort_constructor_accessor(
2334 c: Z3_context,
2335 t: Z3_sort,
2336 idx_c: ::core::ffi::c_uint,
2337 idx_a: ::core::ffi::c_uint,
2338 ) -> Option<Z3_func_decl>;
2339 /// Update record field with a value.
2340 ///
2341 /// This corresponds to the 'with' construct in OCaml.
2342 /// It has the effect of updating a record field with a given value.
2343 /// The remaining fields are left unchanged. It is the record
2344 /// equivalent of an array store (see \sa Z3_mk_store).
2345 /// If the datatype has more than one constructor, then the update function
2346 /// behaves as identity if there is a mismatch between the accessor and
2347 /// constructor. For example ((_ update-field car) nil 1) is nil,
2348 /// while ((_ update-field car) (cons 2 nil) 1) is (cons 1 nil).
2349 ///
2350 /// # Preconditions
2351 ///
2352 /// - `Z3_get_sort_kind(Z3_get_sort(c, t)) == Z3_get_domain(c, field_access, 1) == Z3_DATATYPE_SORT`
2353 /// - `Z3_get_sort(c, value) == Z3_get_range(c, field_access)`
2354 pub fn Z3_datatype_update_field(
2355 c: Z3_context,
2356 field_access: Z3_func_decl,
2357 t: Z3_ast,
2358 value: Z3_ast,
2359 ) -> Option<Z3_ast>;
2360 /// Return arity of relation.
2361 ///
2362 /// # Preconditions
2363 ///
2364 /// - `Z3_get_sort_kind(s) == Z3_RELATION_SORT`
2365 ///
2366 /// # See also
2367 ///
2368 /// - [`Z3_get_relation_column`]
2369 pub fn Z3_get_relation_arity(c: Z3_context, s: Z3_sort) -> ::core::ffi::c_uint;
2370 /// Return sort at i'th column of relation sort.
2371 ///
2372 /// # Preconditions
2373 ///
2374 /// - `Z3_get_sort_kind(c, s) == Z3_RELATION_SORT`
2375 /// - `col < Z3_get_relation_arity(c, s)`
2376 ///
2377 /// # See also
2378 ///
2379 /// - [`Z3_get_relation_arity`]
2380 pub fn Z3_get_relation_column(
2381 c: Z3_context,
2382 s: Z3_sort,
2383 col: ::core::ffi::c_uint,
2384 ) -> Option<Z3_sort>;
2385 /// Pseudo-Boolean relations.
2386 ///
2387 /// Encode p1 + p2 + ... + pn <= k
2388 pub fn Z3_mk_atmost(
2389 c: Z3_context,
2390 num_args: ::core::ffi::c_uint,
2391 args: *const Z3_ast,
2392 k: ::core::ffi::c_uint,
2393 ) -> Option<Z3_ast>;
2394 /// Pseudo-Boolean relations.
2395 ///
2396 /// Encode p1 + p2 + ... + pn >= k
2397 pub fn Z3_mk_atleast(
2398 c: Z3_context,
2399 num_args: ::core::ffi::c_uint,
2400 args: *const Z3_ast,
2401 k: ::core::ffi::c_uint,
2402 ) -> Option<Z3_ast>;
2403 /// Pseudo-Boolean relations.
2404 ///
2405 /// Encode k1*p1 + k2*p2 + ... + kn*pn <= k
2406 pub fn Z3_mk_pble(
2407 c: Z3_context,
2408 num_args: ::core::ffi::c_uint,
2409 args: *const Z3_ast,
2410 coeffs: *const ::core::ffi::c_int,
2411 k: ::core::ffi::c_int,
2412 ) -> Option<Z3_ast>;
2413 /// Pseudo-Boolean relations.
2414 ///
2415 /// Encode k1*p1 + k2*p2 + ... + kn*pn >= k
2416 pub fn Z3_mk_pbge(
2417 c: Z3_context,
2418 num_args: ::core::ffi::c_uint,
2419 args: *const Z3_ast,
2420 coeffs: *const ::core::ffi::c_int,
2421 k: ::core::ffi::c_int,
2422 ) -> Option<Z3_ast>;
2423 /// Pseudo-Boolean relations.
2424 ///
2425 /// Encode k1*p1 + k2*p2 + ... + kn*pn = k
2426 pub fn Z3_mk_pbeq(
2427 c: Z3_context,
2428 num_args: ::core::ffi::c_uint,
2429 args: *const Z3_ast,
2430 coeffs: *const ::core::ffi::c_int,
2431 k: ::core::ffi::c_int,
2432 ) -> Option<Z3_ast>;
2433 /// Convert a `Z3_func_decl` into `Z3_ast`. This is just type casting.
2434 pub fn Z3_func_decl_to_ast(c: Z3_context, f: Z3_func_decl) -> Option<Z3_ast>;
2435 /// Compare terms.
2436 pub fn Z3_is_eq_func_decl(c: Z3_context, f1: Z3_func_decl, f2: Z3_func_decl) -> bool;
2437 /// Return a unique identifier for `f`.
2438 pub fn Z3_get_func_decl_id(c: Z3_context, f: Z3_func_decl) -> ::core::ffi::c_uint;
2439 /// Return the constant declaration name as a symbol.
2440 pub fn Z3_get_decl_name(c: Z3_context, d: Z3_func_decl) -> Option<Z3_symbol>;
2441 /// Return declaration kind corresponding to declaration.
2442 pub fn Z3_get_decl_kind(c: Z3_context, d: Z3_func_decl) -> Z3_decl_kind;
2443 /// Return the number of parameters of the given declaration.
2444 ///
2445 /// # See also
2446 ///
2447 /// - [`Z3_get_arity`]
2448 pub fn Z3_get_domain_size(c: Z3_context, d: Z3_func_decl) -> ::core::ffi::c_uint;
2449 /// Alias for `Z3_get_domain_size`.
2450 ///
2451 /// # See also
2452 ///
2453 /// - [`Z3_get_domain_size`]
2454 pub fn Z3_get_arity(c: Z3_context, d: Z3_func_decl) -> ::core::ffi::c_uint;
2455 /// Return the sort of the i-th parameter of the given function declaration.
2456 ///
2457 /// # Preconditions
2458 ///
2459 /// - `i < Z3_get_domain_size(d)`
2460 ///
2461 /// # See also
2462 ///
2463 /// - [`Z3_get_domain_size`]
2464 pub fn Z3_get_domain(
2465 c: Z3_context,
2466 d: Z3_func_decl,
2467 i: ::core::ffi::c_uint,
2468 ) -> Option<Z3_sort>;
2469 /// Return the range of the given declaration.
2470 ///
2471 /// If `d` is a constant (i.e., has zero arguments), then this
2472 /// function returns the sort of the constant.
2473 pub fn Z3_get_range(c: Z3_context, d: Z3_func_decl) -> Option<Z3_sort>;
2474 /// Return the number of parameters associated with a declaration.
2475 pub fn Z3_get_decl_num_parameters(
2476 c: Z3_context,
2477 d: Z3_func_decl,
2478 ) -> ::core::ffi::c_uint;
2479 /// Return the parameter type associated with a declaration.
2480 ///
2481 /// - `c`: the context
2482 /// - `d`: the function declaration
2483 /// - `idx`: is the index of the named parameter it should be between 0 and the number of parameters.
2484 pub fn Z3_get_decl_parameter_kind(
2485 c: Z3_context,
2486 d: Z3_func_decl,
2487 idx: ::core::ffi::c_uint,
2488 ) -> Z3_parameter_kind;
2489 /// Return the integer value associated with an integer parameter.
2490 ///
2491 /// # Preconditions
2492 ///
2493 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_INT`
2494 pub fn Z3_get_decl_int_parameter(
2495 c: Z3_context,
2496 d: Z3_func_decl,
2497 idx: ::core::ffi::c_uint,
2498 ) -> ::core::ffi::c_int;
2499 /// Return the double value associated with an double parameter.
2500 ///
2501 /// # Preconditions
2502 ///
2503 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_DOUBLE`
2504 pub fn Z3_get_decl_double_parameter(
2505 c: Z3_context,
2506 d: Z3_func_decl,
2507 idx: ::core::ffi::c_uint,
2508 ) -> f64;
2509 /// Return the double value associated with an double parameter.
2510 ///
2511 /// # Preconditions
2512 ///
2513 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_SYMBOL`
2514 pub fn Z3_get_decl_symbol_parameter(
2515 c: Z3_context,
2516 d: Z3_func_decl,
2517 idx: ::core::ffi::c_uint,
2518 ) -> Option<Z3_symbol>;
2519 /// Return the sort value associated with a sort parameter.
2520 ///
2521 /// # Preconditions
2522 ///
2523 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_SORT`
2524 pub fn Z3_get_decl_sort_parameter(
2525 c: Z3_context,
2526 d: Z3_func_decl,
2527 idx: ::core::ffi::c_uint,
2528 ) -> Option<Z3_sort>;
2529 /// Return the expression value associated with an expression parameter.
2530 ///
2531 /// # Preconditions
2532 ///
2533 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_AST`
2534 pub fn Z3_get_decl_ast_parameter(
2535 c: Z3_context,
2536 d: Z3_func_decl,
2537 idx: ::core::ffi::c_uint,
2538 ) -> Option<Z3_ast>;
2539 /// Return the expression value associated with an expression parameter.
2540 ///
2541 /// # Preconditions
2542 ///
2543 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_FUNC_DECL`
2544 pub fn Z3_get_decl_func_decl_parameter(
2545 c: Z3_context,
2546 d: Z3_func_decl,
2547 idx: ::core::ffi::c_uint,
2548 ) -> Option<Z3_func_decl>;
2549 /// Return the rational value, as a string, associated with a rational parameter.
2550 ///
2551 /// # Preconditions
2552 ///
2553 /// - `Z3_get_decl_parameter_kind(c, d, idx) == Z3_PARAMETER_RATIONAL`
2554 pub fn Z3_get_decl_rational_parameter(
2555 c: Z3_context,
2556 d: Z3_func_decl,
2557 idx: ::core::ffi::c_uint,
2558 ) -> Z3_string;
2559 /// Convert a `Z3_app` into `Z3_ast`. This is just type casting.
2560 pub fn Z3_app_to_ast(c: Z3_context, a: Z3_app) -> Option<Z3_ast>;
2561 /// Return the declaration of a constant or function application.
2562 pub fn Z3_get_app_decl(c: Z3_context, a: Z3_app) -> Option<Z3_func_decl>;
2563 /// Return the number of argument of an application. If `t`
2564 /// is an constant, then the number of arguments is 0.
2565 ///
2566 /// # See also
2567 ///
2568 /// - [`Z3_get_app_arg`]
2569 pub fn Z3_get_app_num_args(c: Z3_context, a: Z3_app) -> ::core::ffi::c_uint;
2570 /// Return the i-th argument of the given application.
2571 ///
2572 /// # Preconditions
2573 ///
2574 /// - `i < Z3_get_app_num_args(c, a)`
2575 ///
2576 /// # See also
2577 ///
2578 /// - [`Z3_get_app_num_args`]
2579 pub fn Z3_get_app_arg(
2580 c: Z3_context,
2581 a: Z3_app,
2582 i: ::core::ffi::c_uint,
2583 ) -> Option<Z3_ast>;
2584 /// Compare terms.
2585 pub fn Z3_is_eq_ast(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> bool;
2586 /// Return a unique identifier for `t`.
2587 /// The identifier is unique up to structural equality. Thus, two ast nodes
2588 /// created by the same context and having the same children and same function symbols
2589 /// have the same identifiers. Ast nodes created in the same context, but having
2590 /// different children or different functions have different identifiers.
2591 /// Variables and quantifiers are also assigned different identifiers according to
2592 /// their structure.
2593 pub fn Z3_get_ast_id(c: Z3_context, t: Z3_ast) -> ::core::ffi::c_uint;
2594 /// Return a hash code for the given AST.
2595 /// The hash code is structural but two different AST objects can map to the same hash.
2596 /// The result of `Z3_get_ast_id` returns an identifier that is unique over the
2597 /// set of live AST objects.
2598 pub fn Z3_get_ast_hash(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_uint;
2599 /// Return the sort of an AST node.
2600 ///
2601 /// The AST node must be a constant, application, numeral, bound variable, or quantifier.
2602 pub fn Z3_get_sort(c: Z3_context, a: Z3_ast) -> Option<Z3_sort>;
2603 /// Return `true` if the given expression `t` is well sorted.
2604 pub fn Z3_is_well_sorted(c: Z3_context, t: Z3_ast) -> bool;
2605 /// Return `Z3_L_TRUE` if `a` is true, `Z3_L_FALSE` if it is false, and `Z3_L_UNDEF` otherwise.
2606 pub fn Z3_get_bool_value(c: Z3_context, a: Z3_ast) -> Z3_lbool;
2607 /// Return the kind of the given AST.
2608 pub fn Z3_get_ast_kind(c: Z3_context, a: Z3_ast) -> Z3_ast_kind;
2609 pub fn Z3_is_app(c: Z3_context, a: Z3_ast) -> bool;
2610 pub fn Z3_is_ground(c: Z3_context, a: Z3_ast) -> bool;
2611 pub fn Z3_get_depth(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_uint;
2612 pub fn Z3_is_numeral_ast(c: Z3_context, a: Z3_ast) -> bool;
2613 /// Return `true` if the given AST is a real algebraic number.
2614 pub fn Z3_is_algebraic_number(c: Z3_context, a: Z3_ast) -> bool;
2615 /// Convert an `ast` into an `APP_AST`. This is just type casting.
2616 ///
2617 /// # Preconditions
2618 ///
2619 /// - ``Z3_get_ast_kind(c, a) == `Z3_APP_AST```
2620 pub fn Z3_to_app(c: Z3_context, a: Z3_ast) -> Option<Z3_app>;
2621 /// Convert an AST into a FUNC_DECL_AST. This is just type casting.
2622 ///
2623 /// # Preconditions
2624 ///
2625 /// - ``Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST``
2626 pub fn Z3_to_func_decl(c: Z3_context, a: Z3_ast) -> Option<Z3_func_decl>;
2627 /// Return numeral value, as a decimal string of a numeric constant term
2628 ///
2629 /// # Preconditions
2630 ///
2631 /// - `Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST`
2632 pub fn Z3_get_numeral_string(c: Z3_context, a: Z3_ast) -> Z3_string;
2633 /// Return numeral value, as a binary string of a numeric constant term
2634 ///
2635 /// # Preconditions
2636 ///
2637 /// - `Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST`
2638 /// - `a represents a non-negative integer`
2639 pub fn Z3_get_numeral_binary_string(c: Z3_context, a: Z3_ast) -> Z3_string;
2640 /// Return numeral as a string in decimal notation.
2641 /// The result has at most `precision` decimal places.
2642 ///
2643 /// # Preconditions
2644 ///
2645 /// - `Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST || Z3_is_algebraic_number(c, a)`
2646 pub fn Z3_get_numeral_decimal_string(
2647 c: Z3_context,
2648 a: Z3_ast,
2649 precision: ::core::ffi::c_uint,
2650 ) -> Z3_string;
2651 /// Return numeral as a double.
2652 ///
2653 /// # Preconditions
2654 ///
2655 /// - `Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST || Z3_is_algebraic_number(c, a)`
2656 pub fn Z3_get_numeral_double(c: Z3_context, a: Z3_ast) -> f64;
2657 /// Return the numerator (as a numeral AST) of a numeral AST of sort Real.
2658 ///
2659 /// # Preconditions
2660 ///
2661 /// - `Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST`
2662 pub fn Z3_get_numerator(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
2663 /// Return the denominator (as a numeral AST) of a numeral AST of sort Real.
2664 ///
2665 /// # Preconditions
2666 ///
2667 /// - `Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST`
2668 pub fn Z3_get_denominator(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
2669 /// Return numeral value, as a pair of 64 bit numbers if the representation fits.
2670 ///
2671 /// - `c`: logical context.
2672 /// - `a`: term.
2673 /// - `num`: numerator.
2674 /// - `den`: denominator.
2675 ///
2676 /// Return `true` if the numeral value fits in 64 bit numerals, `false` otherwise.
2677 ///
2678 /// Equivalent to `Z3_get_numeral_rational_int64` except that for unsupported expression arguments `Z3_get_numeral_small` signals an error while `Z3_get_numeral_rational_int64` returns `false`.
2679 ///
2680 /// # Preconditions
2681 ///
2682 /// - `Z3_get_ast_kind(a) == Z3_NUMERAL_AST`
2683 pub fn Z3_get_numeral_small(
2684 c: Z3_context,
2685 a: Z3_ast,
2686 num: *mut i64,
2687 den: *mut i64,
2688 ) -> bool;
2689 /// Similar to [`Z3_get_numeral_string`], but only succeeds if
2690 /// the value can fit in a machine int. Return `true` if the call succeeded.
2691 ///
2692 /// # Preconditions
2693 ///
2694 /// - `Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST`
2695 ///
2696 /// # See also
2697 ///
2698 /// - [`Z3_get_numeral_string`]
2699 pub fn Z3_get_numeral_int(
2700 c: Z3_context,
2701 v: Z3_ast,
2702 i: *mut ::core::ffi::c_int,
2703 ) -> bool;
2704 /// Similar to [`Z3_get_numeral_string`], but only succeeds if
2705 /// the value can fit in a machine unsigned int. Return `true` if the call succeeded.
2706 ///
2707 /// # Preconditions
2708 ///
2709 /// - `Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST`
2710 ///
2711 /// # See also
2712 ///
2713 /// - [`Z3_get_numeral_string`]
2714 pub fn Z3_get_numeral_uint(
2715 c: Z3_context,
2716 v: Z3_ast,
2717 u: *mut ::core::ffi::c_uint,
2718 ) -> bool;
2719 /// Similar to [`Z3_get_numeral_string`], but only succeeds if
2720 /// the value can fit in a machine `uint64_t` int. Return `true` if the call succeeded.
2721 ///
2722 /// # Preconditions
2723 ///
2724 /// - `Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST`
2725 ///
2726 /// # See also
2727 ///
2728 /// - [`Z3_get_numeral_string`]
2729 pub fn Z3_get_numeral_uint64(c: Z3_context, v: Z3_ast, u: *mut u64) -> bool;
2730 /// Similar to [`Z3_get_numeral_string`], but only succeeds if
2731 /// the value can fit in a machine `int64_t` int. Return `true` if the call succeeded.
2732 ///
2733 /// # Preconditions
2734 ///
2735 /// - `Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST`
2736 ///
2737 /// # See also
2738 ///
2739 /// - [`Z3_get_numeral_string`]
2740 pub fn Z3_get_numeral_int64(c: Z3_context, v: Z3_ast, i: *mut i64) -> bool;
2741 /// Similar to [`Z3_get_numeral_string`], but only succeeds if
2742 /// the value can fit as a rational number as machine `int64_t` int. Return `true` if the call succeeded.
2743 ///
2744 /// # Preconditions
2745 ///
2746 /// - `Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST`
2747 ///
2748 /// # See also
2749 ///
2750 /// - [`Z3_get_numeral_string`]
2751 pub fn Z3_get_numeral_rational_int64(
2752 c: Z3_context,
2753 v: Z3_ast,
2754 num: *mut i64,
2755 den: *mut i64,
2756 ) -> bool;
2757 /// Return a lower bound for the given real algebraic number.
2758 /// The interval isolating the number is smaller than 1/10^precision.
2759 /// The result is a numeral AST of sort Real.
2760 ///
2761 /// # Preconditions
2762 ///
2763 /// - `Z3_is_algebraic_number(c, a)`
2764 pub fn Z3_get_algebraic_number_lower(
2765 c: Z3_context,
2766 a: Z3_ast,
2767 precision: ::core::ffi::c_uint,
2768 ) -> Option<Z3_ast>;
2769 /// Return a upper bound for the given real algebraic number.
2770 /// The interval isolating the number is smaller than 1/10^precision.
2771 /// The result is a numeral AST of sort Real.
2772 ///
2773 /// # Preconditions
2774 ///
2775 /// - `Z3_is_algebraic_number(c, a)`
2776 pub fn Z3_get_algebraic_number_upper(
2777 c: Z3_context,
2778 a: Z3_ast,
2779 precision: ::core::ffi::c_uint,
2780 ) -> Option<Z3_ast>;
2781 /// Convert a Z3_pattern into Z3_ast. This is just type casting.
2782 pub fn Z3_pattern_to_ast(c: Z3_context, p: Z3_pattern) -> Option<Z3_ast>;
2783 /// Return number of terms in pattern.
2784 pub fn Z3_get_pattern_num_terms(c: Z3_context, p: Z3_pattern) -> ::core::ffi::c_uint;
2785 /// Return i'th ast in pattern.
2786 pub fn Z3_get_pattern(
2787 c: Z3_context,
2788 p: Z3_pattern,
2789 idx: ::core::ffi::c_uint,
2790 ) -> Option<Z3_ast>;
2791 /// Return index of de-Bruijn bound variable.
2792 ///
2793 /// # Preconditions
2794 ///
2795 /// - `Z3_get_ast_kind(a) == Z3_VAR_AST`
2796 pub fn Z3_get_index_value(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_uint;
2797 /// Determine if an ast is a universal quantifier.
2798 pub fn Z3_is_quantifier_forall(c: Z3_context, a: Z3_ast) -> bool;
2799 /// Determine if ast is an existential quantifier.
2800 pub fn Z3_is_quantifier_exists(c: Z3_context, a: Z3_ast) -> bool;
2801 /// Determine if ast is a lambda expression.
2802 ///
2803 /// # Preconditions
2804 ///
2805 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2806 pub fn Z3_is_lambda(c: Z3_context, a: Z3_ast) -> bool;
2807 /// Obtain weight of quantifier.
2808 ///
2809 /// # Preconditions
2810 ///
2811 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2812 pub fn Z3_get_quantifier_weight(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_uint;
2813 /// Obtain skolem id of quantifier.
2814 ///
2815 /// # Preconditions
2816 ///
2817 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2818 pub fn Z3_get_quantifier_skolem_id(c: Z3_context, a: Z3_ast) -> Option<Z3_symbol>;
2819 /// Obtain id of quantifier.
2820 ///
2821 /// # Preconditions
2822 ///
2823 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2824 pub fn Z3_get_quantifier_id(c: Z3_context, a: Z3_ast) -> Option<Z3_symbol>;
2825 /// Return number of patterns used in quantifier.
2826 ///
2827 /// # Preconditions
2828 ///
2829 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2830 pub fn Z3_get_quantifier_num_patterns(
2831 c: Z3_context,
2832 a: Z3_ast,
2833 ) -> ::core::ffi::c_uint;
2834 /// Return i'th pattern.
2835 ///
2836 /// # Preconditions
2837 ///
2838 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2839 pub fn Z3_get_quantifier_pattern_ast(
2840 c: Z3_context,
2841 a: Z3_ast,
2842 i: ::core::ffi::c_uint,
2843 ) -> Option<Z3_pattern>;
2844 /// Return number of no_patterns used in quantifier.
2845 ///
2846 /// # Preconditions
2847 ///
2848 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2849 pub fn Z3_get_quantifier_num_no_patterns(
2850 c: Z3_context,
2851 a: Z3_ast,
2852 ) -> ::core::ffi::c_uint;
2853 /// Return i'th no_pattern.
2854 ///
2855 /// # Preconditions
2856 ///
2857 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2858 pub fn Z3_get_quantifier_no_pattern_ast(
2859 c: Z3_context,
2860 a: Z3_ast,
2861 i: ::core::ffi::c_uint,
2862 ) -> Option<Z3_ast>;
2863 /// Return number of bound variables of quantifier.
2864 ///
2865 /// # Preconditions
2866 ///
2867 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2868 pub fn Z3_get_quantifier_num_bound(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_uint;
2869 /// Return symbol of the i'th bound variable.
2870 ///
2871 /// # Preconditions
2872 ///
2873 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2874 pub fn Z3_get_quantifier_bound_name(
2875 c: Z3_context,
2876 a: Z3_ast,
2877 i: ::core::ffi::c_uint,
2878 ) -> Option<Z3_symbol>;
2879 /// Return sort of the i'th bound variable.
2880 ///
2881 /// # Preconditions
2882 ///
2883 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2884 pub fn Z3_get_quantifier_bound_sort(
2885 c: Z3_context,
2886 a: Z3_ast,
2887 i: ::core::ffi::c_uint,
2888 ) -> Option<Z3_sort>;
2889 /// Return body of quantifier.
2890 ///
2891 /// # Preconditions
2892 ///
2893 /// - `Z3_get_ast_kind(a) == Z3_QUANTIFIER_AST`
2894 pub fn Z3_get_quantifier_body(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
2895 /// Interface to simplifier.
2896 ///
2897 /// Provides an interface to the AST simplifier used by Z3.
2898 /// It returns an AST object which is equal to the argument.
2899 /// The returned AST is simplified using algebraic simplification rules,
2900 /// such as constant propagation (propagating true/false over logical connectives).
2901 ///
2902 /// # See also
2903 ///
2904 /// - [`Z3_simplify_ex`]
2905 pub fn Z3_simplify(c: Z3_context, a: Z3_ast) -> Option<Z3_ast>;
2906 /// Interface to simplifier.
2907 ///
2908 /// Provides an interface to the AST simplifier used by Z3.
2909 /// This procedure is similar to [`Z3_simplify`], but the behavior of the simplifier
2910 /// can be configured using the given parameter set.
2911 ///
2912 /// # See also
2913 ///
2914 /// - [`Z3_simplify`]
2915 /// - [`Z3_simplify_get_help`]
2916 /// - [`Z3_simplify_get_param_descrs`]
2917 pub fn Z3_simplify_ex(c: Z3_context, a: Z3_ast, p: Z3_params) -> Option<Z3_ast>;
2918 /// Return a string describing all available parameters.
2919 ///
2920 /// # See also
2921 ///
2922 /// - [`Z3_simplify_ex`]
2923 /// - [`Z3_simplify_get_param_descrs`]
2924 pub fn Z3_simplify_get_help(c: Z3_context) -> Z3_string;
2925 /// Return the parameter description set for the simplify procedure.
2926 ///
2927 /// # See also
2928 ///
2929 /// - [`Z3_simplify_ex`]
2930 /// - [`Z3_simplify_get_help`]
2931 pub fn Z3_simplify_get_param_descrs(c: Z3_context) -> Option<Z3_param_descrs>;
2932 /// Update the arguments of term `a` using the arguments `args`.
2933 /// The number of arguments `num_args` should coincide
2934 /// with the number of arguments to `a`.
2935 /// If `a` is a quantifier, then num_args has to be 1.
2936 pub fn Z3_update_term(
2937 c: Z3_context,
2938 a: Z3_ast,
2939 num_args: ::core::ffi::c_uint,
2940 args: *const Z3_ast,
2941 ) -> Option<Z3_ast>;
2942 /// Substitute every occurrence of `from[i]` in `a` with `to[i]`, for `i` smaller than `num_exprs`.
2943 /// The result is the new AST. The arrays `from` and `to` must have size `num_exprs`.
2944 /// For every `i` smaller than `num_exprs`, we must have that sort of `from[i]` must be equal to sort of `to[i]`.
2945 pub fn Z3_substitute(
2946 c: Z3_context,
2947 a: Z3_ast,
2948 num_exprs: ::core::ffi::c_uint,
2949 from: *const Z3_ast,
2950 to: *const Z3_ast,
2951 ) -> Option<Z3_ast>;
2952 /// Substitute the variables in `a` with the expressions in `to`.
2953 /// For every `i` smaller than `num_exprs`, the variable with de-Bruijn index `i` is replaced with term `to[i]`.
2954 /// Note that a variable is created using the function \ref Z3_mk_bound.
2955 pub fn Z3_substitute_vars(
2956 c: Z3_context,
2957 a: Z3_ast,
2958 num_exprs: ::core::ffi::c_uint,
2959 to: *const Z3_ast,
2960 ) -> Option<Z3_ast>;
2961 /// Substitute functions in `from` with new expressions in `to`.
2962 ///
2963 /// The expressions in `to` can have free variables. The free variable in `to` at index 0
2964 /// refers to the first argument of `from`, the free variable at index 1 corresponds to the second argument.
2965 pub fn Z3_substitute_funs(
2966 c: Z3_context,
2967 a: Z3_ast,
2968 num_funs: ::core::ffi::c_uint,
2969 from: *const Z3_func_decl,
2970 to: *const Z3_ast,
2971 ) -> Option<Z3_ast>;
2972 /// Translate/Copy the AST `a` from context `source` to context `target`.
2973 /// AST `a` must have been created using context `source`.
2974 ///
2975 /// # Preconditions
2976 ///
2977 /// - `source != target`
2978 pub fn Z3_translate(
2979 source: Z3_context,
2980 a: Z3_ast,
2981 target: Z3_context,
2982 ) -> Option<Z3_ast>;
2983 /// Create a fresh model object. It has reference count 0.
2984 pub fn Z3_mk_model(c: Z3_context) -> Option<Z3_model>;
2985 /// Increment the reference counter of the given model.
2986 pub fn Z3_model_inc_ref(c: Z3_context, m: Z3_model);
2987 /// Decrement the reference counter of the given model.
2988 pub fn Z3_model_dec_ref(c: Z3_context, m: Z3_model);
2989 /// Evaluate the AST node `t` in the given model.
2990 /// Return `true` if succeeded, and store the result in `v`.
2991 ///
2992 /// If `model_completion` is `true`, then Z3 will assign an interpretation for any constant or function that does
2993 /// not have an interpretation in `m`. These constants and functions were essentially don't cares.
2994 ///
2995 /// If `model_completion` is `false`, then Z3 will not assign interpretations to constants for functions that do
2996 /// not have interpretations in `m`. Evaluation behaves as the identify function in this case.
2997 ///
2998 /// The evaluation may fail for the following reasons:
2999 ///
3000 /// - `t` contains a quantifier.
3001 ///
3002 /// - the model `m` is partial, that is, it doesn't have a complete interpretation for uninterpreted functions.
3003 /// That is, the option `MODEL_PARTIAL=true` was used.
3004 ///
3005 /// - `t` is type incorrect.
3006 ///
3007 /// - `Z3_interrupt` was invoked during evaluation.
3008 pub fn Z3_model_eval(
3009 c: Z3_context,
3010 m: Z3_model,
3011 t: Z3_ast,
3012 model_completion: bool,
3013 v: *mut Z3_ast,
3014 ) -> bool;
3015 /// Return the interpretation (i.e., assignment) of constant `a` in the model `m`.
3016 /// Return `NULL`, if the model does not assign an interpretation for `a`.
3017 /// That should be interpreted as: the value of `a` does not matter.
3018 ///
3019 /// # Preconditions
3020 ///
3021 /// - `Z3_get_arity(c, a) == 0`
3022 pub fn Z3_model_get_const_interp(
3023 c: Z3_context,
3024 m: Z3_model,
3025 a: Z3_func_decl,
3026 ) -> Option<Z3_ast>;
3027 /// Test if there exists an interpretation (i.e., assignment) for `a` in the model `m`.
3028 pub fn Z3_model_has_interp(c: Z3_context, m: Z3_model, a: Z3_func_decl) -> bool;
3029 /// Return the interpretation of the function `f` in the model `m`.
3030 /// Return `NULL`, if the model does not assign an interpretation for `f`.
3031 /// That should be interpreted as: the `f` does not matter.
3032 ///
3033 ///
3034 /// **Remark:** Reference counting must be used to manage Z3_func_interp objects, even when the Z3_context was
3035 /// created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
3036 ///
3037 /// # Preconditions
3038 ///
3039 /// - `Z3_get_arity(c, f) > 0`
3040 pub fn Z3_model_get_func_interp(
3041 c: Z3_context,
3042 m: Z3_model,
3043 f: Z3_func_decl,
3044 ) -> Option<Z3_func_interp>;
3045 /// Return the number of constants assigned by the given model.
3046 ///
3047 /// # See also
3048 ///
3049 /// - [`Z3_model_get_const_decl`]
3050 pub fn Z3_model_get_num_consts(c: Z3_context, m: Z3_model) -> ::core::ffi::c_uint;
3051 /// Return the i-th constant in the given model.
3052 ///
3053 /// # Preconditions
3054 ///
3055 /// - `i < Z3_model_get_num_consts(c, m)`
3056 ///
3057 /// # See also
3058 ///
3059 /// - [`Z3_model_eval`]
3060 /// - [`Z3_model_get_num_consts`]
3061 pub fn Z3_model_get_const_decl(
3062 c: Z3_context,
3063 m: Z3_model,
3064 i: ::core::ffi::c_uint,
3065 ) -> Option<Z3_func_decl>;
3066 /// Return the number of function interpretations in the given model.
3067 ///
3068 /// A function interpretation is represented as a finite map and an 'else' value.
3069 /// Each entry in the finite map represents the value of a function given a set of arguments.
3070 ///
3071 /// # See also
3072 ///
3073 /// - [`Z3_model_get_func_decl`]
3074 pub fn Z3_model_get_num_funcs(c: Z3_context, m: Z3_model) -> ::core::ffi::c_uint;
3075 /// Return the declaration of the i-th function in the given model.
3076 ///
3077 /// # Preconditions
3078 ///
3079 /// - `i < Z3_model_get_num_funcs(c, m)`
3080 ///
3081 /// # See also
3082 ///
3083 /// - [`Z3_model_get_num_funcs`]
3084 pub fn Z3_model_get_func_decl(
3085 c: Z3_context,
3086 m: Z3_model,
3087 i: ::core::ffi::c_uint,
3088 ) -> Option<Z3_func_decl>;
3089 /// Return the number of uninterpreted sorts that `m` assigns an interpretation to.
3090 ///
3091 /// Z3 also provides an interpretation for uninterpreted sorts used in a formula.
3092 /// The interpretation for a sort `s` is a finite set of distinct values. We say this finite set is
3093 /// the "universe" of `s`.
3094 ///
3095 /// # See also
3096 ///
3097 /// - [`Z3_model_get_sort`]
3098 /// - [`Z3_model_get_sort_universe`]
3099 pub fn Z3_model_get_num_sorts(c: Z3_context, m: Z3_model) -> ::core::ffi::c_uint;
3100 /// Return a uninterpreted sort that `m` assigns an interpretation.
3101 ///
3102 /// # Preconditions
3103 ///
3104 /// - `i < Z3_model_get_num_sorts(c, m)`
3105 ///
3106 /// # See also
3107 ///
3108 /// - [`Z3_model_get_num_sorts`]
3109 /// - [`Z3_model_get_sort_universe`]
3110 pub fn Z3_model_get_sort(
3111 c: Z3_context,
3112 m: Z3_model,
3113 i: ::core::ffi::c_uint,
3114 ) -> Option<Z3_sort>;
3115 /// Return the finite set of distinct values that represent the interpretation for sort `s`.
3116 ///
3117 /// # See also
3118 ///
3119 /// - [`Z3_model_get_num_sorts`]
3120 /// - [`Z3_model_get_sort`]
3121 pub fn Z3_model_get_sort_universe(
3122 c: Z3_context,
3123 m: Z3_model,
3124 s: Z3_sort,
3125 ) -> Option<Z3_ast_vector>;
3126 /// translate model from context `c` to context `dst`.
3127 ///
3128 /// **Remark:** Use this method for cloning state between contexts. Note that
3129 /// operations on contexts are not thread safe and therefore all operations
3130 /// that related to a given context have to be synchronized (or run in the same thread).
3131 pub fn Z3_model_translate(
3132 c: Z3_context,
3133 m: Z3_model,
3134 dst: Z3_context,
3135 ) -> Option<Z3_model>;
3136 /// The `(_ as-array f)` AST node is a construct for assigning interpretations for arrays in Z3.
3137 /// It is the array such that forall indices `i` we have that `(select (_ as-array f) i)` is equal to `(f i)`.
3138 /// This procedure returns `true` if the `a` is an `as`-array AST node.
3139 ///
3140 /// Z3 current solvers have minimal support for `as_array` nodes.
3141 ///
3142 /// # See also
3143 ///
3144 /// - [`Z3_get_as_array_func_decl`]
3145 pub fn Z3_is_as_array(c: Z3_context, a: Z3_ast) -> bool;
3146 /// Return the function declaration `f` associated with a `(_ as_array f)` node.
3147 ///
3148 /// # See also
3149 ///
3150 /// - [`Z3_is_as_array`]
3151 pub fn Z3_get_as_array_func_decl(c: Z3_context, a: Z3_ast) -> Option<Z3_func_decl>;
3152 /// Create a fresh func_interp object, add it to a model for a specified function.
3153 /// It has reference count 0.
3154 ///
3155 /// - `c`: context
3156 /// - `m`: model
3157 /// - `f`: function declaration
3158 /// - `default_value`: default value for function interpretation
3159 pub fn Z3_add_func_interp(
3160 c: Z3_context,
3161 m: Z3_model,
3162 f: Z3_func_decl,
3163 default_value: Z3_ast,
3164 ) -> Option<Z3_func_interp>;
3165 /// Add a constant interpretation.
3166 pub fn Z3_add_const_interp(c: Z3_context, m: Z3_model, f: Z3_func_decl, a: Z3_ast);
3167 /// Increment the reference counter of the given `Z3_func_interp` object.
3168 pub fn Z3_func_interp_inc_ref(c: Z3_context, f: Z3_func_interp);
3169 /// Decrement the reference counter of the given `Z3_func_interp` object.
3170 pub fn Z3_func_interp_dec_ref(c: Z3_context, f: Z3_func_interp);
3171 /// Return the number of entries in the given function interpretation.
3172 ///
3173 /// A function interpretation is represented as a finite map and an 'else' value.
3174 /// Each entry in the finite map represents the value of a function given a set of arguments.
3175 /// This procedure return the number of element in the finite map of `f`.
3176 ///
3177 /// # See also
3178 ///
3179 /// - [`Z3_func_interp_get_entry`]
3180 pub fn Z3_func_interp_get_num_entries(
3181 c: Z3_context,
3182 f: Z3_func_interp,
3183 ) -> ::core::ffi::c_uint;
3184 /// Return a "point" of the given function interpretation. It represents the
3185 /// value of `f` in a particular point.
3186 ///
3187 /// # Preconditions
3188 ///
3189 /// - `i < Z3_func_interp_get_num_entries(c, f)`
3190 ///
3191 /// # See also
3192 ///
3193 /// - [`Z3_func_interp_get_num_entries`]
3194 pub fn Z3_func_interp_get_entry(
3195 c: Z3_context,
3196 f: Z3_func_interp,
3197 i: ::core::ffi::c_uint,
3198 ) -> Option<Z3_func_entry>;
3199 /// Return the 'else' value of the given function interpretation.
3200 ///
3201 /// A function interpretation is represented as a finite map and an 'else' value.
3202 /// This procedure returns the 'else' value.
3203 pub fn Z3_func_interp_get_else(c: Z3_context, f: Z3_func_interp) -> Option<Z3_ast>;
3204 /// Return the 'else' value of the given function interpretation.
3205 ///
3206 /// A function interpretation is represented as a finite map and an 'else' value.
3207 /// This procedure can be used to update the 'else' value.
3208 pub fn Z3_func_interp_set_else(c: Z3_context, f: Z3_func_interp, else_value: Z3_ast);
3209 /// Return the arity (number of arguments) of the given function interpretation.
3210 pub fn Z3_func_interp_get_arity(
3211 c: Z3_context,
3212 f: Z3_func_interp,
3213 ) -> ::core::ffi::c_uint;
3214 /// add a function entry to a function interpretation.
3215 ///
3216 /// - `c`: logical context
3217 /// - `fi`: a function interpretation to be updated.
3218 /// - `args`: list of arguments. They should be constant values (such as integers) and be of the same types as the domain of the function.
3219 /// - `value`: value of the function when the parameters match args.
3220 ///
3221 /// It is assumed that entries added to a function cover disjoint arguments.
3222 /// If an two entries are added with the same arguments, only the second insertion survives and the
3223 /// first inserted entry is removed.
3224 pub fn Z3_func_interp_add_entry(
3225 c: Z3_context,
3226 fi: Z3_func_interp,
3227 args: Z3_ast_vector,
3228 value: Z3_ast,
3229 );
3230 /// Increment the reference counter of the given `Z3_func_entry` object.
3231 pub fn Z3_func_entry_inc_ref(c: Z3_context, e: Z3_func_entry);
3232 /// Decrement the reference counter of the given `Z3_func_entry` object.
3233 pub fn Z3_func_entry_dec_ref(c: Z3_context, e: Z3_func_entry);
3234 /// Return the value of this point.
3235 ///
3236 /// A `Z3_func_entry` object represents an element in the finite map used to encode
3237 /// a function interpretation.
3238 ///
3239 /// # See also
3240 ///
3241 /// - [`Z3_func_interp_get_entry`]
3242 pub fn Z3_func_entry_get_value(c: Z3_context, e: Z3_func_entry) -> Option<Z3_ast>;
3243 /// Return the number of arguments in a `Z3_func_entry` object.
3244 ///
3245 /// # See also
3246 ///
3247 /// - [`Z3_func_entry_get_arg`]
3248 /// - [`Z3_func_interp_get_entry`]
3249 pub fn Z3_func_entry_get_num_args(
3250 c: Z3_context,
3251 e: Z3_func_entry,
3252 ) -> ::core::ffi::c_uint;
3253 /// Return an argument of a `Z3_func_entry` object.
3254 ///
3255 /// # Preconditions
3256 ///
3257 /// - `i < Z3_func_entry_get_num_args(c, e)`
3258 ///
3259 /// # See also
3260 ///
3261 /// - [`Z3_func_entry_get_num_args`]
3262 /// - [`Z3_func_interp_get_entry`]
3263 pub fn Z3_func_entry_get_arg(
3264 c: Z3_context,
3265 e: Z3_func_entry,
3266 i: ::core::ffi::c_uint,
3267 ) -> Option<Z3_ast>;
3268 /// Log interaction to a file.
3269 ///
3270 ///
3271 /// extra_API('Z3_open_log', BOOL, (_in(STRING),))
3272 ///
3273 /// # See also
3274 ///
3275 /// - [`Z3_append_log`]
3276 /// - [`Z3_close_log`]
3277 pub fn Z3_open_log(filename: Z3_string) -> bool;
3278 /// Append user-defined string to interaction log.
3279 ///
3280 /// The interaction log is opened using [`Z3_open_log`].
3281 /// It contains the formulas that are checked using Z3.
3282 /// You can use this command to append comments, for instance.
3283 ///
3284 ///
3285 /// extra_API('Z3_append_log', VOID, (_in(STRING),))
3286 ///
3287 /// # See also
3288 ///
3289 /// - [`Z3_open_log`]
3290 /// - [`Z3_close_log`]
3291 pub fn Z3_append_log(string: Z3_string);
3292 /// Close interaction log.
3293 ///
3294 ///
3295 /// extra_API('Z3_close_log', VOID, ())
3296 ///
3297 /// # See also
3298 ///
3299 /// - [`Z3_open_log`]
3300 /// - [`Z3_append_log`]
3301 pub fn Z3_close_log();
3302 /// Enable/disable printing warning messages to the console.
3303 ///
3304 /// Warnings are printed after passing `true`, warning messages are
3305 /// suppressed after calling this method with `false`.
3306 pub fn Z3_toggle_warning_messages(enabled: bool);
3307 /// Select mode for the format used for pretty-printing AST nodes.
3308 ///
3309 /// The default mode for pretty printing AST nodes is to produce
3310 /// SMT-LIB style output where common subexpressions are printed
3311 /// at each occurrence. The mode is called `Z3_PRINT_SMTLIB_FULL`.
3312 /// To print shared common subexpressions only once,
3313 /// use the `Z3_PRINT_LOW_LEVEL` mode.
3314 /// To print in way that conforms to SMT-LIB standards and uses let
3315 /// expressions to share common sub-expressions use `Z3_PRINT_SMTLIB2_COMPLIANT`.
3316 ///
3317 /// # See also
3318 ///
3319 /// - [`Z3_ast_to_string`]
3320 /// - [`Z3_pattern_to_string`]
3321 /// - [`Z3_func_decl_to_string`]
3322 pub fn Z3_set_ast_print_mode(c: Z3_context, mode: Z3_ast_print_mode);
3323 /// Convert the given AST node into a string.
3324 ///
3325 /// \warning The result buffer is statically allocated by Z3. It will
3326 /// be automatically deallocated when [`Z3_del_context`] is invoked.
3327 /// So, the buffer is invalidated in the next call to `Z3_ast_to_string`.
3328 ///
3329 /// # See also
3330 ///
3331 /// - [`Z3_pattern_to_string`]
3332 /// - [`Z3_sort_to_string`]
3333 pub fn Z3_ast_to_string(c: Z3_context, a: Z3_ast) -> Z3_string;
3334 pub fn Z3_pattern_to_string(c: Z3_context, p: Z3_pattern) -> Z3_string;
3335 pub fn Z3_sort_to_string(c: Z3_context, s: Z3_sort) -> Z3_string;
3336 pub fn Z3_func_decl_to_string(c: Z3_context, d: Z3_func_decl) -> Z3_string;
3337 /// Convert the given model into a string.
3338 ///
3339 /// \warning The result buffer is statically allocated by Z3. It will
3340 /// be automatically deallocated when [`Z3_del_context`] is invoked.
3341 /// So, the buffer is invalidated in the next call to `Z3_model_to_string`.
3342 pub fn Z3_model_to_string(c: Z3_context, m: Z3_model) -> Z3_string;
3343 /// Convert the given benchmark into SMT-LIB formatted string.
3344 ///
3345 /// \warning The result buffer is statically allocated by Z3. It will
3346 /// be automatically deallocated when [`Z3_del_context`] is invoked.
3347 /// So, the buffer is invalidated in the next call to `Z3_benchmark_to_smtlib_string`.
3348 ///
3349 /// - `c`: - context.
3350 /// - `name`: - name of benchmark. The argument is optional.
3351 /// - `logic`: - the benchmark logic.
3352 /// - `status`: - the status string (sat, unsat, or unknown)
3353 /// - `attributes`: - other attributes, such as source, difficulty or category.
3354 /// - `num_assumptions`: - number of assumptions.
3355 /// - `assumptions`: - auxiliary assumptions.
3356 /// - `formula`: - formula to be checked for consistency in conjunction with assumptions.
3357 pub fn Z3_benchmark_to_smtlib_string(
3358 c: Z3_context,
3359 name: Z3_string,
3360 logic: Z3_string,
3361 status: Z3_string,
3362 attributes: Z3_string,
3363 num_assumptions: ::core::ffi::c_uint,
3364 assumptions: *const Z3_ast,
3365 formula: Z3_ast,
3366 ) -> Z3_string;
3367 /// Parse the given string using the SMT-LIB2 parser.
3368 ///
3369 /// It returns a formula comprising of the conjunction of assertions in the scope
3370 /// (up to push/pop) at the end of the string.
3371 pub fn Z3_parse_smtlib2_string(
3372 c: Z3_context,
3373 str_: Z3_string,
3374 num_sorts: ::core::ffi::c_uint,
3375 sort_names: *const Z3_symbol,
3376 sorts: *const Z3_sort,
3377 num_decls: ::core::ffi::c_uint,
3378 decl_names: *const Z3_symbol,
3379 decls: *const Z3_func_decl,
3380 ) -> Option<Z3_ast_vector>;
3381 /// Similar to [`Z3_parse_smtlib2_string`], but reads the benchmark from a file.
3382 pub fn Z3_parse_smtlib2_file(
3383 c: Z3_context,
3384 file_name: Z3_string,
3385 num_sorts: ::core::ffi::c_uint,
3386 sort_names: *const Z3_symbol,
3387 sorts: *const Z3_sort,
3388 num_decls: ::core::ffi::c_uint,
3389 decl_names: *const Z3_symbol,
3390 decls: *const Z3_func_decl,
3391 ) -> Option<Z3_ast_vector>;
3392 /// Parse and evaluate and SMT-LIB2 command sequence. The state from a previous call is saved so the next
3393 /// evaluation builds on top of the previous call.
3394 ///
3395 ///
3396 /// **Returns:** output generated from processing commands.
3397 pub fn Z3_eval_smtlib2_string(c: Z3_context, str_: Z3_string) -> Z3_string;
3398 /// Create a parser context.
3399 ///
3400 /// A parser context maintains state between calls to `Z3_parser_context_parse_string`
3401 /// where the caller can pass in a set of SMTLIB2 commands.
3402 /// It maintains all the declarations from previous calls together with
3403 /// of sorts and function declarations (including 0-ary) that are added directly to the context.
3404 pub fn Z3_mk_parser_context(c: Z3_context) -> Option<Z3_parser_context>;
3405 /// Increment the reference counter of the given `Z3_parser_context` object.
3406 pub fn Z3_parser_context_inc_ref(c: Z3_context, pc: Z3_parser_context);
3407 /// Decrement the reference counter of the given `Z3_parser_context` object.
3408 pub fn Z3_parser_context_dec_ref(c: Z3_context, pc: Z3_parser_context);
3409 /// Add a sort declaration.
3410 pub fn Z3_parser_context_add_sort(c: Z3_context, pc: Z3_parser_context, s: Z3_sort);
3411 /// Add a function declaration.
3412 pub fn Z3_parser_context_add_decl(
3413 c: Z3_context,
3414 pc: Z3_parser_context,
3415 f: Z3_func_decl,
3416 );
3417 /// Parse a string of SMTLIB2 commands. Return assertions.
3418 pub fn Z3_parser_context_from_string(
3419 c: Z3_context,
3420 pc: Z3_parser_context,
3421 s: Z3_string,
3422 ) -> Option<Z3_ast_vector>;
3423 /// Return the error code for the last API call.
3424 ///
3425 /// A call to a Z3 function may return a non Z3_OK error code,
3426 /// when it is not used correctly.
3427 ///
3428 /// # See also
3429 ///
3430 /// - [`Z3_set_error_handler`]
3431 pub fn Z3_get_error_code(c: Z3_context) -> Z3_error_code;
3432 /// Register a Z3 error handler.
3433 ///
3434 /// A call to a Z3 function may return a non `Z3_OK` error code, when
3435 /// it is not used correctly. An error handler can be registered
3436 /// and will be called in this case. To disable the use of the
3437 /// error handler, simply register with `h`=NULL.
3438 ///
3439 /// \warning Log files, created using [`Z3_open_log`], may be potentially incomplete/incorrect if error handlers are used.
3440 ///
3441 /// # See also
3442 ///
3443 /// - [`Z3_get_error_code`]
3444 pub fn Z3_set_error_handler(c: Z3_context, h: Z3_error_handler);
3445 /// Set an error.
3446 pub fn Z3_set_error(c: Z3_context, e: Z3_error_code);
3447 /// Return a string describing the given error code.
3448 pub fn Z3_get_error_msg(c: Z3_context, err: Z3_error_code) -> Z3_string;
3449 /// Return Z3 version number information.
3450 ///
3451 /// # See also
3452 ///
3453 /// - [`Z3_get_full_version`]
3454 pub fn Z3_get_version(
3455 major: *mut ::core::ffi::c_uint,
3456 minor: *mut ::core::ffi::c_uint,
3457 build_number: *mut ::core::ffi::c_uint,
3458 revision_number: *mut ::core::ffi::c_uint,
3459 );
3460 /// Return a string that fully describes the version of Z3 in use.
3461 ///
3462 /// # See also
3463 ///
3464 /// - [`Z3_get_version`]
3465 pub fn Z3_get_full_version() -> Z3_string;
3466 /// Enable tracing messages tagged as `tag` when Z3 is compiled in debug mode.
3467 /// It is a NOOP otherwise
3468 ///
3469 /// # See also
3470 ///
3471 /// - [`Z3_disable_trace`]
3472 pub fn Z3_enable_trace(tag: Z3_string);
3473 /// Disable tracing messages tagged as `tag` when Z3 is compiled in debug mode.
3474 /// It is a NOOP otherwise
3475 ///
3476 /// # See also
3477 ///
3478 /// - [`Z3_enable_trace`]
3479 pub fn Z3_disable_trace(tag: Z3_string);
3480 /// Reset all allocated resources.
3481 ///
3482 /// Use this facility on out-of memory errors.
3483 /// It allows discharging the previous state and resuming afresh.
3484 /// Any pointers previously returned by the API
3485 /// become invalid.
3486 pub fn Z3_reset_memory();
3487 /// Destroy all allocated resources.
3488 ///
3489 /// Any pointers previously returned by the API become invalid.
3490 /// Can be used for memory leak detection.
3491 pub fn Z3_finalize_memory();
3492 /// Create a goal (aka problem). A goal is essentially a set
3493 /// of formulas, that can be solved and/or transformed using
3494 /// tactics and solvers.
3495 ///
3496 /// If `models` is `true`, then model generation is enabled for the new goal.
3497 ///
3498 /// If `unsat_cores` is `true`, then unsat core generation is enabled for the new goal.
3499 ///
3500 /// If `proofs` is `true`, then proof generation is enabled for the new goal. Remark, the
3501 /// Z3 context `c` must have been created with proof generation support.
3502 ///
3503 /// **Remark:** Reference counting must be used to manage goals, even when the `Z3_context` was
3504 /// created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
3505 pub fn Z3_mk_goal(
3506 c: Z3_context,
3507 models: bool,
3508 unsat_cores: bool,
3509 proofs: bool,
3510 ) -> Option<Z3_goal>;
3511 /// Increment the reference counter of the given goal.
3512 pub fn Z3_goal_inc_ref(c: Z3_context, g: Z3_goal);
3513 /// Decrement the reference counter of the given goal.
3514 pub fn Z3_goal_dec_ref(c: Z3_context, g: Z3_goal);
3515 /// Return the "precision" of the given goal. Goals can be transformed using over and under approximations.
3516 /// A under approximation is applied when the objective is to find a model for a given goal.
3517 /// An over approximation is applied when the objective is to find a proof for a given goal.
3518 pub fn Z3_goal_precision(c: Z3_context, g: Z3_goal) -> Z3_goal_prec;
3519 /// Add a new formula `a` to the given goal.
3520 /// The formula is split according to the following procedure that is applied
3521 /// until a fixed-point:
3522 /// Conjunctions are split into separate formulas.
3523 /// Negations are distributed over disjunctions, resulting in separate formulas.
3524 /// If the goal is `false`, adding new formulas is a no-op.
3525 /// If the formula `a` is `true`, then nothing is added.
3526 /// If the formula `a` is `false`, then the entire goal is replaced by the formula `false`.
3527 pub fn Z3_goal_assert(c: Z3_context, g: Z3_goal, a: Z3_ast);
3528 /// Return `true` if the given goal contains the formula `false`.
3529 pub fn Z3_goal_inconsistent(c: Z3_context, g: Z3_goal) -> bool;
3530 /// Return the depth of the given goal. It tracks how many transformations were applied to it.
3531 pub fn Z3_goal_depth(c: Z3_context, g: Z3_goal) -> ::core::ffi::c_uint;
3532 /// Erase all formulas from the given goal.
3533 pub fn Z3_goal_reset(c: Z3_context, g: Z3_goal);
3534 /// Return the number of formulas in the given goal.
3535 pub fn Z3_goal_size(c: Z3_context, g: Z3_goal) -> ::core::ffi::c_uint;
3536 /// Return a formula from the given goal.
3537 ///
3538 /// # Preconditions
3539 ///
3540 /// - `idx < Z3_goal_size(c, g)`
3541 pub fn Z3_goal_formula(
3542 c: Z3_context,
3543 g: Z3_goal,
3544 idx: ::core::ffi::c_uint,
3545 ) -> Option<Z3_ast>;
3546 /// Return the number of formulas, subformulas and terms in the given goal.
3547 pub fn Z3_goal_num_exprs(c: Z3_context, g: Z3_goal) -> ::core::ffi::c_uint;
3548 /// Return `true` if the goal is empty, and it is precise or the product of a under approximation.
3549 pub fn Z3_goal_is_decided_sat(c: Z3_context, g: Z3_goal) -> bool;
3550 /// Return `true` if the goal contains false, and it is precise or the product of an over approximation.
3551 pub fn Z3_goal_is_decided_unsat(c: Z3_context, g: Z3_goal) -> bool;
3552 /// Copy a goal `g` from the context `source` to the context `target`.
3553 pub fn Z3_goal_translate(
3554 source: Z3_context,
3555 g: Z3_goal,
3556 target: Z3_context,
3557 ) -> Option<Z3_goal>;
3558 /// Convert a model of the formulas of a goal to a model of an original goal.
3559 /// The model may be null, in which case the returned model is valid if the goal was
3560 /// established satisfiable.
3561 ///
3562 /// When using this feature it is advisable to set the parameter `model`.compact to `false`.
3563 /// It is by default true, which erases variables created by the solver from models.
3564 /// Without access to model values for intermediary variables, values of other variables
3565 /// may end up having the wrong values.
3566 pub fn Z3_goal_convert_model(
3567 c: Z3_context,
3568 g: Z3_goal,
3569 m: Z3_model,
3570 ) -> Option<Z3_model>;
3571 /// Convert a goal into a string.
3572 pub fn Z3_goal_to_string(c: Z3_context, g: Z3_goal) -> Z3_string;
3573 /// Convert a goal into a DIMACS formatted string.
3574 /// The goal must be in CNF. You can convert a goal to CNF
3575 /// by applying the tseitin-cnf tactic. Bit-vectors are not automatically
3576 /// converted to Booleans either, so if the caller intends to
3577 /// preserve satisfiability, it should apply bit-blasting tactics.
3578 /// Quantifiers and theory atoms will not be encoded.
3579 pub fn Z3_goal_to_dimacs_string(
3580 c: Z3_context,
3581 g: Z3_goal,
3582 include_names: bool,
3583 ) -> Z3_string;
3584 /// Return a tactic associated with the given name.
3585 /// The complete list of tactics may be obtained using the procedures [`Z3_get_num_tactics`] and [`Z3_get_tactic_name`].
3586 /// It may also be obtained using the command `(help-tactic)` in the SMT 2.0 front-end.
3587 ///
3588 /// Tactics are the basic building block for creating custom solvers for specific problem domains.
3589 pub fn Z3_mk_tactic(c: Z3_context, name: Z3_string) -> Option<Z3_tactic>;
3590 /// Increment the reference counter of the given tactic.
3591 pub fn Z3_tactic_inc_ref(c: Z3_context, t: Z3_tactic);
3592 /// Decrement the reference counter of the given tactic.
3593 pub fn Z3_tactic_dec_ref(c: Z3_context, g: Z3_tactic);
3594 /// Return a probe associated with the given name.
3595 /// The complete list of probes may be obtained using the procedures [`Z3_get_num_probes`] and [`Z3_get_probe_name`].
3596 /// It may also be obtained using the command `(help-tactic)` in the SMT 2.0 front-end.
3597 ///
3598 /// Probes are used to inspect a goal (aka problem) and collect information that may be used to decide
3599 /// which solver and/or preprocessing step will be used.
3600 pub fn Z3_mk_probe(c: Z3_context, name: Z3_string) -> Option<Z3_probe>;
3601 /// Increment the reference counter of the given probe.
3602 pub fn Z3_probe_inc_ref(c: Z3_context, p: Z3_probe);
3603 /// Decrement the reference counter of the given probe.
3604 pub fn Z3_probe_dec_ref(c: Z3_context, p: Z3_probe);
3605 /// Return a tactic that applies `t1` to a given goal and `t2`
3606 /// to every subgoal produced by `t1`.
3607 pub fn Z3_tactic_and_then(
3608 c: Z3_context,
3609 t1: Z3_tactic,
3610 t2: Z3_tactic,
3611 ) -> Option<Z3_tactic>;
3612 /// Return a tactic that first applies `t1` to a given goal,
3613 /// if it fails then returns the result of `t2` applied to the given goal.
3614 pub fn Z3_tactic_or_else(
3615 c: Z3_context,
3616 t1: Z3_tactic,
3617 t2: Z3_tactic,
3618 ) -> Option<Z3_tactic>;
3619 /// Return a tactic that applies the given tactics in parallel.
3620 pub fn Z3_tactic_par_or(
3621 c: Z3_context,
3622 num: ::core::ffi::c_uint,
3623 ts: *const Z3_tactic,
3624 ) -> Option<Z3_tactic>;
3625 /// Return a tactic that applies `t1` to a given goal and then `t2`
3626 /// to every subgoal produced by `t1`. The subgoals are processed in parallel.
3627 pub fn Z3_tactic_par_and_then(
3628 c: Z3_context,
3629 t1: Z3_tactic,
3630 t2: Z3_tactic,
3631 ) -> Option<Z3_tactic>;
3632 /// Return a tactic that applies `t` to a given goal for `ms` milliseconds.
3633 /// If `t` does not terminate in `ms` milliseconds, then it fails.
3634 pub fn Z3_tactic_try_for(
3635 c: Z3_context,
3636 t: Z3_tactic,
3637 ms: ::core::ffi::c_uint,
3638 ) -> Option<Z3_tactic>;
3639 /// Return a tactic that applies `t` to a given goal is the probe `p` evaluates to true.
3640 /// If `p` evaluates to false, then the new tactic behaves like the skip tactic.
3641 pub fn Z3_tactic_when(c: Z3_context, p: Z3_probe, t: Z3_tactic) -> Option<Z3_tactic>;
3642 /// Return a tactic that applies `t1` to a given goal if the probe `p` evaluates to true,
3643 /// and `t2` if `p` evaluates to false.
3644 pub fn Z3_tactic_cond(
3645 c: Z3_context,
3646 p: Z3_probe,
3647 t1: Z3_tactic,
3648 t2: Z3_tactic,
3649 ) -> Option<Z3_tactic>;
3650 /// Return a tactic that keeps applying `t` until the goal is not modified anymore or the maximum
3651 /// number of iterations `max` is reached.
3652 pub fn Z3_tactic_repeat(
3653 c: Z3_context,
3654 t: Z3_tactic,
3655 max: ::core::ffi::c_uint,
3656 ) -> Option<Z3_tactic>;
3657 /// Return a tactic that just return the given goal.
3658 pub fn Z3_tactic_skip(c: Z3_context) -> Option<Z3_tactic>;
3659 /// Return a tactic that always fails.
3660 pub fn Z3_tactic_fail(c: Z3_context) -> Option<Z3_tactic>;
3661 /// Return a tactic that fails if the probe `p` evaluates to false.
3662 pub fn Z3_tactic_fail_if(c: Z3_context, p: Z3_probe) -> Option<Z3_tactic>;
3663 /// Return a tactic that fails if the goal is not trivially satisfiable (i.e., empty) or
3664 /// trivially unsatisfiable (i.e., contains false).
3665 pub fn Z3_tactic_fail_if_not_decided(c: Z3_context) -> Option<Z3_tactic>;
3666 /// Return a tactic that applies `t` using the given set of parameters.
3667 pub fn Z3_tactic_using_params(
3668 c: Z3_context,
3669 t: Z3_tactic,
3670 p: Z3_params,
3671 ) -> Option<Z3_tactic>;
3672 /// Return a simplifier associated with the given name.
3673 /// The complete list of simplifiers may be obtained using the procedures [`Z3_get_num_simplifiers`] and [`Z3_get_simplifier_name`].
3674 /// It may also be obtained using the command `(help-simplifier)` in the SMT 2.0 front-end.
3675 ///
3676 /// Simplifiers are the basic building block for creating custom solvers for specific problem domains.
3677 pub fn Z3_mk_simplifier(c: Z3_context, name: Z3_string) -> Option<Z3_simplifier>;
3678 /// Increment the reference counter of the given simplifier.
3679 pub fn Z3_simplifier_inc_ref(c: Z3_context, t: Z3_simplifier);
3680 /// Decrement the reference counter of the given simplifier.
3681 pub fn Z3_simplifier_dec_ref(c: Z3_context, g: Z3_simplifier);
3682 /// Attach simplifier to a solver. The solver will use the simplifier for incremental pre-processing.
3683 pub fn Z3_solver_add_simplifier(
3684 c: Z3_context,
3685 solver: Z3_solver,
3686 simplifier: Z3_simplifier,
3687 ) -> Option<Z3_solver>;
3688 /// Return a simplifier that applies `t1` to a given goal and `t2`
3689 /// to every subgoal produced by `t1`.
3690 pub fn Z3_simplifier_and_then(
3691 c: Z3_context,
3692 t1: Z3_simplifier,
3693 t2: Z3_simplifier,
3694 ) -> Option<Z3_simplifier>;
3695 /// Return a simplifier that applies `t` using the given set of parameters.
3696 pub fn Z3_simplifier_using_params(
3697 c: Z3_context,
3698 t: Z3_simplifier,
3699 p: Z3_params,
3700 ) -> Option<Z3_simplifier>;
3701 /// Return the number of builtin simplifiers available in Z3.
3702 ///
3703 /// # See also
3704 ///
3705 /// - [`Z3_get_simplifier_name`]
3706 pub fn Z3_get_num_simplifiers(c: Z3_context) -> ::core::ffi::c_uint;
3707 /// Return the name of the idx simplifier.
3708 ///
3709 /// # Preconditions
3710 ///
3711 /// - `i < Z3_get_num_simplifiers(c)`
3712 ///
3713 /// # See also
3714 ///
3715 /// - [`Z3_get_num_simplifiers`]
3716 pub fn Z3_get_simplifier_name(c: Z3_context, i: ::core::ffi::c_uint) -> Z3_string;
3717 /// Return a string containing a description of parameters accepted by the given simplifier.
3718 pub fn Z3_simplifier_get_help(c: Z3_context, t: Z3_simplifier) -> Z3_string;
3719 /// Return the parameter description set for the given simplifier object.
3720 pub fn Z3_simplifier_get_param_descrs(
3721 c: Z3_context,
3722 t: Z3_simplifier,
3723 ) -> Option<Z3_param_descrs>;
3724 /// Return a string containing a description of the simplifier with the given name.
3725 pub fn Z3_simplifier_get_descr(c: Z3_context, name: Z3_string) -> Z3_string;
3726 /// Return a probe that always evaluates to val.
3727 pub fn Z3_probe_const(x: Z3_context, val: f64) -> Option<Z3_probe>;
3728 /// Return a probe that evaluates to "true" when the value returned by `p1` is less than the value returned by `p2`.
3729 ///
3730 /// **Remark:** For probes, "true" is any value different from 0.0.
3731 pub fn Z3_probe_lt(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3732 /// Return a probe that evaluates to "true" when the value returned by `p1` is greater than the value returned by `p2`.
3733 ///
3734 /// **Remark:** For probes, "true" is any value different from 0.0.
3735 pub fn Z3_probe_gt(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3736 /// Return a probe that evaluates to "true" when the value returned by `p1` is less than or equal to the value returned by `p2`.
3737 ///
3738 /// **Remark:** For probes, "true" is any value different from 0.0.
3739 pub fn Z3_probe_le(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3740 /// Return a probe that evaluates to "true" when the value returned by `p1` is greater than or equal to the value returned by `p2`.
3741 ///
3742 /// **Remark:** For probes, "true" is any value different from 0.0.
3743 pub fn Z3_probe_ge(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3744 /// Return a probe that evaluates to "true" when the value returned by `p1` is equal to the value returned by `p2`.
3745 ///
3746 /// **Remark:** For probes, "true" is any value different from 0.0.
3747 pub fn Z3_probe_eq(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3748 /// Return a probe that evaluates to "true" when `p1` and `p2` evaluates to true.
3749 ///
3750 /// **Remark:** For probes, "true" is any value different from 0.0.
3751 pub fn Z3_probe_and(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3752 /// Return a probe that evaluates to "true" when `p1` or `p2` evaluates to true.
3753 ///
3754 /// **Remark:** For probes, "true" is any value different from 0.0.
3755 pub fn Z3_probe_or(x: Z3_context, p1: Z3_probe, p2: Z3_probe) -> Option<Z3_probe>;
3756 /// Return a probe that evaluates to "true" when `p` does not evaluate to true.
3757 ///
3758 /// **Remark:** For probes, "true" is any value different from 0.0.
3759 pub fn Z3_probe_not(x: Z3_context, p: Z3_probe) -> Option<Z3_probe>;
3760 /// Return the number of builtin tactics available in Z3.
3761 ///
3762 /// # See also
3763 ///
3764 /// - [`Z3_get_tactic_name`]
3765 pub fn Z3_get_num_tactics(c: Z3_context) -> ::core::ffi::c_uint;
3766 /// Return the name of the idx tactic.
3767 ///
3768 /// # Preconditions
3769 ///
3770 /// - `i < Z3_get_num_tactics(c)`
3771 ///
3772 /// # See also
3773 ///
3774 /// - [`Z3_get_num_tactics`]
3775 pub fn Z3_get_tactic_name(c: Z3_context, i: ::core::ffi::c_uint) -> Z3_string;
3776 /// Return the number of builtin probes available in Z3.
3777 ///
3778 /// # See also
3779 ///
3780 /// - [`Z3_get_probe_name`]
3781 pub fn Z3_get_num_probes(c: Z3_context) -> ::core::ffi::c_uint;
3782 /// Return the name of the `i` probe.
3783 ///
3784 /// # Preconditions
3785 ///
3786 /// - `i < Z3_get_num_probes(c)`
3787 ///
3788 /// # See also
3789 ///
3790 /// - [`Z3_get_num_probes`]
3791 pub fn Z3_get_probe_name(c: Z3_context, i: ::core::ffi::c_uint) -> Z3_string;
3792 /// Return a string containing a description of parameters accepted by the given tactic.
3793 pub fn Z3_tactic_get_help(c: Z3_context, t: Z3_tactic) -> Z3_string;
3794 /// Return the parameter description set for the given tactic object.
3795 pub fn Z3_tactic_get_param_descrs(
3796 c: Z3_context,
3797 t: Z3_tactic,
3798 ) -> Option<Z3_param_descrs>;
3799 /// Return a string containing a description of the tactic with the given name.
3800 pub fn Z3_tactic_get_descr(c: Z3_context, name: Z3_string) -> Z3_string;
3801 /// Return a string containing a description of the probe with the given name.
3802 pub fn Z3_probe_get_descr(c: Z3_context, name: Z3_string) -> Z3_string;
3803 /// Execute the probe over the goal. The probe always produce a double value.
3804 /// "Boolean" probes return 0.0 for false, and a value different from 0.0 for true.
3805 pub fn Z3_probe_apply(c: Z3_context, p: Z3_probe, g: Z3_goal) -> f64;
3806 /// Apply tactic `t` to the goal `g`.
3807 ///
3808 /// # See also
3809 ///
3810 /// - [`Z3_tactic_apply_ex`]
3811 pub fn Z3_tactic_apply(
3812 c: Z3_context,
3813 t: Z3_tactic,
3814 g: Z3_goal,
3815 ) -> Option<Z3_apply_result>;
3816 /// Apply tactic `t` to the goal `g` using the parameter set `p`.
3817 ///
3818 /// # See also
3819 ///
3820 /// - [`Z3_tactic_apply`]
3821 pub fn Z3_tactic_apply_ex(
3822 c: Z3_context,
3823 t: Z3_tactic,
3824 g: Z3_goal,
3825 p: Z3_params,
3826 ) -> Option<Z3_apply_result>;
3827 /// Increment the reference counter of the given `Z3_apply_result` object.
3828 pub fn Z3_apply_result_inc_ref(c: Z3_context, r: Z3_apply_result);
3829 /// Decrement the reference counter of the given `Z3_apply_result` object.
3830 pub fn Z3_apply_result_dec_ref(c: Z3_context, r: Z3_apply_result);
3831 /// Convert the `Z3_apply_result` object returned by [`Z3_tactic_apply`] into a string.
3832 pub fn Z3_apply_result_to_string(c: Z3_context, r: Z3_apply_result) -> Z3_string;
3833 /// Return the number of subgoals in the `Z3_apply_result` object returned by [`Z3_tactic_apply`].
3834 ///
3835 /// # See also
3836 ///
3837 /// - [`Z3_apply_result_get_subgoal`]
3838 pub fn Z3_apply_result_get_num_subgoals(
3839 c: Z3_context,
3840 r: Z3_apply_result,
3841 ) -> ::core::ffi::c_uint;
3842 /// Return one of the subgoals in the `Z3_apply_result` object returned by [`Z3_tactic_apply`].
3843 ///
3844 /// # Preconditions
3845 ///
3846 /// - `i < Z3_apply_result_get_num_subgoals(c, r)`
3847 ///
3848 /// # See also
3849 ///
3850 /// - [`Z3_apply_result_get_num_subgoals`]
3851 pub fn Z3_apply_result_get_subgoal(
3852 c: Z3_context,
3853 r: Z3_apply_result,
3854 i: ::core::ffi::c_uint,
3855 ) -> Option<Z3_goal>;
3856 /// Create a new solver. This solver is a "combined solver" (see
3857 /// combined_solver module) that internally uses a non-incremental (solver1) and an
3858 /// incremental solver (solver2). This combined solver changes its behaviour based
3859 /// on how it is used and how its parameters are set.
3860 ///
3861 /// If the solver is used in a non incremental way (i.e. no calls to
3862 /// [`Z3_solver_push`] or [`Z3_solver_pop`], and no calls to
3863 /// [`Z3_solver_assert`] or [`Z3_solver_assert_and_track`] after checking
3864 /// satisfiability without an intervening [`Z3_solver_reset`]) then solver1
3865 /// will be used. This solver will apply Z3's "default" tactic.
3866 ///
3867 /// The "default" tactic will attempt to probe the logic used by the
3868 /// assertions and will apply a specialized tactic if one is supported.
3869 /// Otherwise the general `(and-then simplify smt)` tactic will be used.
3870 ///
3871 /// If the solver is used in an incremental way then the combined solver
3872 /// will switch to using solver2 (which behaves similarly to the general
3873 /// "smt" tactic).
3874 ///
3875 /// Note however it is possible to set the `solver2_timeout`,
3876 /// `solver2_unknown`, and `ignore_solver1` parameters of the combined
3877 /// solver to change its behaviour.
3878 ///
3879 /// The function [`Z3_solver_get_model`] retrieves a model if the
3880 /// assertions is satisfiable (i.e., the result is `Z3_L_TRUE`) and model construction is enabled.
3881 /// The function [`Z3_solver_get_model`] can also be used even
3882 /// if the result is `Z3_L_UNDEF`, but the returned model
3883 /// is not guaranteed to satisfy quantified assertions.
3884 ///
3885 /// **Remark:** User must use [`Z3_solver_inc_ref`] and [`Z3_solver_dec_ref`] to manage solver objects.
3886 /// Even if the context was created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
3887 ///
3888 /// # See also
3889 ///
3890 /// - [`Z3_mk_simple_solver`]
3891 /// - [`Z3_mk_solver_for_logic`]
3892 /// - [`Z3_mk_solver_from_tactic`]
3893 pub fn Z3_mk_solver(c: Z3_context) -> Option<Z3_solver>;
3894 /// Create a new incremental solver.
3895 ///
3896 /// This is equivalent to applying the "smt" tactic.
3897 ///
3898 /// Unlike [`Z3_mk_solver`] this solver
3899 /// - Does not attempt to apply any logic specific tactics.
3900 /// - Does not change its behaviour based on whether it used
3901 /// incrementally/non-incrementally.
3902 ///
3903 /// Note that these differences can result in very different performance
3904 /// compared to [`Z3_mk_solver`].
3905 ///
3906 /// The function [`Z3_solver_get_model`] retrieves a model if the
3907 /// assertions is satisfiable (i.e., the result is `Z3_L_TRUE`) and model construction is enabled.
3908 /// The function [`Z3_solver_get_model`] can also be used even
3909 /// if the result is `Z3_L_UNDEF`, but the returned model
3910 /// is not guaranteed to satisfy quantified assertions.
3911 ///
3912 /// **Remark:** User must use [`Z3_solver_inc_ref`] and [`Z3_solver_dec_ref`] to manage solver objects.
3913 /// Even if the context was created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
3914 ///
3915 /// # See also
3916 ///
3917 /// - [`Z3_mk_solver`]
3918 /// - [`Z3_mk_solver_for_logic`]
3919 /// - [`Z3_mk_solver_from_tactic`]
3920 pub fn Z3_mk_simple_solver(c: Z3_context) -> Option<Z3_solver>;
3921 /// Create a new solver customized for the given logic.
3922 /// It behaves like [`Z3_mk_solver`] if the logic is unknown or unsupported.
3923 ///
3924 /// **Remark:** User must use [`Z3_solver_inc_ref`] and [`Z3_solver_dec_ref`] to manage solver objects.
3925 /// Even if the context was created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
3926 ///
3927 /// # See also
3928 ///
3929 /// - [`Z3_mk_solver`]
3930 /// - [`Z3_mk_simple_solver`]
3931 /// - [`Z3_mk_solver_from_tactic`]
3932 pub fn Z3_mk_solver_for_logic(c: Z3_context, logic: Z3_symbol) -> Option<Z3_solver>;
3933 /// Create a new solver that is implemented using the given tactic.
3934 /// The solver supports the commands [`Z3_solver_push`] and [`Z3_solver_pop`], but it
3935 /// will always solve each [`Z3_solver_check`] from scratch.
3936 ///
3937 /// **Remark:** User must use [`Z3_solver_inc_ref`] and [`Z3_solver_dec_ref`] to manage solver objects.
3938 /// Even if the context was created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
3939 ///
3940 /// # See also
3941 ///
3942 /// - [`Z3_mk_solver`]
3943 /// - [`Z3_mk_simple_solver`]
3944 /// - [`Z3_mk_solver_for_logic`]
3945 pub fn Z3_mk_solver_from_tactic(c: Z3_context, t: Z3_tactic) -> Option<Z3_solver>;
3946 /// Copy a solver `s` from the context `source` to the context `target`.
3947 pub fn Z3_solver_translate(
3948 source: Z3_context,
3949 s: Z3_solver,
3950 target: Z3_context,
3951 ) -> Option<Z3_solver>;
3952 /// Ad-hoc method for importing model conversion from solver.
3953 ///
3954 /// This method is used for scenarios where `src` has been used to solve a set
3955 /// of formulas and was interrupted. The `dst` solver may be a strengthening of `src`
3956 /// obtained from cubing (assigning a subset of literals or adding constraints over the
3957 /// assertions available in `src`). If `dst` ends up being satisfiable, the model for `dst`
3958 /// may not correspond to a model of the original formula due to inprocessing in `src`.
3959 /// This method is used to take the side-effect of inprocessing into account when returning
3960 /// a model for `dst`.
3961 pub fn Z3_solver_import_model_converter(
3962 ctx: Z3_context,
3963 src: Z3_solver,
3964 dst: Z3_solver,
3965 );
3966 /// Return a string describing all solver available parameters.
3967 ///
3968 /// # See also
3969 ///
3970 /// - [`Z3_solver_get_param_descrs`]
3971 /// - [`Z3_solver_set_params`]
3972 pub fn Z3_solver_get_help(c: Z3_context, s: Z3_solver) -> Z3_string;
3973 /// Return the parameter description set for the given solver object.
3974 ///
3975 /// # See also
3976 ///
3977 /// - [`Z3_solver_get_help`]
3978 /// - [`Z3_solver_set_params`]
3979 pub fn Z3_solver_get_param_descrs(
3980 c: Z3_context,
3981 s: Z3_solver,
3982 ) -> Option<Z3_param_descrs>;
3983 /// Set the given solver using the given parameters.
3984 ///
3985 /// # See also
3986 ///
3987 /// - [`Z3_solver_get_help`]
3988 /// - [`Z3_solver_get_param_descrs`]
3989 pub fn Z3_solver_set_params(c: Z3_context, s: Z3_solver, p: Z3_params);
3990 /// Increment the reference counter of the given solver.
3991 pub fn Z3_solver_inc_ref(c: Z3_context, s: Z3_solver);
3992 /// Decrement the reference counter of the given solver.
3993 pub fn Z3_solver_dec_ref(c: Z3_context, s: Z3_solver);
3994 /// Solver local interrupt.
3995 /// Normally you should use Z3_interrupt to cancel solvers because only
3996 /// one solver is enabled concurrently per context.
3997 /// However, per GitHub issue #1006, there are use cases where
3998 /// it is more convenient to cancel a specific solver. Solvers
3999 /// that are not selected for interrupts are left alone.
4000 pub fn Z3_solver_interrupt(c: Z3_context, s: Z3_solver);
4001 /// Create a backtracking point.
4002 ///
4003 /// The solver contains a stack of assertions.
4004 ///
4005 /// # See also
4006 ///
4007 /// - [`Z3_solver_get_num_scopes`]
4008 /// - [`Z3_solver_pop`]
4009 pub fn Z3_solver_push(c: Z3_context, s: Z3_solver);
4010 /// Backtrack `n` backtracking points.
4011 ///
4012 /// # Preconditions
4013 ///
4014 /// - `n <= Z3_solver_get_num_scopes(c, s)`
4015 ///
4016 /// # See also
4017 ///
4018 /// - [`Z3_solver_get_num_scopes`]
4019 /// - [`Z3_solver_push`]
4020 pub fn Z3_solver_pop(c: Z3_context, s: Z3_solver, n: ::core::ffi::c_uint);
4021 /// Remove all assertions from the solver.
4022 ///
4023 /// # See also
4024 ///
4025 /// - [`Z3_solver_assert`]
4026 /// - [`Z3_solver_assert_and_track`]
4027 pub fn Z3_solver_reset(c: Z3_context, s: Z3_solver);
4028 /// Return the number of backtracking points.
4029 ///
4030 /// # See also
4031 ///
4032 /// - [`Z3_solver_push`]
4033 /// - [`Z3_solver_pop`]
4034 pub fn Z3_solver_get_num_scopes(c: Z3_context, s: Z3_solver) -> ::core::ffi::c_uint;
4035 /// Assert a constraint into the solver.
4036 ///
4037 /// The functions [`Z3_solver_check`] and [`Z3_solver_check_assumptions`] should be
4038 /// used to check whether the logical context is consistent or not.
4039 ///
4040 /// # See also
4041 ///
4042 /// - [`Z3_solver_assert_and_track`]
4043 /// - [`Z3_solver_reset`]
4044 pub fn Z3_solver_assert(c: Z3_context, s: Z3_solver, a: Z3_ast);
4045 /// Assert a constraint `a` into the solver, and track it (in the unsat) core using
4046 /// the Boolean constant `p`.
4047 ///
4048 /// This API is an alternative to [`Z3_solver_check_assumptions`] for extracting unsat cores.
4049 /// Both APIs can be used in the same solver. The unsat core will contain a combination
4050 /// of the Boolean variables provided using Z3_solver_assert_and_track and the Boolean literals
4051 /// provided using [`Z3_solver_check_assumptions`].
4052 ///
4053 /// # Preconditions
4054 ///
4055 /// - ``a` must be a Boolean expression`
4056 /// - ``p` must be a Boolean constant (aka variable).`
4057 ///
4058 /// # See also
4059 ///
4060 /// - [`Z3_solver_assert`]
4061 /// - [`Z3_solver_reset`]
4062 pub fn Z3_solver_assert_and_track(c: Z3_context, s: Z3_solver, a: Z3_ast, p: Z3_ast);
4063 /// load solver assertions from a file.
4064 ///
4065 /// # See also
4066 ///
4067 /// - [`Z3_solver_from_string`]
4068 /// - [`Z3_solver_to_string`]
4069 pub fn Z3_solver_from_file(c: Z3_context, s: Z3_solver, file_name: Z3_string);
4070 /// load solver assertions from a string.
4071 ///
4072 /// # See also
4073 ///
4074 /// - [`Z3_solver_from_file`]
4075 /// - [`Z3_solver_to_string`]
4076 pub fn Z3_solver_from_string(c: Z3_context, s: Z3_solver, str_: Z3_string);
4077 /// Return the set of asserted formulas on the solver.
4078 pub fn Z3_solver_get_assertions(
4079 c: Z3_context,
4080 s: Z3_solver,
4081 ) -> Option<Z3_ast_vector>;
4082 /// Return the set of units modulo model conversion.
4083 pub fn Z3_solver_get_units(c: Z3_context, s: Z3_solver) -> Option<Z3_ast_vector>;
4084 /// Return the trail modulo model conversion, in order of decision level
4085 /// The decision level can be retrieved using `Z3_solver_get_level` based on the trail.
4086 pub fn Z3_solver_get_trail(c: Z3_context, s: Z3_solver) -> Option<Z3_ast_vector>;
4087 /// Return the set of non units in the solver state.
4088 pub fn Z3_solver_get_non_units(c: Z3_context, s: Z3_solver) -> Option<Z3_ast_vector>;
4089 /// retrieve the decision depth of Boolean literals (variables or their negations).
4090 /// Assumes a check-sat call and no other calls (to extract models) have been invoked.
4091 pub fn Z3_solver_get_levels(
4092 c: Z3_context,
4093 s: Z3_solver,
4094 literals: Z3_ast_vector,
4095 sz: ::core::ffi::c_uint,
4096 levels: *mut ::core::ffi::c_uint,
4097 );
4098 /// retrieve the congruence closure root of an expression.
4099 /// The root is retrieved relative to the state where the solver was in when it completed.
4100 /// If it completed during a set of case splits, the congruence roots are relative to these case splits.
4101 /// That is, the congruences are not consequences but they are true under the current state.
4102 pub fn Z3_solver_congruence_root(
4103 c: Z3_context,
4104 s: Z3_solver,
4105 a: Z3_ast,
4106 ) -> Option<Z3_ast>;
4107 /// retrieve the next expression in the congruence class. The set of congruent siblings form a cyclic list.
4108 /// Repeated calls on the siblings will result in returning to the original expression.
4109 pub fn Z3_solver_congruence_next(
4110 c: Z3_context,
4111 s: Z3_solver,
4112 a: Z3_ast,
4113 ) -> Option<Z3_ast>;
4114 /// retrieve explanation for congruence.
4115 ///
4116 /// # Preconditions
4117 ///
4118 /// - `root(a) = root(b)`
4119 pub fn Z3_solver_congruence_explain(
4120 c: Z3_context,
4121 s: Z3_solver,
4122 a: Z3_ast,
4123 b: Z3_ast,
4124 ) -> Option<Z3_ast>;
4125 /// retrieve a 'solution' for `variables` as defined by equalities in maintained by solvers.
4126 /// At this point, only linear solution are supported.
4127 /// The solution to `variables` may be presented in triangular form, such that
4128 /// variables used in solutions themselves have solutions.
4129 pub fn Z3_solver_solve_for(
4130 c: Z3_context,
4131 s: Z3_solver,
4132 variables: Z3_ast_vector,
4133 terms: Z3_ast_vector,
4134 guards: Z3_ast_vector,
4135 );
4136 /// register a callback to that retrieves assumed, inferred and deleted clauses during search.
4137 ///
4138 /// - `c`: - context.
4139 /// - `s`: - solver object.
4140 /// - `user_context`: - a context used to maintain state for callbacks.
4141 /// - `on_clause_eh`: - a callback that is invoked by when a clause is
4142 /// - asserted to the CDCL engine (corresponding to an input clause after pre-processing)
4143 /// - inferred by CDCL(T) using either a SAT or theory conflict/propagation
4144 /// - deleted by the CDCL(T) engine
4145 pub fn Z3_solver_register_on_clause(
4146 c: Z3_context,
4147 s: Z3_solver,
4148 user_context: *mut ::core::ffi::c_void,
4149 on_clause_eh: Z3_on_clause_eh,
4150 );
4151 /// register a user-propagator with the solver.
4152 ///
4153 /// - `c`: - context.
4154 /// - `s`: - solver object.
4155 /// - `user_context`: - a context used to maintain state for callbacks.
4156 /// - `push_eh`: - a callback invoked when scopes are pushed
4157 /// - `pop_eh`: - a callback invoked when scopes are popped
4158 /// - `fresh_eh`: - a solver may spawn new solvers internally. This callback is used to produce a fresh user_context to be associated with fresh solvers.
4159 pub fn Z3_solver_propagate_init(
4160 c: Z3_context,
4161 s: Z3_solver,
4162 user_context: *mut ::core::ffi::c_void,
4163 push_eh: Z3_push_eh,
4164 pop_eh: Z3_pop_eh,
4165 fresh_eh: Z3_fresh_eh,
4166 );
4167 /// register a callback for when an expression is bound to a fixed value.
4168 /// The supported expression types are
4169 /// - Booleans
4170 /// - Bit-vectors
4171 pub fn Z3_solver_propagate_fixed(c: Z3_context, s: Z3_solver, fixed_eh: Z3_fixed_eh);
4172 /// register a callback on final check.
4173 /// This provides freedom to the propagator to delay actions or implement a branch-and bound solver.
4174 /// The final check is invoked when all decision variables have been assigned by the solver.
4175 ///
4176 /// The `final_eh` callback takes as argument the original user_context that was used
4177 /// when calling `Z3_solver_propagate_init`, and it takes a callback context with the
4178 /// opaque type `Z3_solver_callback`.
4179 /// The callback context is passed as argument to invoke the `Z3_solver_propagate_consequence` function.
4180 /// The callback context can only be accessed (for propagation and for dynamically registering expressions) within a callback.
4181 /// If the callback context gets used for propagation or conflicts, those propagations take effect and
4182 /// may trigger new decision variables to be set.
4183 pub fn Z3_solver_propagate_final(c: Z3_context, s: Z3_solver, final_eh: Z3_final_eh);
4184 /// register a callback on expression equalities.
4185 pub fn Z3_solver_propagate_eq(c: Z3_context, s: Z3_solver, eq_eh: Z3_eq_eh);
4186 /// register a callback on expression dis-equalities.
4187 pub fn Z3_solver_propagate_diseq(c: Z3_context, s: Z3_solver, eq_eh: Z3_eq_eh);
4188 /// register a callback when a new expression with a registered function is used by the solver
4189 /// The registered function appears at the top level and is created using \ref Z3_solver_propagate_declare.
4190 pub fn Z3_solver_propagate_created(
4191 c: Z3_context,
4192 s: Z3_solver,
4193 created_eh: Z3_created_eh,
4194 );
4195 /// register a callback when the solver decides to split on a registered expression.
4196 /// The callback may change the arguments by providing other values by calling \ref Z3_solver_next_split
4197 pub fn Z3_solver_propagate_decide(
4198 c: Z3_context,
4199 s: Z3_solver,
4200 decide_eh: Z3_decide_eh,
4201 );
4202 /// register a callback when the solver instantiates a quantifier.
4203 /// If the callback returns false, the actual instantiation of the quantifier is blocked.
4204 /// This allows the user propagator selectively prioritize instantiations without relying on default
4205 /// or configured weights.
4206 pub fn Z3_solver_propagate_on_binding(
4207 c: Z3_context,
4208 s: Z3_solver,
4209 on_binding_eh: Z3_on_binding_eh,
4210 );
4211 /// Sets the next (registered) expression to split on.
4212 /// The function returns false and ignores the given expression in case the expression is already assigned internally
4213 /// (due to relevancy propagation, this assignments might not have been reported yet by the fixed callback).
4214 /// In case the function is called in the decide callback, it overrides the currently selected variable and phase.
4215 pub fn Z3_solver_next_split(
4216 c: Z3_context,
4217 cb: Z3_solver_callback,
4218 t: Z3_ast,
4219 idx: ::core::ffi::c_uint,
4220 phase: Z3_lbool,
4221 ) -> bool;
4222 /// Create uninterpreted function declaration for the user propagator.
4223 /// When expressions using the function are created by the solver invoke a callback
4224 /// to \ref Z3_solver_propagate_created with arguments
4225 /// 1. context and callback solve
4226 /// 2. declared_expr: expression using function that was used as the top-level symbol
4227 /// 3. declared_id: a unique identifier (unique within the current scope) to track the expression.
4228 pub fn Z3_solver_propagate_declare(
4229 c: Z3_context,
4230 name: Z3_symbol,
4231 n: ::core::ffi::c_uint,
4232 domain: *mut Z3_sort,
4233 range: Z3_sort,
4234 ) -> Option<Z3_func_decl>;
4235 /// register an expression to propagate on with the solver.
4236 /// Only expressions of type Bool and type Bit-Vector can be registered for propagation.
4237 pub fn Z3_solver_propagate_register(c: Z3_context, s: Z3_solver, e: Z3_ast);
4238 /// register an expression to propagate on with the solver.
4239 /// Only expressions of type Bool and type Bit-Vector can be registered for propagation.
4240 /// Unlike \ref Z3_solver_propagate_register, this function takes a solver callback context
4241 /// as argument. It can be invoked during a callback to register new expressions.
4242 pub fn Z3_solver_propagate_register_cb(
4243 c: Z3_context,
4244 cb: Z3_solver_callback,
4245 e: Z3_ast,
4246 );
4247 /// propagate a consequence based on fixed values and equalities.
4248 /// A client may invoke it during the `propagate_fixed`, `propagate_eq`, `propagate_diseq`, and `propagate_final` callbacks.
4249 /// The callback adds a propagation consequence based on the fixed values passed `ids` and equalities `eqs` based on parameters `lhs`, `rhs`.
4250 ///
4251 /// The solver might discard the propagation in case it is true in the current state.
4252 /// The function returns false in this case; otw. the function returns true.
4253 /// At least one propagation in the final callback has to return true in order to
4254 /// prevent the solver from finishing.
4255 ///
4256 /// Assume the callback has the signature: `propagate_consequence_eh`(context, solver_cb, num_ids, ids, num_eqs, lhs, rhs, consequence).
4257 /// - `c`: - context
4258 /// - `solver_cb`: - solver callback
4259 /// - `num_ids`: - number of fixed terms used as premise to propagation
4260 /// - `ids`: - array of length `num_ids` containing terms that are fixed in the current scope
4261 /// - `num_eqs`: - number of equalities used as premise to propagation
4262 /// - `lhs`: - left side of equalities
4263 /// - `rhs`: - right side of equalities
4264 /// - `consequence`: - consequence to propagate. It is typically an atomic formula, but it can be an arbitrary formula.
4265 pub fn Z3_solver_propagate_consequence(
4266 c: Z3_context,
4267 cb: Z3_solver_callback,
4268 num_fixed: ::core::ffi::c_uint,
4269 fixed: *const Z3_ast,
4270 num_eqs: ::core::ffi::c_uint,
4271 eq_lhs: *const Z3_ast,
4272 eq_rhs: *const Z3_ast,
4273 conseq: Z3_ast,
4274 ) -> bool;
4275 /// provide an initialization hint to the solver. The initialization hint is used to calibrate an initial value of the expression that
4276 /// represents a variable. If the variable is Boolean, the initial phase is set according to `value`. If the variable is an integer or real,
4277 /// the initial Simplex tableau is recalibrated to attempt to follow the value assignment.
4278 pub fn Z3_solver_set_initial_value(
4279 c: Z3_context,
4280 s: Z3_solver,
4281 v: Z3_ast,
4282 val: Z3_ast,
4283 );
4284 /// Check whether the assertions in a given solver are consistent or not.
4285 ///
4286 /// The function [`Z3_solver_get_model`] retrieves a model if the
4287 /// assertions is satisfiable (i.e., the result is `Z3_L_TRUE`) and model construction is enabled.
4288 /// Note that if the call returns `Z3_L_UNDEF`, Z3 does not
4289 /// ensure that calls to [`Z3_solver_get_model`] succeed and any models
4290 /// produced in this case are not guaranteed to satisfy the assertions.
4291 ///
4292 /// The function [`Z3_solver_get_proof`] retrieves a proof if proof
4293 /// generation was enabled when the context was created, and the
4294 /// assertions are unsatisfiable (i.e., the result is `Z3_L_FALSE`).
4295 ///
4296 /// # See also
4297 ///
4298 /// - [`Z3_solver_check_assumptions`]
4299 pub fn Z3_solver_check(c: Z3_context, s: Z3_solver) -> Z3_lbool;
4300 /// Check whether the assertions in the given solver and
4301 /// optional assumptions are consistent or not.
4302 ///
4303 /// The function [`Z3_solver_get_unsat_core`] retrieves the subset of the
4304 /// assumptions used in the unsatisfiability proof produced by Z3.
4305 ///
4306 /// # See also
4307 ///
4308 /// - [`Z3_solver_check`]
4309 pub fn Z3_solver_check_assumptions(
4310 c: Z3_context,
4311 s: Z3_solver,
4312 num_assumptions: ::core::ffi::c_uint,
4313 assumptions: *const Z3_ast,
4314 ) -> Z3_lbool;
4315 /// Retrieve congruence class representatives for terms.
4316 ///
4317 /// The function can be used for relying on Z3 to identify equal terms under the current
4318 /// set of assumptions. The array of terms and array of class identifiers should have
4319 /// the same length. The class identifiers are numerals that are assigned to the same
4320 /// value for their corresponding terms if the current context forces the terms to be
4321 /// equal. You cannot deduce that terms corresponding to different numerals must be all different,
4322 /// (especially when using non-convex theories).
4323 /// All implied equalities are returned by this call.
4324 /// This means that two terms map to the same class identifier if and only if
4325 /// the current context implies that they are equal.
4326 ///
4327 /// A side-effect of the function is a satisfiability check on the assertions on the solver that is passed in.
4328 /// The function return `Z3_L_FALSE` if the current assertions are not satisfiable.
4329 pub fn Z3_get_implied_equalities(
4330 c: Z3_context,
4331 s: Z3_solver,
4332 num_terms: ::core::ffi::c_uint,
4333 terms: *const Z3_ast,
4334 class_ids: *mut ::core::ffi::c_uint,
4335 ) -> Z3_lbool;
4336 /// retrieve consequences from solver that determine values of the supplied function symbols.
4337 pub fn Z3_solver_get_consequences(
4338 c: Z3_context,
4339 s: Z3_solver,
4340 assumptions: Z3_ast_vector,
4341 variables: Z3_ast_vector,
4342 consequences: Z3_ast_vector,
4343 ) -> Z3_lbool;
4344 /// extract a next cube for a solver. The last cube is the constant `true` or `false`.
4345 /// The number of (non-constant) cubes is by default 1. For the sat solver cubing is controlled
4346 /// using parameters sat.lookahead.cube.cutoff and sat.lookahead.cube.fraction.
4347 ///
4348 /// The third argument is a vector of variables that may be used for cubing.
4349 /// The contents of the vector is only used in the first call. The initial list of variables
4350 /// is used in subsequent calls until it returns the unsatisfiable cube.
4351 /// The vector is modified to contain a set of Autarky variables that occur in clauses that
4352 /// are affected by the (last literal in the) cube. These variables could be used by a different
4353 /// cuber (on a different solver object) for further recursive cubing.
4354 ///
4355 /// The last argument is a backtracking level. It instructs the cube process to backtrack below
4356 /// the indicated level for the next cube.
4357 pub fn Z3_solver_cube(
4358 c: Z3_context,
4359 s: Z3_solver,
4360 vars: Z3_ast_vector,
4361 backtrack_level: ::core::ffi::c_uint,
4362 ) -> Option<Z3_ast_vector>;
4363 /// Retrieve the model for the last [`Z3_solver_check`] or [`Z3_solver_check_assumptions`]
4364 ///
4365 /// The error handler is invoked if a model is not available because
4366 /// the commands above were not invoked for the given solver, or if the result was `Z3_L_FALSE`.
4367 pub fn Z3_solver_get_model(c: Z3_context, s: Z3_solver) -> Option<Z3_model>;
4368 /// Retrieve the proof for the last [`Z3_solver_check`] or [`Z3_solver_check_assumptions`]
4369 ///
4370 /// The error handler is invoked if proof generation is not enabled,
4371 /// or if the commands above were not invoked for the given solver,
4372 /// or if the result was different from `Z3_L_FALSE`.
4373 pub fn Z3_solver_get_proof(c: Z3_context, s: Z3_solver) -> Option<Z3_ast>;
4374 /// Retrieve the unsat core for the last [`Z3_solver_check_assumptions`]
4375 /// The unsat core is a subset of the assumptions `a`.
4376 ///
4377 /// By default, the unsat core will not be minimized. Generation of a minimized
4378 /// unsat core can be enabled via the `"sat.core.minimize"` and `"smt.core.minimize"`
4379 /// settings for SAT and SMT cores respectively. Generation of minimized unsat cores
4380 /// will be more expensive.
4381 pub fn Z3_solver_get_unsat_core(
4382 c: Z3_context,
4383 s: Z3_solver,
4384 ) -> Option<Z3_ast_vector>;
4385 /// Return a brief justification for an "unknown" result (i.e., `Z3_L_UNDEF`) for
4386 /// the commands [`Z3_solver_check`] and [`Z3_solver_check_assumptions`]
4387 pub fn Z3_solver_get_reason_unknown(c: Z3_context, s: Z3_solver) -> Z3_string;
4388 /// Return statistics for the given solver.
4389 ///
4390 /// **Remark:** User must use [`Z3_stats_inc_ref`] and [`Z3_stats_dec_ref`] to manage Z3_stats objects.
4391 pub fn Z3_solver_get_statistics(c: Z3_context, s: Z3_solver) -> Option<Z3_stats>;
4392 /// Convert a solver into a string.
4393 ///
4394 /// # See also
4395 ///
4396 /// - [`Z3_solver_from_file`]
4397 /// - [`Z3_solver_from_string`]
4398 pub fn Z3_solver_to_string(c: Z3_context, s: Z3_solver) -> Z3_string;
4399 /// Convert a solver into a DIMACS formatted string.
4400 ///
4401 /// # See also
4402 ///
4403 /// - [`Z3_goal_to_diamcs_string`]
4404 pub fn Z3_solver_to_dimacs_string(
4405 c: Z3_context,
4406 s: Z3_solver,
4407 include_names: bool,
4408 ) -> Z3_string;
4409 /// Convert a statistics into a string.
4410 pub fn Z3_stats_to_string(c: Z3_context, s: Z3_stats) -> Z3_string;
4411 /// Increment the reference counter of the given statistics object.
4412 pub fn Z3_stats_inc_ref(c: Z3_context, s: Z3_stats);
4413 /// Decrement the reference counter of the given statistics object.
4414 pub fn Z3_stats_dec_ref(c: Z3_context, s: Z3_stats);
4415 /// Return the number of statistical data in `s`.
4416 pub fn Z3_stats_size(c: Z3_context, s: Z3_stats) -> ::core::ffi::c_uint;
4417 /// Return the key (a string) for a particular statistical data.
4418 ///
4419 /// # Preconditions
4420 ///
4421 /// - `idx < Z3_stats_size(c, s)`
4422 pub fn Z3_stats_get_key(
4423 c: Z3_context,
4424 s: Z3_stats,
4425 idx: ::core::ffi::c_uint,
4426 ) -> Z3_string;
4427 /// Return `true` if the given statistical data is a unsigned integer.
4428 ///
4429 /// # Preconditions
4430 ///
4431 /// - `idx < Z3_stats_size(c, s)`
4432 pub fn Z3_stats_is_uint(
4433 c: Z3_context,
4434 s: Z3_stats,
4435 idx: ::core::ffi::c_uint,
4436 ) -> bool;
4437 /// Return `true` if the given statistical data is a double.
4438 ///
4439 /// # Preconditions
4440 ///
4441 /// - `idx < Z3_stats_size(c, s)`
4442 pub fn Z3_stats_is_double(
4443 c: Z3_context,
4444 s: Z3_stats,
4445 idx: ::core::ffi::c_uint,
4446 ) -> bool;
4447 /// Return the unsigned value of the given statistical data.
4448 ///
4449 /// # Preconditions
4450 ///
4451 /// - `idx < Z3_stats_size(c, s) && Z3_stats_is_uint(c, s)`
4452 pub fn Z3_stats_get_uint_value(
4453 c: Z3_context,
4454 s: Z3_stats,
4455 idx: ::core::ffi::c_uint,
4456 ) -> ::core::ffi::c_uint;
4457 /// Return the double value of the given statistical data.
4458 ///
4459 /// # Preconditions
4460 ///
4461 /// - `idx < Z3_stats_size(c, s) && Z3_stats_is_double(c, s)`
4462 pub fn Z3_stats_get_double_value(
4463 c: Z3_context,
4464 s: Z3_stats,
4465 idx: ::core::ffi::c_uint,
4466 ) -> f64;
4467 /// Return the estimated allocated memory in bytes.
4468 pub fn Z3_get_estimated_alloc_size() -> u64;
4469 /// Return an empty AST vector.
4470 ///
4471 /// **Remark:** Reference counting must be used to manage AST vectors, even when the Z3_context was
4472 /// created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
4473 pub fn Z3_mk_ast_vector(c: Z3_context) -> Option<Z3_ast_vector>;
4474 /// Increment the reference counter of the given AST vector.
4475 pub fn Z3_ast_vector_inc_ref(c: Z3_context, v: Z3_ast_vector);
4476 /// Decrement the reference counter of the given AST vector.
4477 pub fn Z3_ast_vector_dec_ref(c: Z3_context, v: Z3_ast_vector);
4478 /// Return the size of the given AST vector.
4479 pub fn Z3_ast_vector_size(c: Z3_context, v: Z3_ast_vector) -> ::core::ffi::c_uint;
4480 /// Return the AST at position `i` in the AST vector `v`.
4481 ///
4482 /// # Preconditions
4483 ///
4484 /// - `i < Z3_ast_vector_size(c, v)`
4485 pub fn Z3_ast_vector_get(
4486 c: Z3_context,
4487 v: Z3_ast_vector,
4488 i: ::core::ffi::c_uint,
4489 ) -> Option<Z3_ast>;
4490 /// Update position `i` of the AST vector `v` with the AST `a`.
4491 ///
4492 /// # Preconditions
4493 ///
4494 /// - `i < Z3_ast_vector_size(c, v)`
4495 pub fn Z3_ast_vector_set(
4496 c: Z3_context,
4497 v: Z3_ast_vector,
4498 i: ::core::ffi::c_uint,
4499 a: Z3_ast,
4500 );
4501 /// Resize the AST vector `v`.
4502 pub fn Z3_ast_vector_resize(c: Z3_context, v: Z3_ast_vector, n: ::core::ffi::c_uint);
4503 /// Add the AST `a` in the end of the AST vector `v`. The size of `v` is increased by one.
4504 pub fn Z3_ast_vector_push(c: Z3_context, v: Z3_ast_vector, a: Z3_ast);
4505 /// Translate the AST vector `v` from context `s` into an AST vector in context `t`.
4506 pub fn Z3_ast_vector_translate(
4507 s: Z3_context,
4508 v: Z3_ast_vector,
4509 t: Z3_context,
4510 ) -> Option<Z3_ast_vector>;
4511 /// Convert AST vector into a string.
4512 pub fn Z3_ast_vector_to_string(c: Z3_context, v: Z3_ast_vector) -> Z3_string;
4513 /// Return an empty mapping from AST to AST
4514 ///
4515 /// **Remark:** Reference counting must be used to manage AST maps, even when the Z3_context was
4516 /// created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
4517 pub fn Z3_mk_ast_map(c: Z3_context) -> Option<Z3_ast_map>;
4518 /// Increment the reference counter of the given AST map.
4519 pub fn Z3_ast_map_inc_ref(c: Z3_context, m: Z3_ast_map);
4520 /// Decrement the reference counter of the given AST map.
4521 pub fn Z3_ast_map_dec_ref(c: Z3_context, m: Z3_ast_map);
4522 /// Return true if the map `m` contains the AST key `k`.
4523 pub fn Z3_ast_map_contains(c: Z3_context, m: Z3_ast_map, k: Z3_ast) -> bool;
4524 /// Return the value associated with the key `k`.
4525 ///
4526 /// The procedure invokes the error handler if `k` is not in the map.
4527 pub fn Z3_ast_map_find(c: Z3_context, m: Z3_ast_map, k: Z3_ast) -> Option<Z3_ast>;
4528 /// Store/Replace a new key, value pair in the given map.
4529 pub fn Z3_ast_map_insert(c: Z3_context, m: Z3_ast_map, k: Z3_ast, v: Z3_ast);
4530 /// Erase a key from the map.
4531 pub fn Z3_ast_map_erase(c: Z3_context, m: Z3_ast_map, k: Z3_ast);
4532 /// Remove all keys from the given map.
4533 pub fn Z3_ast_map_reset(c: Z3_context, m: Z3_ast_map);
4534 /// Return the size of the given map.
4535 pub fn Z3_ast_map_size(c: Z3_context, m: Z3_ast_map) -> ::core::ffi::c_uint;
4536 /// Return the keys stored in the given map.
4537 pub fn Z3_ast_map_keys(c: Z3_context, m: Z3_ast_map) -> Option<Z3_ast_vector>;
4538 /// Convert the given map into a string.
4539 pub fn Z3_ast_map_to_string(c: Z3_context, m: Z3_ast_map) -> Z3_string;
4540 /// Return `true` if `a` can be used as value in the Z3 real algebraic
4541 /// number package.
4542 pub fn Z3_algebraic_is_value(c: Z3_context, a: Z3_ast) -> bool;
4543 /// Return `true` if `a` is positive, and `false` otherwise.
4544 ///
4545 /// # Preconditions
4546 ///
4547 /// - `Z3_algebraic_is_value(c, a)`
4548 pub fn Z3_algebraic_is_pos(c: Z3_context, a: Z3_ast) -> bool;
4549 /// Return `true` if `a` is negative, and `false` otherwise.
4550 ///
4551 /// # Preconditions
4552 ///
4553 /// - `Z3_algebraic_is_value(c, a)`
4554 pub fn Z3_algebraic_is_neg(c: Z3_context, a: Z3_ast) -> bool;
4555 /// Return `true` if `a` is zero, and `false` otherwise.
4556 ///
4557 /// # Preconditions
4558 ///
4559 /// - `Z3_algebraic_is_value(c, a)`
4560 pub fn Z3_algebraic_is_zero(c: Z3_context, a: Z3_ast) -> bool;
4561 /// Return 1 if `a` is positive, 0 if `a` is zero, and -1 if `a` is negative.
4562 ///
4563 /// # Preconditions
4564 ///
4565 /// - `Z3_algebraic_is_value(c, a)`
4566 pub fn Z3_algebraic_sign(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_int;
4567 /// Return the value a + b.
4568 ///
4569 /// \post Z3_algebraic_is_value(c, result)
4570 ///
4571 /// # Preconditions
4572 ///
4573 /// - `Z3_algebraic_is_value(c, a)`
4574 /// - `Z3_algebraic_is_value(c, b)`
4575 pub fn Z3_algebraic_add(c: Z3_context, a: Z3_ast, b: Z3_ast) -> Option<Z3_ast>;
4576 /// Return the value a - b.
4577 ///
4578 /// \post Z3_algebraic_is_value(c, result)
4579 ///
4580 /// # Preconditions
4581 ///
4582 /// - `Z3_algebraic_is_value(c, a)`
4583 /// - `Z3_algebraic_is_value(c, b)`
4584 pub fn Z3_algebraic_sub(c: Z3_context, a: Z3_ast, b: Z3_ast) -> Option<Z3_ast>;
4585 /// Return the value a * b.
4586 ///
4587 /// \post Z3_algebraic_is_value(c, result)
4588 ///
4589 /// # Preconditions
4590 ///
4591 /// - `Z3_algebraic_is_value(c, a)`
4592 /// - `Z3_algebraic_is_value(c, b)`
4593 pub fn Z3_algebraic_mul(c: Z3_context, a: Z3_ast, b: Z3_ast) -> Option<Z3_ast>;
4594 /// Return the value a / b.
4595 ///
4596 /// \post Z3_algebraic_is_value(c, result)
4597 ///
4598 /// # Preconditions
4599 ///
4600 /// - `Z3_algebraic_is_value(c, a)`
4601 /// - `Z3_algebraic_is_value(c, b)`
4602 /// - `!Z3_algebraic_is_zero(c, b)`
4603 pub fn Z3_algebraic_div(c: Z3_context, a: Z3_ast, b: Z3_ast) -> Option<Z3_ast>;
4604 /// Return the a^(1/k)
4605 ///
4606 /// \post Z3_algebraic_is_value(c, result)
4607 ///
4608 /// # Preconditions
4609 ///
4610 /// - `Z3_algebraic_is_value(c, a)`
4611 /// - `k is even => !Z3_algebraic_is_neg(c, a)`
4612 pub fn Z3_algebraic_root(
4613 c: Z3_context,
4614 a: Z3_ast,
4615 k: ::core::ffi::c_uint,
4616 ) -> Option<Z3_ast>;
4617 /// Return the a^k
4618 ///
4619 /// \post Z3_algebraic_is_value(c, result)
4620 ///
4621 /// # Preconditions
4622 ///
4623 /// - `Z3_algebraic_is_value(c, a)`
4624 pub fn Z3_algebraic_power(
4625 c: Z3_context,
4626 a: Z3_ast,
4627 k: ::core::ffi::c_uint,
4628 ) -> Option<Z3_ast>;
4629 /// Return `true` if a < b, and `false` otherwise.
4630 ///
4631 /// # Preconditions
4632 ///
4633 /// - `Z3_algebraic_is_value(c, a)`
4634 /// - `Z3_algebraic_is_value(c, b)`
4635 pub fn Z3_algebraic_lt(c: Z3_context, a: Z3_ast, b: Z3_ast) -> bool;
4636 /// Return `true` if a > b, and `false` otherwise.
4637 ///
4638 /// # Preconditions
4639 ///
4640 /// - `Z3_algebraic_is_value(c, a)`
4641 /// - `Z3_algebraic_is_value(c, b)`
4642 pub fn Z3_algebraic_gt(c: Z3_context, a: Z3_ast, b: Z3_ast) -> bool;
4643 /// Return `true` if a <= b, and `false` otherwise.
4644 ///
4645 /// # Preconditions
4646 ///
4647 /// - `Z3_algebraic_is_value(c, a)`
4648 /// - `Z3_algebraic_is_value(c, b)`
4649 pub fn Z3_algebraic_le(c: Z3_context, a: Z3_ast, b: Z3_ast) -> bool;
4650 /// Return `true` if a >= b, and `false` otherwise.
4651 ///
4652 /// # Preconditions
4653 ///
4654 /// - `Z3_algebraic_is_value(c, a)`
4655 /// - `Z3_algebraic_is_value(c, b)`
4656 pub fn Z3_algebraic_ge(c: Z3_context, a: Z3_ast, b: Z3_ast) -> bool;
4657 /// Return `true` if a == b, and `false` otherwise.
4658 ///
4659 /// # Preconditions
4660 ///
4661 /// - `Z3_algebraic_is_value(c, a)`
4662 /// - `Z3_algebraic_is_value(c, b)`
4663 pub fn Z3_algebraic_eq(c: Z3_context, a: Z3_ast, b: Z3_ast) -> bool;
4664 /// Return `true` if a != b, and `false` otherwise.
4665 ///
4666 /// # Preconditions
4667 ///
4668 /// - `Z3_algebraic_is_value(c, a)`
4669 /// - `Z3_algebraic_is_value(c, b)`
4670 pub fn Z3_algebraic_neq(c: Z3_context, a: Z3_ast, b: Z3_ast) -> bool;
4671 /// Given a multivariate polynomial p(x_0, ..., x_{n-1}, x_n), returns the
4672 /// roots of the univariate polynomial p(a\[0], ..., a\[n-1], x_n).
4673 ///
4674 /// \post forall r in result Z3_algebraic_is_value(c, result)
4675 ///
4676 /// # Preconditions
4677 ///
4678 /// - `p is a Z3 expression that contains only arithmetic terms and free variables.`
4679 /// - `forall i in [0, n) Z3_algebraic_is_value(c, a\[i])`
4680 pub fn Z3_algebraic_roots(
4681 c: Z3_context,
4682 p: Z3_ast,
4683 n: ::core::ffi::c_uint,
4684 a: *mut Z3_ast,
4685 ) -> Option<Z3_ast_vector>;
4686 /// Given a multivariate polynomial p(x_0, ..., x_{n-1}), return the
4687 /// sign of p(a\[0], ..., a\[n-1]).
4688 ///
4689 /// # Preconditions
4690 ///
4691 /// - `p is a Z3 expression that contains only arithmetic terms and free variables.`
4692 /// - `forall i in [0, n) Z3_algebraic_is_value(c, a\[i])`
4693 pub fn Z3_algebraic_eval(
4694 c: Z3_context,
4695 p: Z3_ast,
4696 n: ::core::ffi::c_uint,
4697 a: *mut Z3_ast,
4698 ) -> ::core::ffi::c_int;
4699 /// Return the coefficients of the defining polynomial.
4700 ///
4701 /// # Preconditions
4702 ///
4703 /// - `Z3_algebraic_is_value(c, a)`
4704 pub fn Z3_algebraic_get_poly(c: Z3_context, a: Z3_ast) -> Option<Z3_ast_vector>;
4705 /// Return which root of the polynomial the algebraic number represents.
4706 ///
4707 /// # Preconditions
4708 ///
4709 /// - `Z3_algebraic_is_value(c, a)`
4710 pub fn Z3_algebraic_get_i(c: Z3_context, a: Z3_ast) -> ::core::ffi::c_uint;
4711 /// Return the nonzero subresultants of `p` and `q` with respect to the "variable" `x`.
4712 ///
4713 /// Note that, any subterm that cannot be viewed as a polynomial is assumed to be a variable.
4714 /// Example: `f(a)` is a considered to be a variable in the polynomial \ccode{
4715 /// f(a)*f(a) + 2*f(a) + 1}
4716 ///
4717 /// # Preconditions
4718 ///
4719 /// - ``p`, `q` and `x` are Z3 expressions where `p` and `q` are arithmetic terms.`
4720 pub fn Z3_polynomial_subresultants(
4721 c: Z3_context,
4722 p: Z3_ast,
4723 q: Z3_ast,
4724 x: Z3_ast,
4725 ) -> Option<Z3_ast_vector>;
4726 /// Delete a RCF numeral created using the RCF API.
4727 pub fn Z3_rcf_del(c: Z3_context, a: Z3_rcf_num);
4728 /// Return a RCF rational using the given string.
4729 pub fn Z3_rcf_mk_rational(c: Z3_context, val: Z3_string) -> Option<Z3_rcf_num>;
4730 /// Return a RCF small integer.
4731 pub fn Z3_rcf_mk_small_int(
4732 c: Z3_context,
4733 val: ::core::ffi::c_int,
4734 ) -> Option<Z3_rcf_num>;
4735 /// Return Pi
4736 pub fn Z3_rcf_mk_pi(c: Z3_context) -> Option<Z3_rcf_num>;
4737 /// Return e (Euler's constant)
4738 pub fn Z3_rcf_mk_e(c: Z3_context) -> Option<Z3_rcf_num>;
4739 /// Return a new infinitesimal that is smaller than all elements in the Z3 field.
4740 pub fn Z3_rcf_mk_infinitesimal(c: Z3_context) -> Option<Z3_rcf_num>;
4741 /// Store in roots the roots of the polynomial `a[n-1]*x^{n-1` + ... + a\[0]}.
4742 /// The output vector `roots` must have size `n`.
4743 /// It returns the number of roots of the polynomial.
4744 ///
4745 /// # Preconditions
4746 ///
4747 /// - `The input polynomial is not the zero polynomial.`
4748 pub fn Z3_rcf_mk_roots(
4749 c: Z3_context,
4750 n: ::core::ffi::c_uint,
4751 a: *const Z3_rcf_num,
4752 roots: *mut Z3_rcf_num,
4753 ) -> ::core::ffi::c_uint;
4754 /// Return the value `a + b`.
4755 pub fn Z3_rcf_add(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> Option<Z3_rcf_num>;
4756 /// Return the value `a - b`.
4757 pub fn Z3_rcf_sub(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> Option<Z3_rcf_num>;
4758 /// Return the value `a * b`.
4759 pub fn Z3_rcf_mul(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> Option<Z3_rcf_num>;
4760 /// Return the value `a / b`.
4761 pub fn Z3_rcf_div(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> Option<Z3_rcf_num>;
4762 /// Return the value `-a`.
4763 pub fn Z3_rcf_neg(c: Z3_context, a: Z3_rcf_num) -> Option<Z3_rcf_num>;
4764 /// Return the value `1/a`.
4765 pub fn Z3_rcf_inv(c: Z3_context, a: Z3_rcf_num) -> Option<Z3_rcf_num>;
4766 /// Return the value `a^k`.
4767 pub fn Z3_rcf_power(
4768 c: Z3_context,
4769 a: Z3_rcf_num,
4770 k: ::core::ffi::c_uint,
4771 ) -> Option<Z3_rcf_num>;
4772 /// Return `true` if `a < b`.
4773 pub fn Z3_rcf_lt(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> bool;
4774 /// Return `true` if `a > b`.
4775 pub fn Z3_rcf_gt(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> bool;
4776 /// Return `true` if `a <= b`.
4777 pub fn Z3_rcf_le(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> bool;
4778 /// Return `true` if `a >= b`.
4779 pub fn Z3_rcf_ge(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> bool;
4780 /// Return `true` if `a == b`.
4781 pub fn Z3_rcf_eq(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> bool;
4782 /// Return `true` if `a != b`.
4783 pub fn Z3_rcf_neq(c: Z3_context, a: Z3_rcf_num, b: Z3_rcf_num) -> bool;
4784 /// Convert the RCF numeral into a string.
4785 pub fn Z3_rcf_num_to_string(
4786 c: Z3_context,
4787 a: Z3_rcf_num,
4788 compact: bool,
4789 html: bool,
4790 ) -> Z3_string;
4791 /// Convert the RCF numeral into a string in decimal notation.
4792 pub fn Z3_rcf_num_to_decimal_string(
4793 c: Z3_context,
4794 a: Z3_rcf_num,
4795 prec: ::core::ffi::c_uint,
4796 ) -> Z3_string;
4797 /// Extract the "numerator" and "denominator" of the given RCF numeral.
4798 /// We have that `a = n/d`, moreover `n` and `d` are not represented using rational functions.
4799 pub fn Z3_rcf_get_numerator_denominator(
4800 c: Z3_context,
4801 a: Z3_rcf_num,
4802 n: *mut Z3_rcf_num,
4803 d: *mut Z3_rcf_num,
4804 );
4805 /// Return `true` if `a` represents a rational number.
4806 pub fn Z3_rcf_is_rational(c: Z3_context, a: Z3_rcf_num) -> bool;
4807 /// Return `true` if `a` represents an algebraic number.
4808 pub fn Z3_rcf_is_algebraic(c: Z3_context, a: Z3_rcf_num) -> bool;
4809 /// Return `true` if `a` represents an infinitesimal.
4810 pub fn Z3_rcf_is_infinitesimal(c: Z3_context, a: Z3_rcf_num) -> bool;
4811 /// Return `true` if `a` represents a transcendental number.
4812 pub fn Z3_rcf_is_transcendental(c: Z3_context, a: Z3_rcf_num) -> bool;
4813 /// Return the index of a field extension.
4814 pub fn Z3_rcf_extension_index(c: Z3_context, a: Z3_rcf_num) -> ::core::ffi::c_uint;
4815 /// Return the name of a transcendental.
4816 ///
4817 /// # Preconditions
4818 ///
4819 /// - `Z3_rcf_is_transcendtal(ctx, a);`
4820 pub fn Z3_rcf_transcendental_name(c: Z3_context, a: Z3_rcf_num) -> Option<Z3_symbol>;
4821 /// Return the name of an infinitesimal.
4822 ///
4823 /// # Preconditions
4824 ///
4825 /// - `Z3_rcf_is_infinitesimal(ctx, a);`
4826 pub fn Z3_rcf_infinitesimal_name(c: Z3_context, a: Z3_rcf_num) -> Option<Z3_symbol>;
4827 /// Return the number of coefficients in an algebraic number.
4828 ///
4829 /// # Preconditions
4830 ///
4831 /// - `Z3_rcf_is_algebraic(ctx, a);`
4832 pub fn Z3_rcf_num_coefficients(c: Z3_context, a: Z3_rcf_num) -> ::core::ffi::c_uint;
4833 /// Extract a coefficient from an algebraic number.
4834 ///
4835 /// # Preconditions
4836 ///
4837 /// - `Z3_rcf_is_algebraic(ctx, a);`
4838 pub fn Z3_rcf_coefficient(
4839 c: Z3_context,
4840 a: Z3_rcf_num,
4841 i: ::core::ffi::c_uint,
4842 ) -> Option<Z3_rcf_num>;
4843 /// Extract an interval from an algebraic number.
4844 ///
4845 /// # Preconditions
4846 ///
4847 /// - `Z3_rcf_is_algebraic(ctx, a);`
4848 pub fn Z3_rcf_interval(
4849 c: Z3_context,
4850 a: Z3_rcf_num,
4851 lower_is_inf: *mut bool,
4852 lower_is_open: *mut bool,
4853 lower: *mut Z3_rcf_num,
4854 upper_is_inf: *mut bool,
4855 upper_is_open: *mut bool,
4856 upper: *mut Z3_rcf_num,
4857 ) -> ::core::ffi::c_int;
4858 /// Return the number of sign conditions of an algebraic number.
4859 ///
4860 /// # Preconditions
4861 ///
4862 /// - `Z3_rcf_is_algebraic(ctx, a);`
4863 pub fn Z3_rcf_num_sign_conditions(
4864 c: Z3_context,
4865 a: Z3_rcf_num,
4866 ) -> ::core::ffi::c_uint;
4867 /// Extract the sign of a sign condition from an algebraic number.
4868 ///
4869 /// # Preconditions
4870 ///
4871 /// - `Z3_rcf_is_algebraic(ctx, a);`
4872 pub fn Z3_rcf_sign_condition_sign(
4873 c: Z3_context,
4874 a: Z3_rcf_num,
4875 i: ::core::ffi::c_uint,
4876 ) -> ::core::ffi::c_int;
4877 /// Return the number of sign condition polynomial coefficients of an algebraic number.
4878 ///
4879 /// # Preconditions
4880 ///
4881 /// - `Z3_rcf_is_algebraic(ctx, a);`
4882 pub fn Z3_rcf_num_sign_condition_coefficients(
4883 c: Z3_context,
4884 a: Z3_rcf_num,
4885 i: ::core::ffi::c_uint,
4886 ) -> ::core::ffi::c_uint;
4887 /// Extract the j-th polynomial coefficient of the i-th sign condition.
4888 ///
4889 /// # Preconditions
4890 ///
4891 /// - `Z3_rcf_is_algebraic(ctx, a);`
4892 pub fn Z3_rcf_sign_condition_coefficient(
4893 c: Z3_context,
4894 a: Z3_rcf_num,
4895 i: ::core::ffi::c_uint,
4896 j: ::core::ffi::c_uint,
4897 ) -> Option<Z3_rcf_num>;
4898 /// Create a new fixedpoint context.
4899 ///
4900 /// **Remark:** User must use [`Z3_fixedpoint_inc_ref`] and [`Z3_fixedpoint_dec_ref`] to manage fixedpoint objects.
4901 /// Even if the context was created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
4902 pub fn Z3_mk_fixedpoint(c: Z3_context) -> Option<Z3_fixedpoint>;
4903 /// Increment the reference counter of the given fixedpoint context
4904 pub fn Z3_fixedpoint_inc_ref(c: Z3_context, d: Z3_fixedpoint);
4905 /// Decrement the reference counter of the given fixedpoint context.
4906 pub fn Z3_fixedpoint_dec_ref(c: Z3_context, d: Z3_fixedpoint);
4907 /// Add a Database fact.
4908 ///
4909 /// - `c`: - context
4910 /// - `d`: - fixed point context
4911 /// - `r`: - relation signature for the row.
4912 /// - `num_args`: - number of columns for the given row.
4913 /// - `args`: - array of the row elements.
4914 ///
4915 /// The number of arguments `num_args` should be equal to the number
4916 /// of sorts in the domain of `r`. Each sort in the domain should be an integral
4917 /// (bit-vector, Boolean or or finite domain sort).
4918 ///
4919 /// The call has the same effect as adding a rule where `r` is applied to the arguments.
4920 pub fn Z3_fixedpoint_add_fact(
4921 c: Z3_context,
4922 d: Z3_fixedpoint,
4923 r: Z3_func_decl,
4924 num_args: ::core::ffi::c_uint,
4925 args: *mut ::core::ffi::c_uint,
4926 );
4927 /// Assert a constraint to the fixedpoint context.
4928 ///
4929 /// The constraints are used as background axioms when the fixedpoint engine uses the PDR mode.
4930 /// They are ignored for standard Datalog mode.
4931 pub fn Z3_fixedpoint_assert(c: Z3_context, d: Z3_fixedpoint, axiom: Z3_ast);
4932 /// Pose a query against the asserted rules.
4933 ///
4934 /// ```c
4935 /// query ::= (exists (bound-vars) query)
4936 /// | literals
4937 /// ```
4938 ///
4939 /// query returns
4940 /// - `Z3_L_FALSE` if the query is unsatisfiable.
4941 /// - `Z3_L_TRUE` if the query is satisfiable. Obtain the answer by calling [`Z3_fixedpoint_get_answer`].
4942 /// - `Z3_L_UNDEF` if the query was interrupted, timed out or otherwise failed.
4943 pub fn Z3_fixedpoint_query(
4944 c: Z3_context,
4945 d: Z3_fixedpoint,
4946 query: Z3_ast,
4947 ) -> Z3_lbool;
4948 /// Pose multiple queries against the asserted rules.
4949 ///
4950 /// The queries are encoded as relations (function declarations).
4951 ///
4952 /// query returns
4953 /// - `Z3_L_FALSE` if the query is unsatisfiable.
4954 /// - `Z3_L_TRUE` if the query is satisfiable. Obtain the answer by calling [`Z3_fixedpoint_get_answer`].
4955 /// - `Z3_L_UNDEF` if the query was interrupted, timed out or otherwise failed.
4956 pub fn Z3_fixedpoint_query_relations(
4957 c: Z3_context,
4958 d: Z3_fixedpoint,
4959 num_relations: ::core::ffi::c_uint,
4960 relations: *const Z3_func_decl,
4961 ) -> Z3_lbool;
4962 /// Retrieve a formula that encodes satisfying answers to the query.
4963 ///
4964 ///
4965 /// When used in Datalog mode, the returned answer is a disjunction of conjuncts.
4966 /// Each conjunct encodes values of the bound variables of the query that are satisfied.
4967 /// In PDR mode, the returned answer is a single conjunction.
4968 ///
4969 /// When used in Datalog mode the previous call to [`Z3_fixedpoint_query`] must have returned `Z3_L_TRUE`.
4970 /// When used with the PDR engine, the previous call must have been either `Z3_L_TRUE` or `Z3_L_FALSE`.
4971 pub fn Z3_fixedpoint_get_answer(c: Z3_context, d: Z3_fixedpoint) -> Option<Z3_ast>;
4972 /// Retrieve a string that describes the last status returned by [`Z3_fixedpoint_query`].
4973 ///
4974 /// Use this method when [`Z3_fixedpoint_query`] returns `Z3_L_UNDEF`.
4975 pub fn Z3_fixedpoint_get_reason_unknown(
4976 c: Z3_context,
4977 d: Z3_fixedpoint,
4978 ) -> Z3_string;
4979 /// Update a named rule.
4980 /// A rule with the same name must have been previously created.
4981 pub fn Z3_fixedpoint_update_rule(
4982 c: Z3_context,
4983 d: Z3_fixedpoint,
4984 a: Z3_ast,
4985 name: Z3_symbol,
4986 );
4987 /// Query the PDR engine for the maximal levels properties are known about predicate.
4988 ///
4989 /// This call retrieves the maximal number of relevant unfoldings
4990 /// of `pred` with respect to the current exploration state.
4991 /// Note: this functionality is PDR specific.
4992 pub fn Z3_fixedpoint_get_num_levels(
4993 c: Z3_context,
4994 d: Z3_fixedpoint,
4995 pred: Z3_func_decl,
4996 ) -> ::core::ffi::c_uint;
4997 /// Retrieve the current cover of `pred` up to `level` unfoldings.
4998 /// Return just the delta that is known at `level`. To
4999 /// obtain the full set of properties of `pred` one should query
5000 /// at `level`+1 , `level`+2 etc, and include `level`=-1.
5001 ///
5002 /// Note: this functionality is PDR specific.
5003 pub fn Z3_fixedpoint_get_cover_delta(
5004 c: Z3_context,
5005 d: Z3_fixedpoint,
5006 level: ::core::ffi::c_int,
5007 pred: Z3_func_decl,
5008 ) -> Option<Z3_ast>;
5009 /// Add property about the predicate `pred`.
5010 /// Add a property of predicate `pred` at `level`.
5011 /// It gets pushed forward when possible.
5012 ///
5013 /// Note: level = -1 is treated as the fixedpoint. So passing -1 for the `level`
5014 /// means that the property is true of the fixed-point unfolding with respect to `pred`.
5015 ///
5016 /// Note: this functionality is PDR specific.
5017 pub fn Z3_fixedpoint_add_cover(
5018 c: Z3_context,
5019 d: Z3_fixedpoint,
5020 level: ::core::ffi::c_int,
5021 pred: Z3_func_decl,
5022 property: Z3_ast,
5023 );
5024 /// Retrieve statistics information from the last call to [`Z3_fixedpoint_query`].
5025 pub fn Z3_fixedpoint_get_statistics(
5026 c: Z3_context,
5027 d: Z3_fixedpoint,
5028 ) -> Option<Z3_stats>;
5029 /// Register relation as Fixedpoint defined.
5030 /// Fixedpoint defined relations have least-fixedpoint semantics.
5031 /// For example, the relation is empty if it does not occur
5032 /// in a head or a fact.
5033 pub fn Z3_fixedpoint_register_relation(
5034 c: Z3_context,
5035 d: Z3_fixedpoint,
5036 f: Z3_func_decl,
5037 );
5038 /// Configure the predicate representation.
5039 ///
5040 /// It sets the predicate to use a set of domains given by the list of symbols.
5041 /// The domains given by the list of symbols must belong to a set
5042 /// of built-in domains.
5043 pub fn Z3_fixedpoint_set_predicate_representation(
5044 c: Z3_context,
5045 d: Z3_fixedpoint,
5046 f: Z3_func_decl,
5047 num_relations: ::core::ffi::c_uint,
5048 relation_kinds: *const Z3_symbol,
5049 );
5050 /// Retrieve set of rules from fixedpoint context.
5051 pub fn Z3_fixedpoint_get_rules(
5052 c: Z3_context,
5053 f: Z3_fixedpoint,
5054 ) -> Option<Z3_ast_vector>;
5055 /// Retrieve set of background assertions from fixedpoint context.
5056 pub fn Z3_fixedpoint_get_assertions(
5057 c: Z3_context,
5058 f: Z3_fixedpoint,
5059 ) -> Option<Z3_ast_vector>;
5060 /// Set parameters on fixedpoint context.
5061 ///
5062 /// # See also
5063 ///
5064 /// - [`Z3_fixedpoint_get_help`]
5065 /// - [`Z3_fixedpoint_get_param_descrs`]
5066 pub fn Z3_fixedpoint_set_params(c: Z3_context, f: Z3_fixedpoint, p: Z3_params);
5067 /// Return a string describing all fixedpoint available parameters.
5068 ///
5069 /// # See also
5070 ///
5071 /// - [`Z3_fixedpoint_get_param_descrs`]
5072 /// - [`Z3_fixedpoint_set_params`]
5073 pub fn Z3_fixedpoint_get_help(c: Z3_context, f: Z3_fixedpoint) -> Z3_string;
5074 /// Return the parameter description set for the given fixedpoint object.
5075 ///
5076 /// # See also
5077 ///
5078 /// - [`Z3_fixedpoint_get_help`]
5079 /// - [`Z3_fixedpoint_set_params`]
5080 pub fn Z3_fixedpoint_get_param_descrs(
5081 c: Z3_context,
5082 f: Z3_fixedpoint,
5083 ) -> Option<Z3_param_descrs>;
5084 /// Print the current rules and background axioms as a string.
5085 /// - `c`: - context.
5086 /// - `f`: - fixedpoint context.
5087 /// - `num_queries`: - number of additional queries to print.
5088 /// - `queries`: - additional queries.
5089 ///
5090 /// # See also
5091 ///
5092 /// - [`Z3_fixedpoint_from_file`]
5093 /// - [`Z3_fixedpoint_from_string`]
5094 pub fn Z3_fixedpoint_to_string(
5095 c: Z3_context,
5096 f: Z3_fixedpoint,
5097 num_queries: ::core::ffi::c_uint,
5098 queries: *mut Z3_ast,
5099 ) -> Z3_string;
5100 /// Parse an SMT-LIB2 string with fixedpoint rules.
5101 /// Add the rules to the current fixedpoint context.
5102 /// Return the set of queries in the string.
5103 ///
5104 /// - `c`: - context.
5105 /// - `f`: - fixedpoint context.
5106 /// - `s`: - string containing SMT2 specification.
5107 ///
5108 /// # See also
5109 ///
5110 /// - [`Z3_fixedpoint_from_file`]
5111 /// - [`Z3_fixedpoint_to_string`]
5112 pub fn Z3_fixedpoint_from_string(
5113 c: Z3_context,
5114 f: Z3_fixedpoint,
5115 s: Z3_string,
5116 ) -> Option<Z3_ast_vector>;
5117 /// Parse an SMT-LIB2 file with fixedpoint rules.
5118 /// Add the rules to the current fixedpoint context.
5119 /// Return the set of queries in the file.
5120 ///
5121 /// - `c`: - context.
5122 /// - `f`: - fixedpoint context.
5123 /// - `s`: - path to file containing SMT2 specification.
5124 ///
5125 /// # See also
5126 ///
5127 /// - [`Z3_fixedpoint_from_string`]
5128 /// - [`Z3_fixedpoint_to_string`]
5129 pub fn Z3_fixedpoint_from_file(
5130 c: Z3_context,
5131 f: Z3_fixedpoint,
5132 s: Z3_string,
5133 ) -> Option<Z3_ast_vector>;
5134 /// Initialize the context with a user-defined state.
5135 pub fn Z3_fixedpoint_init(
5136 c: Z3_context,
5137 d: Z3_fixedpoint,
5138 state: *mut ::core::ffi::c_void,
5139 );
5140 /// Register a callback to destructive updates.
5141 ///
5142 /// Registers are identified with terms encoded as fresh constants,
5143 pub fn Z3_fixedpoint_set_reduce_assign_callback(
5144 c: Z3_context,
5145 d: Z3_fixedpoint,
5146 cb: Z3_fixedpoint_reduce_assign_callback_fptr,
5147 );
5148 /// Register a callback for building terms based on the relational operators.
5149 pub fn Z3_fixedpoint_set_reduce_app_callback(
5150 c: Z3_context,
5151 d: Z3_fixedpoint,
5152 cb: Z3_fixedpoint_reduce_app_callback_fptr,
5153 );
5154 /// set export callback for lemmas
5155 pub fn Z3_fixedpoint_add_callback(
5156 ctx: Z3_context,
5157 f: Z3_fixedpoint,
5158 state: *mut ::core::ffi::c_void,
5159 new_lemma_eh: Z3_fixedpoint_new_lemma_eh,
5160 predecessor_eh: Z3_fixedpoint_predecessor_eh,
5161 unfold_eh: Z3_fixedpoint_unfold_eh,
5162 );
5163 pub fn Z3_fixedpoint_add_constraint(
5164 c: Z3_context,
5165 d: Z3_fixedpoint,
5166 e: Z3_ast,
5167 lvl: ::core::ffi::c_uint,
5168 );
5169 /// Create a new optimize context.
5170 ///
5171 /// **Remark:** User must use [`Z3_optimize_inc_ref`] and [`Z3_optimize_dec_ref`] to manage optimize objects.
5172 /// Even if the context was created using [`Z3_mk_context`] instead of [`Z3_mk_context_rc`].
5173 pub fn Z3_mk_optimize(c: Z3_context) -> Option<Z3_optimize>;
5174 /// Increment the reference counter of the given optimize context
5175 pub fn Z3_optimize_inc_ref(c: Z3_context, d: Z3_optimize);
5176 /// Decrement the reference counter of the given optimize context.
5177 pub fn Z3_optimize_dec_ref(c: Z3_context, d: Z3_optimize);
5178 /// Assert hard constraint to the optimization context.
5179 ///
5180 /// # See also
5181 ///
5182 /// - [`Z3_optimize_assert_soft`]
5183 /// - [`Z3_optimize_assert_and_track`]
5184 pub fn Z3_optimize_assert(c: Z3_context, o: Z3_optimize, a: Z3_ast);
5185 /// Assert tracked hard constraint to the optimization context.
5186 ///
5187 /// # See also
5188 ///
5189 /// - [`Z3_optimize_assert`]
5190 /// - [`Z3_optimize_assert_soft`]
5191 pub fn Z3_optimize_assert_and_track(
5192 c: Z3_context,
5193 o: Z3_optimize,
5194 a: Z3_ast,
5195 t: Z3_ast,
5196 );
5197 /// Add a maximization constraint.
5198 /// - `c`: - context
5199 /// - `o`: - optimization context
5200 /// - `t`: - arithmetical term
5201 ///
5202 /// # See also
5203 ///
5204 /// - [`Z3_optimize_minimize`]
5205 pub fn Z3_optimize_maximize(
5206 c: Z3_context,
5207 o: Z3_optimize,
5208 t: Z3_ast,
5209 ) -> ::core::ffi::c_uint;
5210 /// Add a minimization constraint.
5211 /// - `c`: - context
5212 /// - `o`: - optimization context
5213 /// - `t`: - arithmetical term
5214 ///
5215 /// # See also
5216 ///
5217 /// - [`Z3_optimize_maximize`]
5218 pub fn Z3_optimize_minimize(
5219 c: Z3_context,
5220 o: Z3_optimize,
5221 t: Z3_ast,
5222 ) -> ::core::ffi::c_uint;
5223 /// Create a backtracking point.
5224 ///
5225 /// The optimize solver contains a set of rules, added facts and assertions.
5226 /// The set of rules, facts and assertions are restored upon calling [`Z3_optimize_pop`].
5227 ///
5228 /// # See also
5229 ///
5230 /// - [`Z3_optimize_pop`]
5231 pub fn Z3_optimize_push(c: Z3_context, d: Z3_optimize);
5232 /// Backtrack one level.
5233 ///
5234 /// # Preconditions
5235 ///
5236 /// - `The number of calls to pop cannot exceed calls to push.`
5237 ///
5238 /// # See also
5239 ///
5240 /// - [`Z3_optimize_push`]
5241 pub fn Z3_optimize_pop(c: Z3_context, d: Z3_optimize);
5242 /// provide an initialization hint to the solver.
5243 /// The initialization hint is used to calibrate an initial value of the expression that
5244 /// represents a variable. If the variable is Boolean, the initial phase is set
5245 /// according to `value`. If the variable is an integer or real,
5246 /// the initial Simplex tableau is recalibrated to attempt to follow the value assignment.
5247 pub fn Z3_optimize_set_initial_value(
5248 c: Z3_context,
5249 o: Z3_optimize,
5250 v: Z3_ast,
5251 val: Z3_ast,
5252 );
5253 /// Check consistency and produce optimal values.
5254 /// - `c`: - context
5255 /// - `o`: - optimization context
5256 /// - `num_assumptions`: - number of additional assumptions
5257 /// - `assumptions`: - the additional assumptions
5258 ///
5259 /// # See also
5260 ///
5261 /// - [`Z3_optimize_get_reason_unknown`]
5262 /// - [`Z3_optimize_get_model`]
5263 /// - [`Z3_optimize_get_statistics`]
5264 /// - [`Z3_optimize_get_unsat_core`]
5265 pub fn Z3_optimize_check(
5266 c: Z3_context,
5267 o: Z3_optimize,
5268 num_assumptions: ::core::ffi::c_uint,
5269 assumptions: *const Z3_ast,
5270 ) -> Z3_lbool;
5271 /// Retrieve a string that describes the last status returned by [`Z3_optimize_check`].
5272 ///
5273 /// Use this method when [`Z3_optimize_check`] returns `Z3_L_UNDEF`.
5274 pub fn Z3_optimize_get_reason_unknown(c: Z3_context, d: Z3_optimize) -> Z3_string;
5275 /// Retrieve the model for the last [`Z3_optimize_check`]
5276 ///
5277 /// The error handler is invoked if a model is not available because
5278 /// the commands above were not invoked for the given optimization
5279 /// solver, or if the result was `Z3_L_FALSE`.
5280 pub fn Z3_optimize_get_model(c: Z3_context, o: Z3_optimize) -> Option<Z3_model>;
5281 /// Retrieve the unsat core for the last [`Z3_optimize_check`]
5282 /// The unsat core is a subset of the assumptions `a`.
5283 pub fn Z3_optimize_get_unsat_core(
5284 c: Z3_context,
5285 o: Z3_optimize,
5286 ) -> Option<Z3_ast_vector>;
5287 /// Set parameters on optimization context.
5288 ///
5289 /// - `c`: - context
5290 /// - `o`: - optimization context
5291 /// - `p`: - parameters
5292 ///
5293 /// # See also
5294 ///
5295 /// - [`Z3_optimize_get_help`]
5296 /// - [`Z3_optimize_get_param_descrs`]
5297 pub fn Z3_optimize_set_params(c: Z3_context, o: Z3_optimize, p: Z3_params);
5298 /// Return the parameter description set for the given optimize object.
5299 ///
5300 /// - `c`: - context
5301 /// - `o`: - optimization context
5302 ///
5303 /// # See also
5304 ///
5305 /// - [`Z3_optimize_get_help`]
5306 /// - [`Z3_optimize_set_params`]
5307 pub fn Z3_optimize_get_param_descrs(
5308 c: Z3_context,
5309 o: Z3_optimize,
5310 ) -> Option<Z3_param_descrs>;
5311 /// Retrieve lower bound value or approximation for the i'th optimization objective.
5312 ///
5313 /// - `c`: - context
5314 /// - `o`: - optimization context
5315 /// - `idx`: - index of optimization objective
5316 ///
5317 /// # See also
5318 ///
5319 /// - [`Z3_optimize_get_upper`]
5320 /// - [`Z3_optimize_get_lower_as_vector`]
5321 /// - [`Z3_optimize_get_upper_as_vector`]
5322 pub fn Z3_optimize_get_lower(
5323 c: Z3_context,
5324 o: Z3_optimize,
5325 idx: ::core::ffi::c_uint,
5326 ) -> Option<Z3_ast>;
5327 /// Retrieve upper bound value or approximation for the i'th optimization objective.
5328 ///
5329 /// - `c`: - context
5330 /// - `o`: - optimization context
5331 /// - `idx`: - index of optimization objective
5332 ///
5333 /// # See also
5334 ///
5335 /// - [`Z3_optimize_get_lower`]
5336 /// - [`Z3_optimize_get_lower_as_vector`]
5337 /// - [`Z3_optimize_get_upper_as_vector`]
5338 pub fn Z3_optimize_get_upper(
5339 c: Z3_context,
5340 o: Z3_optimize,
5341 idx: ::core::ffi::c_uint,
5342 ) -> Option<Z3_ast>;
5343 /// Retrieve lower bound value or approximation for the i'th optimization objective.
5344 /// The returned vector is of length 3. It always contains numerals.
5345 /// The three numerals are coefficients `a`, `b`, `c` and encode the result of
5346 /// [`Z3_optimize_get_lower`] `a * infinity + b + c * epsilon`.
5347 ///
5348 /// - `c`: - context
5349 /// - `o`: - optimization context
5350 /// - `idx`: - index of optimization objective
5351 ///
5352 /// # See also
5353 ///
5354 /// - [`Z3_optimize_get_lower`]
5355 /// - [`Z3_optimize_get_upper`]
5356 /// - [`Z3_optimize_get_upper_as_vector`]
5357 pub fn Z3_optimize_get_lower_as_vector(
5358 c: Z3_context,
5359 o: Z3_optimize,
5360 idx: ::core::ffi::c_uint,
5361 ) -> Option<Z3_ast_vector>;
5362 /// Retrieve upper bound value or approximation for the i'th optimization objective.
5363 ///
5364 /// - `c`: - context
5365 /// - `o`: - optimization context
5366 /// - `idx`: - index of optimization objective
5367 ///
5368 /// # See also
5369 ///
5370 /// - [`Z3_optimize_get_lower`]
5371 /// - [`Z3_optimize_get_upper`]
5372 /// - [`Z3_optimize_get_lower_as_vector`]
5373 pub fn Z3_optimize_get_upper_as_vector(
5374 c: Z3_context,
5375 o: Z3_optimize,
5376 idx: ::core::ffi::c_uint,
5377 ) -> Option<Z3_ast_vector>;
5378 /// Print the current context as a string.
5379 /// - `c`: - context.
5380 /// - `o`: - optimization context.
5381 ///
5382 /// # See also
5383 ///
5384 /// - [`Z3_optimize_from_file`]
5385 /// - [`Z3_optimize_from_string`]
5386 pub fn Z3_optimize_to_string(c: Z3_context, o: Z3_optimize) -> Z3_string;
5387 /// Parse an SMT-LIB2 string with assertions,
5388 /// soft constraints and optimization objectives.
5389 /// Add the parsed constraints and objectives to the optimization context.
5390 ///
5391 /// - `c`: - context.
5392 /// - `o`: - optimize context.
5393 /// - `s`: - string containing SMT2 specification.
5394 ///
5395 /// # See also
5396 ///
5397 /// - [`Z3_optimize_from_file`]
5398 /// - [`Z3_optimize_to_string`]
5399 pub fn Z3_optimize_from_string(c: Z3_context, o: Z3_optimize, s: Z3_string);
5400 /// Parse an SMT-LIB2 file with assertions,
5401 /// soft constraints and optimization objectives.
5402 /// Add the parsed constraints and objectives to the optimization context.
5403 ///
5404 /// - `c`: - context.
5405 /// - `o`: - optimize context.
5406 /// - `s`: - path to file containing SMT2 specification.
5407 ///
5408 /// # See also
5409 ///
5410 /// - [`Z3_optimize_from_string`]
5411 /// - [`Z3_optimize_to_string`]
5412 pub fn Z3_optimize_from_file(c: Z3_context, o: Z3_optimize, s: Z3_string);
5413 /// Return a string containing a description of parameters accepted by optimize.
5414 ///
5415 /// # See also
5416 ///
5417 /// - [`Z3_optimize_get_param_descrs`]
5418 /// - [`Z3_optimize_set_params`]
5419 pub fn Z3_optimize_get_help(c: Z3_context, t: Z3_optimize) -> Z3_string;
5420 /// Retrieve statistics information from the last call to [`Z3_optimize_check`]
5421 pub fn Z3_optimize_get_statistics(c: Z3_context, d: Z3_optimize) -> Option<Z3_stats>;
5422 /// Return the set of asserted formulas on the optimization context.
5423 pub fn Z3_optimize_get_assertions(
5424 c: Z3_context,
5425 o: Z3_optimize,
5426 ) -> Option<Z3_ast_vector>;
5427 /// Return objectives on the optimization context.
5428 /// If the objective function is a max-sat objective it is returned
5429 /// as a Pseudo-Boolean (minimization) sum of the form `(+ (if f1 w1 0) (if f2 w2 0) ...)`
5430 /// If the objective function is entered as a maximization objective, then return
5431 /// the corresponding minimization objective. In this way the resulting objective
5432 /// function is always returned as a minimization objective.
5433 pub fn Z3_optimize_get_objectives(
5434 c: Z3_context,
5435 o: Z3_optimize,
5436 ) -> Option<Z3_ast_vector>;
5437 /// register a model event handler for new models.
5438 pub fn Z3_optimize_register_model_eh(
5439 c: Z3_context,
5440 o: Z3_optimize,
5441 m: Z3_model,
5442 ctx: *mut ::core::ffi::c_void,
5443 model_eh: Z3_model_eh,
5444 );
5445 /// Copy an optimization context from a source to a target context.
5446 ///
5447 /// This function allows translating an optimization context from one Z3_context
5448 /// to another. This is useful when working with multiple contexts and needing to
5449 /// transfer optimization problems between them.
5450 ///
5451 /// - `c`: Source context containing the optimization context to translate
5452 /// - `o`: The optimization context to translate from the source context
5453 /// - `target`: Target context where the optimization context will be created
5454 ///
5455 /// \return A new optimization context in the target context with the same state
5456 pub fn Z3_optimize_translate(
5457 c: Z3_context,
5458 o: Z3_optimize,
5459 target: Z3_context,
5460 ) -> Option<Z3_optimize>;
5461 /// Create the RoundingMode sort.
5462 ///
5463 /// - `c`: logical context
5464 ///
5465 /// # See also
5466 ///
5467 /// - [`Z3_mk_fpa_round_nearest_ties_to_away`]
5468 /// - [`Z3_mk_fpa_rna`]
5469 /// - [`Z3_mk_fpa_round_nearest_ties_to_even`]
5470 /// - [`Z3_mk_fpa_rne`]
5471 /// - [`Z3_mk_fpa_round_toward_negative`]
5472 /// - [`Z3_mk_fpa_rtn`]
5473 /// - [`Z3_mk_fpa_round_toward_positive`]
5474 /// - [`Z3_mk_fpa_rtp`]
5475 /// - [`Z3_mk_fpa_round_toward_zero`]
5476 /// - [`Z3_mk_fpa_rtz`]
5477 pub fn Z3_mk_fpa_rounding_mode_sort(c: Z3_context) -> Option<Z3_sort>;
5478 /// Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
5479 ///
5480 /// This is the same as [`Z3_mk_fpa_rne`].
5481 ///
5482 /// - `c`: logical context
5483 ///
5484 /// # See also
5485 ///
5486 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5487 /// - [`Z3_mk_fpa_round_nearest_ties_to_away`]
5488 /// - [`Z3_mk_fpa_round_toward_negative`]
5489 /// - [`Z3_mk_fpa_round_toward_positive`]
5490 /// - [`Z3_mk_fpa_round_toward_zero`]
5491 pub fn Z3_mk_fpa_round_nearest_ties_to_even(c: Z3_context) -> Option<Z3_ast>;
5492 /// Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
5493 ///
5494 /// This is the same as [`Z3_mk_fpa_round_nearest_ties_to_even`].
5495 ///
5496 /// - `c`: logical context
5497 ///
5498 /// # See also
5499 ///
5500 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5501 /// - [`Z3_mk_fpa_rna`]
5502 /// - [`Z3_mk_fpa_rtn`]
5503 /// - [`Z3_mk_fpa_rtp`]
5504 /// - [`Z3_mk_fpa_rtz`]
5505 pub fn Z3_mk_fpa_rne(c: Z3_context) -> Option<Z3_ast>;
5506 /// Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
5507 ///
5508 /// This is the same as [`Z3_mk_fpa_rna`].
5509 ///
5510 /// - `c`: logical context
5511 ///
5512 /// # See also
5513 ///
5514 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5515 /// - [`Z3_mk_fpa_round_nearest_ties_to_even`]
5516 /// - [`Z3_mk_fpa_round_toward_negative`]
5517 /// - [`Z3_mk_fpa_round_toward_positive`]
5518 /// - [`Z3_mk_fpa_round_toward_zero`]
5519 pub fn Z3_mk_fpa_round_nearest_ties_to_away(c: Z3_context) -> Option<Z3_ast>;
5520 /// Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
5521 ///
5522 /// This is the same as [`Z3_mk_fpa_round_nearest_ties_to_away`].
5523 ///
5524 /// - `c`: logical context
5525 ///
5526 /// # See also
5527 ///
5528 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5529 /// - [`Z3_mk_fpa_rne`]
5530 /// - [`Z3_mk_fpa_rtn`]
5531 /// - [`Z3_mk_fpa_rtp`]
5532 /// - [`Z3_mk_fpa_rtz`]
5533 pub fn Z3_mk_fpa_rna(c: Z3_context) -> Option<Z3_ast>;
5534 /// Create a numeral of RoundingMode sort which represents the TowardPositive rounding mode.
5535 ///
5536 /// This is the same as [`Z3_mk_fpa_rtp`].
5537 ///
5538 /// - `c`: logical context
5539 ///
5540 /// # See also
5541 ///
5542 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5543 /// - [`Z3_mk_fpa_round_nearest_ties_to_away`]
5544 /// - [`Z3_mk_fpa_round_nearest_ties_to_even`]
5545 /// - [`Z3_mk_fpa_round_toward_negative`]
5546 /// - [`Z3_mk_fpa_round_toward_zero`]
5547 pub fn Z3_mk_fpa_round_toward_positive(c: Z3_context) -> Option<Z3_ast>;
5548 /// Create a numeral of RoundingMode sort which represents the TowardPositive rounding mode.
5549 ///
5550 /// This is the same as [`Z3_mk_fpa_round_toward_positive`].
5551 ///
5552 /// - `c`: logical context
5553 ///
5554 /// # See also
5555 ///
5556 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5557 /// - [`Z3_mk_fpa_rna`]
5558 /// - [`Z3_mk_fpa_rne`]
5559 /// - [`Z3_mk_fpa_rtn`]
5560 /// - [`Z3_mk_fpa_rtz`]
5561 pub fn Z3_mk_fpa_rtp(c: Z3_context) -> Option<Z3_ast>;
5562 /// Create a numeral of RoundingMode sort which represents the TowardNegative rounding mode.
5563 ///
5564 /// This is the same as [`Z3_mk_fpa_rtn`].
5565 ///
5566 /// - `c`: logical context
5567 ///
5568 /// # See also
5569 ///
5570 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5571 /// - [`Z3_mk_fpa_round_nearest_ties_to_away`]
5572 /// - [`Z3_mk_fpa_round_nearest_ties_to_even`]
5573 /// - [`Z3_mk_fpa_round_toward_positive`]
5574 /// - [`Z3_mk_fpa_round_toward_zero`]
5575 pub fn Z3_mk_fpa_round_toward_negative(c: Z3_context) -> Option<Z3_ast>;
5576 /// Create a numeral of RoundingMode sort which represents the TowardNegative rounding mode.
5577 ///
5578 /// This is the same as [`Z3_mk_fpa_round_toward_negative`].
5579 ///
5580 /// - `c`: logical context
5581 ///
5582 /// # See also
5583 ///
5584 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5585 /// - [`Z3_mk_fpa_rna`]
5586 /// - [`Z3_mk_fpa_rne`]
5587 /// - [`Z3_mk_fpa_rtp`]
5588 /// - [`Z3_mk_fpa_rtz`]
5589 pub fn Z3_mk_fpa_rtn(c: Z3_context) -> Option<Z3_ast>;
5590 /// Create a numeral of RoundingMode sort which represents the TowardZero rounding mode.
5591 ///
5592 /// This is the same as [`Z3_mk_fpa_rtz`].
5593 ///
5594 /// - `c`: logical context
5595 ///
5596 /// # See also
5597 ///
5598 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5599 /// - [`Z3_mk_fpa_round_nearest_ties_to_away`]
5600 /// - [`Z3_mk_fpa_round_nearest_ties_to_even`]
5601 /// - [`Z3_mk_fpa_round_toward_negative`]
5602 /// - [`Z3_mk_fpa_round_toward_positive`]
5603 pub fn Z3_mk_fpa_round_toward_zero(c: Z3_context) -> Option<Z3_ast>;
5604 /// Create a numeral of RoundingMode sort which represents the TowardZero rounding mode.
5605 ///
5606 /// This is the same as [`Z3_mk_fpa_round_toward_zero`].
5607 ///
5608 /// - `c`: logical context
5609 ///
5610 /// # See also
5611 ///
5612 /// - [`Z3_mk_fpa_rounding_mode_sort`]
5613 /// - [`Z3_mk_fpa_rna`]
5614 /// - [`Z3_mk_fpa_rne`]
5615 /// - [`Z3_mk_fpa_rtn`]
5616 /// - [`Z3_mk_fpa_rtp`]
5617 pub fn Z3_mk_fpa_rtz(c: Z3_context) -> Option<Z3_ast>;
5618 /// Create a FloatingPoint sort.
5619 ///
5620 /// - `c`: logical context
5621 /// - `ebits`: number of exponent bits
5622 /// - `sbits`: number of significand bits
5623 ///
5624 /// **Remark:** `ebits` must be larger than 1 and `sbits` must be larger than 2.
5625 ///
5626 /// # See also
5627 ///
5628 /// - [`Z3_mk_fpa_sort_half`]
5629 /// - [`Z3_mk_fpa_sort_16`]
5630 /// - [`Z3_mk_fpa_sort_single`]
5631 /// - [`Z3_mk_fpa_sort_32`]
5632 /// - [`Z3_mk_fpa_sort_double`]
5633 /// - [`Z3_mk_fpa_sort_64`]
5634 /// - [`Z3_mk_fpa_sort_quadruple`]
5635 /// - [`Z3_mk_fpa_sort_128`]
5636 pub fn Z3_mk_fpa_sort(
5637 c: Z3_context,
5638 ebits: ::core::ffi::c_uint,
5639 sbits: ::core::ffi::c_uint,
5640 ) -> Option<Z3_sort>;
5641 /// Create the half-precision (16-bit) FloatingPoint sort.
5642 ///
5643 /// This is the same as [`Z3_mk_fpa_sort_16`].
5644 ///
5645 /// - `c`: logical context
5646 ///
5647 /// # See also
5648 ///
5649 /// - [`Z3_mk_fpa_sort`]
5650 /// - [`Z3_mk_fpa_sort_single`]
5651 /// - [`Z3_mk_fpa_sort_double`]
5652 /// - [`Z3_mk_fpa_sort_quadruple`]
5653 pub fn Z3_mk_fpa_sort_half(c: Z3_context) -> Option<Z3_sort>;
5654 /// Create the half-precision (16-bit) FloatingPoint sort.
5655 ///
5656 /// This is the same as [`Z3_mk_fpa_sort_half`].
5657 ///
5658 /// - `c`: logical context
5659 ///
5660 /// # See also
5661 ///
5662 /// - [`Z3_mk_fpa_sort`]
5663 /// - [`Z3_mk_fpa_sort_32`]
5664 /// - [`Z3_mk_fpa_sort_64`]
5665 /// - [`Z3_mk_fpa_sort_128`]
5666 pub fn Z3_mk_fpa_sort_16(c: Z3_context) -> Option<Z3_sort>;
5667 /// Create the single-precision (32-bit) FloatingPoint sort.
5668 ///
5669 /// This is the same as [`Z3_mk_fpa_sort_32`].
5670 ///
5671 /// - `c`: logical context.
5672 ///
5673 /// # See also
5674 ///
5675 /// - [`Z3_mk_fpa_sort`]
5676 /// - [`Z3_mk_fpa_sort_half`]
5677 /// - [`Z3_mk_fpa_sort_double`]
5678 /// - [`Z3_mk_fpa_sort_quadruple`]
5679 pub fn Z3_mk_fpa_sort_single(c: Z3_context) -> Option<Z3_sort>;
5680 /// Create the single-precision (32-bit) FloatingPoint sort.
5681 ///
5682 /// This is the same as [`Z3_mk_fpa_sort_single`].
5683 ///
5684 /// - `c`: logical context
5685 ///
5686 /// # See also
5687 ///
5688 /// - [`Z3_mk_fpa_sort`]
5689 /// - [`Z3_mk_fpa_sort_16`]
5690 /// - [`Z3_mk_fpa_sort_64`]
5691 /// - [`Z3_mk_fpa_sort_128`]
5692 pub fn Z3_mk_fpa_sort_32(c: Z3_context) -> Option<Z3_sort>;
5693 /// Create the double-precision (64-bit) FloatingPoint sort.
5694 ///
5695 /// This is the same as [`Z3_mk_fpa_sort_64`].
5696 ///
5697 /// - `c`: logical context
5698 ///
5699 /// # See also
5700 ///
5701 /// - [`Z3_mk_fpa_sort`]
5702 /// - [`Z3_mk_fpa_sort_half`]
5703 /// - [`Z3_mk_fpa_sort_single`]
5704 /// - [`Z3_mk_fpa_sort_quadruple`]
5705 pub fn Z3_mk_fpa_sort_double(c: Z3_context) -> Option<Z3_sort>;
5706 /// Create the double-precision (64-bit) FloatingPoint sort.
5707 ///
5708 /// This is the same as [`Z3_mk_fpa_sort_double`].
5709 ///
5710 /// - `c`: logical context
5711 ///
5712 /// # See also
5713 ///
5714 /// - [`Z3_mk_fpa_sort`]
5715 /// - [`Z3_mk_fpa_sort_16`]
5716 /// - [`Z3_mk_fpa_sort_32`]
5717 /// - [`Z3_mk_fpa_sort_128`]
5718 pub fn Z3_mk_fpa_sort_64(c: Z3_context) -> Option<Z3_sort>;
5719 /// Create the quadruple-precision (128-bit) FloatingPoint sort.
5720 ///
5721 /// This is the same as [`Z3_mk_fpa_sort_128`].
5722 ///
5723 /// - `c`: logical context
5724 ///
5725 /// # See also
5726 ///
5727 /// - [`Z3_mk_fpa_sort`]
5728 /// - [`Z3_mk_fpa_sort_half`]
5729 /// - [`Z3_mk_fpa_sort_single`]
5730 /// - [`Z3_mk_fpa_sort_double`]
5731 pub fn Z3_mk_fpa_sort_quadruple(c: Z3_context) -> Option<Z3_sort>;
5732 /// Create the quadruple-precision (128-bit) FloatingPoint sort.
5733 ///
5734 /// This is the same as [`Z3_mk_fpa_sort_quadruple`].
5735 ///
5736 /// - `c`: logical context
5737 ///
5738 /// # See also
5739 ///
5740 /// - [`Z3_mk_fpa_sort`]
5741 /// - [`Z3_mk_fpa_sort_16`]
5742 /// - [`Z3_mk_fpa_sort_32`]
5743 /// - [`Z3_mk_fpa_sort_64`]
5744 pub fn Z3_mk_fpa_sort_128(c: Z3_context) -> Option<Z3_sort>;
5745 /// Create a floating-point NaN of sort `s`.
5746 ///
5747 /// - `c`: logical context
5748 /// - `s`: target sort
5749 ///
5750 /// # See also
5751 ///
5752 /// - [`Z3_mk_fpa_inf`]
5753 /// - [`Z3_mk_fpa_is_nan`]
5754 /// - [`Z3_mk_fpa_zero`]
5755 pub fn Z3_mk_fpa_nan(c: Z3_context, s: Z3_sort) -> Option<Z3_ast>;
5756 /// Create a floating-point infinity of sort `s`.
5757 ///
5758 /// - `c`: logical context
5759 /// - `s`: target sort
5760 /// - `negative`: indicates whether the result should be negative
5761 ///
5762 /// When `negative` is `true`, -oo will be generated instead of +oo.
5763 ///
5764 /// # See also
5765 ///
5766 /// - [`Z3_mk_fpa_is_infinite`]
5767 /// - [`Z3_mk_fpa_nan`]
5768 /// - [`Z3_mk_fpa_zero`]
5769 pub fn Z3_mk_fpa_inf(c: Z3_context, s: Z3_sort, negative: bool) -> Option<Z3_ast>;
5770 /// Create a floating-point zero of sort `s`.
5771 ///
5772 /// - `c`: logical context
5773 /// - `s`: target sort
5774 /// - `negative`: indicates whether the result should be negative
5775 ///
5776 /// When `negative` is `true`, -zero will be generated instead of +zero.
5777 ///
5778 /// # See also
5779 ///
5780 /// - [`Z3_mk_fpa_inf`]
5781 /// - [`Z3_mk_fpa_is_zero`]
5782 /// - [`Z3_mk_fpa_nan`]
5783 pub fn Z3_mk_fpa_zero(c: Z3_context, s: Z3_sort, negative: bool) -> Option<Z3_ast>;
5784 /// Create an expression of FloatingPoint sort from three bit-vector expressions.
5785 ///
5786 /// This is the operator named `fp' in the SMT FP theory definition.
5787 /// Note that `sgn` is required to be a bit-vector of size 1. Significand and exponent
5788 /// are required to be longer than 1 and 2 respectively. The FloatingPoint sort
5789 /// of the resulting expression is automatically determined from the bit-vector sizes
5790 /// of the arguments. The exponent is assumed to be in IEEE-754 biased representation.
5791 ///
5792 /// - `c`: logical context
5793 /// - `sgn`: sign
5794 /// - `exp`: exponent
5795 /// - `sig`: significand
5796 ///
5797 /// # See also
5798 ///
5799 /// - [`Z3_mk_fpa_numeral_double`]
5800 /// - [`Z3_mk_fpa_numeral_float`]
5801 /// - [`Z3_mk_fpa_numeral_int`]
5802 /// - [`Z3_mk_fpa_numeral_int_uint`]
5803 /// - [`Z3_mk_fpa_numeral_int64_uint64`]
5804 /// - [`Z3_mk_numeral`]
5805 pub fn Z3_mk_fpa_fp(
5806 c: Z3_context,
5807 sgn: Z3_ast,
5808 exp: Z3_ast,
5809 sig: Z3_ast,
5810 ) -> Option<Z3_ast>;
5811 /// Create a numeral of FloatingPoint sort from a float.
5812 ///
5813 /// This function is used to create numerals that fit in a float value.
5814 /// It is slightly faster than [`Z3_mk_numeral`] since it is not necessary to parse a string.
5815 ///
5816 /// - `c`: logical context
5817 /// - `v`: value
5818 /// - `ty`: sort
5819 ///
5820 /// `ty` must be a FloatingPoint sort
5821 ///
5822 /// # See also
5823 ///
5824 /// - [`Z3_mk_fpa_fp`]
5825 /// - [`Z3_mk_fpa_numeral_double`]
5826 /// - [`Z3_mk_fpa_numeral_int`]
5827 /// - [`Z3_mk_fpa_numeral_int_uint`]
5828 /// - [`Z3_mk_fpa_numeral_int64_uint64`]
5829 /// - [`Z3_mk_numeral`]
5830 pub fn Z3_mk_fpa_numeral_float(c: Z3_context, v: f32, ty: Z3_sort) -> Option<Z3_ast>;
5831 /// Create a numeral of FloatingPoint sort from a double.
5832 ///
5833 /// This function is used to create numerals that fit in a double value.
5834 /// It is slightly faster than [`Z3_mk_numeral`] since it is not necessary to parse a string.
5835 ///
5836 /// - `c`: logical context
5837 /// - `v`: value
5838 /// - `ty`: sort
5839 ///
5840 /// `ty` must be a FloatingPoint sort
5841 ///
5842 /// # See also
5843 ///
5844 /// - [`Z3_mk_fpa_fp`]
5845 /// - [`Z3_mk_fpa_numeral_float`]
5846 /// - [`Z3_mk_fpa_numeral_int`]
5847 /// - [`Z3_mk_fpa_numeral_int_uint`]
5848 /// - [`Z3_mk_fpa_numeral_int64_uint64`]
5849 /// - [`Z3_mk_numeral`]
5850 pub fn Z3_mk_fpa_numeral_double(
5851 c: Z3_context,
5852 v: f64,
5853 ty: Z3_sort,
5854 ) -> Option<Z3_ast>;
5855 /// Create a numeral of FloatingPoint sort from a signed integer.
5856 ///
5857 /// - `c`: logical context
5858 /// - `v`: value
5859 /// - `ty`: result sort
5860 ///
5861 /// `ty` must be a FloatingPoint sort
5862 ///
5863 /// # See also
5864 ///
5865 /// - [`Z3_mk_fpa_fp`]
5866 /// - [`Z3_mk_fpa_numeral_double`]
5867 /// - [`Z3_mk_fpa_numeral_float`]
5868 /// - [`Z3_mk_fpa_numeral_int_uint`]
5869 /// - [`Z3_mk_fpa_numeral_int64_uint64`]
5870 /// - [`Z3_mk_numeral`]
5871 pub fn Z3_mk_fpa_numeral_int(
5872 c: Z3_context,
5873 v: ::core::ffi::c_int,
5874 ty: Z3_sort,
5875 ) -> Option<Z3_ast>;
5876 /// Create a numeral of FloatingPoint sort from a sign bit and two integers.
5877 ///
5878 /// - `c`: logical context
5879 /// - `sgn`: sign bit (true == negative)
5880 /// - `sig`: significand
5881 /// - `exp`: exponent
5882 /// - `ty`: result sort
5883 ///
5884 /// `ty` must be a FloatingPoint sort
5885 ///
5886 /// # See also
5887 ///
5888 /// - [`Z3_mk_fpa_fp`]
5889 /// - [`Z3_mk_fpa_numeral_double`]
5890 /// - [`Z3_mk_fpa_numeral_float`]
5891 /// - [`Z3_mk_fpa_numeral_int`]
5892 /// - [`Z3_mk_fpa_numeral_int64_uint64`]
5893 /// - [`Z3_mk_numeral`]
5894 pub fn Z3_mk_fpa_numeral_int_uint(
5895 c: Z3_context,
5896 sgn: bool,
5897 exp: ::core::ffi::c_int,
5898 sig: ::core::ffi::c_uint,
5899 ty: Z3_sort,
5900 ) -> Option<Z3_ast>;
5901 /// Create a numeral of FloatingPoint sort from a sign bit and two 64-bit integers.
5902 ///
5903 /// - `c`: logical context
5904 /// - `sgn`: sign bit (true == negative)
5905 /// - `sig`: significand
5906 /// - `exp`: exponent
5907 /// - `ty`: result sort
5908 ///
5909 /// `ty` must be a FloatingPoint sort
5910 ///
5911 /// # See also
5912 ///
5913 /// - [`Z3_mk_fpa_fp`]
5914 /// - [`Z3_mk_fpa_numeral_double`]
5915 /// - [`Z3_mk_fpa_numeral_float`]
5916 /// - [`Z3_mk_fpa_numeral_int`]
5917 /// - [`Z3_mk_fpa_numeral_int_uint`]
5918 /// - [`Z3_mk_numeral`]
5919 pub fn Z3_mk_fpa_numeral_int64_uint64(
5920 c: Z3_context,
5921 sgn: bool,
5922 exp: i64,
5923 sig: u64,
5924 ty: Z3_sort,
5925 ) -> Option<Z3_ast>;
5926 /// Floating-point absolute value
5927 ///
5928 /// - `c`: logical context
5929 /// - `t`: term of FloatingPoint sort
5930 ///
5931 /// # See also
5932 ///
5933 /// - [`Z3_mk_fpa_is_negative`]
5934 /// - [`Z3_mk_fpa_is_positive`]
5935 /// - [`Z3_mk_fpa_neg`]
5936 pub fn Z3_mk_fpa_abs(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
5937 /// Floating-point negation
5938 ///
5939 /// - `c`: logical context
5940 /// - `t`: term of FloatingPoint sort
5941 ///
5942 /// # See also
5943 ///
5944 /// - [`Z3_mk_fpa_abs`]
5945 /// - [`Z3_mk_fpa_is_negative`]
5946 /// - [`Z3_mk_fpa_is_positive`]
5947 pub fn Z3_mk_fpa_neg(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
5948 /// Floating-point addition
5949 ///
5950 /// - `c`: logical context
5951 /// - `rm`: term of RoundingMode sort
5952 /// - `t1`: term of FloatingPoint sort
5953 /// - `t2`: term of FloatingPoint sort
5954 ///
5955 /// `rm` must be of RoundingMode sort, `t1` and `t2` must have the same FloatingPoint sort.
5956 pub fn Z3_mk_fpa_add(
5957 c: Z3_context,
5958 rm: Z3_ast,
5959 t1: Z3_ast,
5960 t2: Z3_ast,
5961 ) -> Option<Z3_ast>;
5962 /// Floating-point subtraction
5963 ///
5964 /// - `c`: logical context
5965 /// - `rm`: term of RoundingMode sort
5966 /// - `t1`: term of FloatingPoint sort
5967 /// - `t2`: term of FloatingPoint sort
5968 ///
5969 /// `rm` must be of RoundingMode sort, `t1` and `t2` must have the same FloatingPoint sort.
5970 pub fn Z3_mk_fpa_sub(
5971 c: Z3_context,
5972 rm: Z3_ast,
5973 t1: Z3_ast,
5974 t2: Z3_ast,
5975 ) -> Option<Z3_ast>;
5976 /// Floating-point multiplication
5977 ///
5978 /// - `c`: logical context
5979 /// - `rm`: term of RoundingMode sort
5980 /// - `t1`: term of FloatingPoint sort
5981 /// - `t2`: term of FloatingPoint sort
5982 ///
5983 /// `rm` must be of RoundingMode sort, `t1` and `t2` must have the same FloatingPoint sort.
5984 pub fn Z3_mk_fpa_mul(
5985 c: Z3_context,
5986 rm: Z3_ast,
5987 t1: Z3_ast,
5988 t2: Z3_ast,
5989 ) -> Option<Z3_ast>;
5990 /// Floating-point division
5991 ///
5992 /// - `c`: logical context
5993 /// - `rm`: term of RoundingMode sort
5994 /// - `t1`: term of FloatingPoint sort.
5995 /// - `t2`: term of FloatingPoint sort
5996 ///
5997 /// The nodes `rm` must be of RoundingMode sort, `t1` and `t2` must have the same FloatingPoint sort.
5998 pub fn Z3_mk_fpa_div(
5999 c: Z3_context,
6000 rm: Z3_ast,
6001 t1: Z3_ast,
6002 t2: Z3_ast,
6003 ) -> Option<Z3_ast>;
6004 /// Floating-point fused multiply-add.
6005 ///
6006 /// - `c`: logical context
6007 /// - `rm`: term of RoundingMode sort
6008 /// - `t1`: term of FloatingPoint sort
6009 /// - `t2`: term of FloatingPoint sort
6010 /// - `t3`: term of FloatingPoint sort
6011 ///
6012 /// The result is `round((t1 * t2) + t3)`.
6013 ///
6014 /// `rm` must be of RoundingMode sort, `t1`, `t2`, and `t3` must have the same FloatingPoint sort.
6015 pub fn Z3_mk_fpa_fma(
6016 c: Z3_context,
6017 rm: Z3_ast,
6018 t1: Z3_ast,
6019 t2: Z3_ast,
6020 t3: Z3_ast,
6021 ) -> Option<Z3_ast>;
6022 /// Floating-point square root
6023 ///
6024 /// - `c`: logical context
6025 /// - `rm`: term of RoundingMode sort
6026 /// - `t`: term of FloatingPoint sort
6027 ///
6028 /// `rm` must be of RoundingMode sort, `t` must have FloatingPoint sort.
6029 pub fn Z3_mk_fpa_sqrt(c: Z3_context, rm: Z3_ast, t: Z3_ast) -> Option<Z3_ast>;
6030 /// Floating-point remainder
6031 ///
6032 /// - `c`: logical context
6033 /// - `t1`: term of FloatingPoint sort
6034 /// - `t2`: term of FloatingPoint sort
6035 ///
6036 /// `t1` and `t2` must have the same FloatingPoint sort.
6037 pub fn Z3_mk_fpa_rem(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6038 /// Floating-point roundToIntegral. Rounds a floating-point number to
6039 /// the closest integer, again represented as a floating-point number.
6040 ///
6041 /// - `c`: logical context
6042 /// - `rm`: term of RoundingMode sort
6043 /// - `t`: term of FloatingPoint sort
6044 ///
6045 /// `t` must be of FloatingPoint sort.
6046 pub fn Z3_mk_fpa_round_to_integral(
6047 c: Z3_context,
6048 rm: Z3_ast,
6049 t: Z3_ast,
6050 ) -> Option<Z3_ast>;
6051 /// Minimum of floating-point numbers.
6052 ///
6053 /// - `c`: logical context
6054 /// - `t1`: term of FloatingPoint sort
6055 /// - `t2`: term of FloatingPoint sort
6056 ///
6057 /// `t1`, `t2` must have the same FloatingPoint sort.
6058 ///
6059 /// # See also
6060 ///
6061 /// - [`Z3_mk_fpa_max`]
6062 pub fn Z3_mk_fpa_min(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6063 /// Maximum of floating-point numbers.
6064 ///
6065 /// - `c`: logical context
6066 /// - `t1`: term of FloatingPoint sort
6067 /// - `t2`: term of FloatingPoint sort
6068 ///
6069 /// `t1`, `t2` must have the same FloatingPoint sort.
6070 ///
6071 /// # See also
6072 ///
6073 /// - [`Z3_mk_fpa_min`]
6074 pub fn Z3_mk_fpa_max(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6075 /// Floating-point less than or equal.
6076 ///
6077 /// - `c`: logical context
6078 /// - `t1`: term of FloatingPoint sort
6079 /// - `t2`: term of FloatingPoint sort
6080 ///
6081 /// `t1` and `t2` must have the same FloatingPoint sort.
6082 ///
6083 /// # See also
6084 ///
6085 /// - [`Z3_mk_fpa_eq`]
6086 /// - [`Z3_mk_fpa_geq`]
6087 /// - [`Z3_mk_fpa_gt`]
6088 /// - [`Z3_mk_fpa_lt`]
6089 pub fn Z3_mk_fpa_leq(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6090 /// Floating-point less than.
6091 ///
6092 /// - `c`: logical context
6093 /// - `t1`: term of FloatingPoint sort
6094 /// - `t2`: term of FloatingPoint sort
6095 ///
6096 /// `t1` and `t2` must have the same FloatingPoint sort.
6097 ///
6098 /// # See also
6099 ///
6100 /// - [`Z3_mk_fpa_eq`]
6101 /// - [`Z3_mk_fpa_geq`]
6102 /// - [`Z3_mk_fpa_gt`]
6103 /// - [`Z3_mk_fpa_leq`]
6104 pub fn Z3_mk_fpa_lt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6105 /// Floating-point greater than or equal.
6106 ///
6107 /// - `c`: logical context
6108 /// - `t1`: term of FloatingPoint sort
6109 /// - `t2`: term of FloatingPoint sort
6110 ///
6111 /// `t1` and `t2` must have the same FloatingPoint sort.
6112 ///
6113 /// # See also
6114 ///
6115 /// - [`Z3_mk_fpa_eq`]
6116 /// - [`Z3_mk_fpa_gt`]
6117 /// - [`Z3_mk_fpa_leq`]
6118 /// - [`Z3_mk_fpa_lt`]
6119 pub fn Z3_mk_fpa_geq(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6120 /// Floating-point greater than.
6121 ///
6122 /// - `c`: logical context
6123 /// - `t1`: term of FloatingPoint sort
6124 /// - `t2`: term of FloatingPoint sort
6125 ///
6126 /// `t1` and `t2` must have the same FloatingPoint sort.
6127 ///
6128 /// # See also
6129 ///
6130 /// - [`Z3_mk_fpa_eq`]
6131 /// - [`Z3_mk_fpa_geq`]
6132 /// - [`Z3_mk_fpa_leq`]
6133 /// - [`Z3_mk_fpa_lt`]
6134 pub fn Z3_mk_fpa_gt(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6135 /// Floating-point equality.
6136 ///
6137 /// - `c`: logical context
6138 /// - `t1`: term of FloatingPoint sort
6139 /// - `t2`: term of FloatingPoint sort
6140 ///
6141 /// Note that this is IEEE 754 equality (as opposed to SMT-LIB `=`).
6142 ///
6143 /// `t1` and `t2` must have the same FloatingPoint sort.
6144 ///
6145 /// # See also
6146 ///
6147 /// - [`Z3_mk_fpa_geq`]
6148 /// - [`Z3_mk_fpa_gt`]
6149 /// - [`Z3_mk_fpa_leq`]
6150 /// - [`Z3_mk_fpa_lt`]
6151 pub fn Z3_mk_fpa_eq(c: Z3_context, t1: Z3_ast, t2: Z3_ast) -> Option<Z3_ast>;
6152 /// Predicate indicating whether `t` is a normal floating-point number.
6153 ///
6154 /// - `c`: logical context
6155 /// - `t`: term of FloatingPoint sort
6156 ///
6157 /// `t` must have FloatingPoint sort.
6158 ///
6159 /// # See also
6160 ///
6161 /// - [`Z3_mk_fpa_is_infinite`]
6162 /// - [`Z3_mk_fpa_is_nan`]
6163 /// - [`Z3_mk_fpa_is_subnormal`]
6164 /// - [`Z3_mk_fpa_is_zero`]
6165 pub fn Z3_mk_fpa_is_normal(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6166 /// Predicate indicating whether `t` is a subnormal floating-point number.
6167 ///
6168 /// - `c`: logical context
6169 /// - `t`: term of FloatingPoint sort
6170 ///
6171 /// `t` must have FloatingPoint sort.
6172 ///
6173 /// # See also
6174 ///
6175 /// - [`Z3_mk_fpa_is_infinite`]
6176 /// - [`Z3_mk_fpa_is_nan`]
6177 /// - [`Z3_mk_fpa_is_normal`]
6178 /// - [`Z3_mk_fpa_is_zero`]
6179 pub fn Z3_mk_fpa_is_subnormal(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6180 /// Predicate indicating whether `t` is a floating-point number with zero value, i.e., +zero or -zero.
6181 ///
6182 /// - `c`: logical context
6183 /// - `t`: term of FloatingPoint sort
6184 ///
6185 /// `t` must have FloatingPoint sort.
6186 ///
6187 /// # See also
6188 ///
6189 /// - [`Z3_mk_fpa_is_infinite`]
6190 /// - [`Z3_mk_fpa_is_nan`]
6191 /// - [`Z3_mk_fpa_is_normal`]
6192 /// - [`Z3_mk_fpa_is_subnormal`]
6193 /// - [`Z3_mk_fpa_zero`]
6194 pub fn Z3_mk_fpa_is_zero(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6195 /// Predicate indicating whether `t` is a floating-point number representing +oo or -oo.
6196 ///
6197 /// - `c`: logical context
6198 /// - `t`: term of FloatingPoint sort
6199 ///
6200 /// `t` must have FloatingPoint sort.
6201 ///
6202 /// # See also
6203 ///
6204 /// - [`Z3_mk_fpa_inf`]
6205 /// - [`Z3_mk_fpa_is_nan`]
6206 /// - [`Z3_mk_fpa_is_normal`]
6207 /// - [`Z3_mk_fpa_is_subnormal`]
6208 /// - [`Z3_mk_fpa_is_zero`]
6209 pub fn Z3_mk_fpa_is_infinite(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6210 /// Predicate indicating whether `t` is a NaN.
6211 ///
6212 /// - `c`: logical context
6213 /// - `t`: term of FloatingPoint sort
6214 ///
6215 /// `t` must have FloatingPoint sort.
6216 ///
6217 /// # See also
6218 ///
6219 /// - [`Z3_mk_fpa_is_infinite`]
6220 /// - [`Z3_mk_fpa_is_normal`]
6221 /// - [`Z3_mk_fpa_is_subnormal`]
6222 /// - [`Z3_mk_fpa_is_zero`]
6223 /// - [`Z3_mk_fpa_nan`]
6224 pub fn Z3_mk_fpa_is_nan(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6225 /// Predicate indicating whether `t` is a negative floating-point number.
6226 ///
6227 /// - `c`: logical context
6228 /// - `t`: term of FloatingPoint sort
6229 ///
6230 /// `t` must have FloatingPoint sort.
6231 ///
6232 /// # See also
6233 ///
6234 /// - [`Z3_mk_fpa_abs`]
6235 /// - [`Z3_mk_fpa_is_positive`]
6236 /// - [`Z3_mk_fpa_neg`]
6237 pub fn Z3_mk_fpa_is_negative(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6238 /// Predicate indicating whether `t` is a positive floating-point number.
6239 ///
6240 /// - `c`: logical context
6241 /// - `t`: term of FloatingPoint sort
6242 ///
6243 /// `t` must have FloatingPoint sort.
6244 ///
6245 /// # See also
6246 ///
6247 /// - [`Z3_mk_fpa_abs`]
6248 /// - [`Z3_mk_fpa_is_negative`]
6249 /// - [`Z3_mk_fpa_neg`]
6250 pub fn Z3_mk_fpa_is_positive(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6251 /// Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
6252 ///
6253 /// Produces a term that represents the conversion of a bit-vector term `bv` to a
6254 /// floating-point term of sort `s`.
6255 ///
6256 /// - `c`: logical context
6257 /// - `bv`: a bit-vector term
6258 /// - `s`: floating-point sort
6259 ///
6260 /// `s` must be a FloatingPoint sort, `t` must be of bit-vector sort, and the bit-vector
6261 /// size of `bv` must be equal to `ebits+sbits` of `s`. The format of the bit-vector is
6262 /// as defined by the IEEE 754-2008 interchange format.
6263 pub fn Z3_mk_fpa_to_fp_bv(c: Z3_context, bv: Z3_ast, s: Z3_sort) -> Option<Z3_ast>;
6264 /// Conversion of a FloatingPoint term into another term of different FloatingPoint sort.
6265 ///
6266 /// Produces a term that represents the conversion of a floating-point term `t` to a
6267 /// floating-point term of sort `s`. If necessary, the result will be rounded according
6268 /// to rounding mode `rm`.
6269 ///
6270 /// - `c`: logical context
6271 /// - `rm`: term of RoundingMode sort
6272 /// - `t`: term of FloatingPoint sort
6273 /// - `s`: floating-point sort
6274 ///
6275 /// `s` must be a FloatingPoint sort, `rm` must be of RoundingMode sort, `t` must be of floating-point sort.
6276 pub fn Z3_mk_fpa_to_fp_float(
6277 c: Z3_context,
6278 rm: Z3_ast,
6279 t: Z3_ast,
6280 s: Z3_sort,
6281 ) -> Option<Z3_ast>;
6282 /// Conversion of a term of real sort into a term of FloatingPoint sort.
6283 ///
6284 /// Produces a term that represents the conversion of term `t` of real sort into a
6285 /// floating-point term of sort `s`. If necessary, the result will be rounded according
6286 /// to rounding mode `rm`.
6287 ///
6288 /// - `c`: logical context
6289 /// - `rm`: term of RoundingMode sort
6290 /// - `t`: term of Real sort
6291 /// - `s`: floating-point sort
6292 ///
6293 /// `s` must be a FloatingPoint sort, `rm` must be of RoundingMode sort, `t` must be of real sort.
6294 pub fn Z3_mk_fpa_to_fp_real(
6295 c: Z3_context,
6296 rm: Z3_ast,
6297 t: Z3_ast,
6298 s: Z3_sort,
6299 ) -> Option<Z3_ast>;
6300 /// Conversion of a 2's complement signed bit-vector term into a term of FloatingPoint sort.
6301 ///
6302 /// Produces a term that represents the conversion of the bit-vector term `t` into a
6303 /// floating-point term of sort `s`. The bit-vector `t` is taken to be in signed
6304 /// 2's complement format. If necessary, the result will be rounded according
6305 /// to rounding mode `rm`.
6306 ///
6307 /// - `c`: logical context
6308 /// - `rm`: term of RoundingMode sort
6309 /// - `t`: term of bit-vector sort
6310 /// - `s`: floating-point sort
6311 ///
6312 /// `s` must be a FloatingPoint sort, `rm` must be of RoundingMode sort, `t` must be of bit-vector sort.
6313 pub fn Z3_mk_fpa_to_fp_signed(
6314 c: Z3_context,
6315 rm: Z3_ast,
6316 t: Z3_ast,
6317 s: Z3_sort,
6318 ) -> Option<Z3_ast>;
6319 /// Conversion of a 2's complement unsigned bit-vector term into a term of FloatingPoint sort.
6320 ///
6321 /// Produces a term that represents the conversion of the bit-vector term `t` into a
6322 /// floating-point term of sort `s`. The bit-vector `t` is taken to be in unsigned
6323 /// 2's complement format. If necessary, the result will be rounded according
6324 /// to rounding mode `rm`.
6325 ///
6326 /// - `c`: logical context
6327 /// - `rm`: term of RoundingMode sort
6328 /// - `t`: term of bit-vector sort
6329 /// - `s`: floating-point sort
6330 ///
6331 /// `s` must be a FloatingPoint sort, `rm` must be of RoundingMode sort, `t` must be of bit-vector sort.
6332 pub fn Z3_mk_fpa_to_fp_unsigned(
6333 c: Z3_context,
6334 rm: Z3_ast,
6335 t: Z3_ast,
6336 s: Z3_sort,
6337 ) -> Option<Z3_ast>;
6338 /// Conversion of a floating-point term into an unsigned bit-vector.
6339 ///
6340 /// Produces a term that represents the conversion of the floating-point term `t` into a
6341 /// bit-vector term of size `sz` in unsigned 2's complement format. If necessary, the result
6342 /// will be rounded according to rounding mode `rm`.
6343 ///
6344 /// - `c`: logical context
6345 /// - `rm`: term of RoundingMode sort
6346 /// - `t`: term of FloatingPoint sort
6347 /// - `sz`: size of the resulting bit-vector
6348 pub fn Z3_mk_fpa_to_ubv(
6349 c: Z3_context,
6350 rm: Z3_ast,
6351 t: Z3_ast,
6352 sz: ::core::ffi::c_uint,
6353 ) -> Option<Z3_ast>;
6354 /// Conversion of a floating-point term into a signed bit-vector.
6355 ///
6356 /// Produces a term that represents the conversion of the floating-point term `t` into a
6357 /// bit-vector term of size `sz` in signed 2's complement format. If necessary, the result
6358 /// will be rounded according to rounding mode `rm`.
6359 ///
6360 /// - `c`: logical context
6361 /// - `rm`: term of RoundingMode sort
6362 /// - `t`: term of FloatingPoint sort
6363 /// - `sz`: size of the resulting bit-vector
6364 pub fn Z3_mk_fpa_to_sbv(
6365 c: Z3_context,
6366 rm: Z3_ast,
6367 t: Z3_ast,
6368 sz: ::core::ffi::c_uint,
6369 ) -> Option<Z3_ast>;
6370 /// Conversion of a floating-point term into a real-numbered term.
6371 ///
6372 /// Produces a term that represents the conversion of the floating-point term `t` into a
6373 /// real number. Note that this type of conversion will often result in non-linear
6374 /// constraints over real terms.
6375 ///
6376 /// - `c`: logical context
6377 /// - `t`: term of FloatingPoint sort
6378 pub fn Z3_mk_fpa_to_real(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6379 /// Retrieves the number of bits reserved for the exponent in a FloatingPoint sort.
6380 ///
6381 /// - `c`: logical context
6382 /// - `s`: FloatingPoint sort
6383 ///
6384 /// # See also
6385 ///
6386 /// - [`Z3_fpa_get_sbits`]
6387 pub fn Z3_fpa_get_ebits(c: Z3_context, s: Z3_sort) -> ::core::ffi::c_uint;
6388 /// Retrieves the number of bits reserved for the significand in a FloatingPoint sort.
6389 ///
6390 /// - `c`: logical context
6391 /// - `s`: FloatingPoint sort
6392 ///
6393 /// # See also
6394 ///
6395 /// - [`Z3_fpa_get_ebits`]
6396 pub fn Z3_fpa_get_sbits(c: Z3_context, s: Z3_sort) -> ::core::ffi::c_uint;
6397 /// Checks whether a given ast is a floating-point numeral.
6398 ///
6399 /// - `c`: logical context
6400 /// - `t`: an ast
6401 ///
6402 /// # See also
6403 ///
6404 /// - [`Z3_fpa_is_numeral_nan`]
6405 /// - [`Z3_fpa_is_numeral_inf`]
6406 /// - [`Z3_fpa_is_numeral_normal`]
6407 /// - [`Z3_fpa_is_numeral_subnormal`]
6408 /// - [`Z3_fpa_is_numeral_zero`]
6409 pub fn Z3_fpa_is_numeral(c: Z3_context, t: Z3_ast) -> bool;
6410 /// Checks whether a given floating-point numeral is a NaN.
6411 ///
6412 /// - `c`: logical context
6413 /// - `t`: a floating-point numeral
6414 ///
6415 /// # See also
6416 ///
6417 /// - [`Z3_fpa_is_numeral_inf`]
6418 /// - [`Z3_fpa_is_numeral_normal`]
6419 /// - [`Z3_fpa_is_numeral_subnormal`]
6420 /// - [`Z3_fpa_is_numeral_zero`]
6421 pub fn Z3_fpa_is_numeral_nan(c: Z3_context, t: Z3_ast) -> bool;
6422 /// Checks whether a given floating-point numeral is a +oo or -oo.
6423 ///
6424 /// - `c`: logical context
6425 /// - `t`: a floating-point numeral
6426 ///
6427 /// # See also
6428 ///
6429 /// - [`Z3_fpa_is_numeral_nan`]
6430 /// - [`Z3_fpa_is_numeral_normal`]
6431 /// - [`Z3_fpa_is_numeral_subnormal`]
6432 /// - [`Z3_fpa_is_numeral_zero`]
6433 pub fn Z3_fpa_is_numeral_inf(c: Z3_context, t: Z3_ast) -> bool;
6434 /// Checks whether a given floating-point numeral is +zero or -zero.
6435 ///
6436 /// - `c`: logical context
6437 /// - `t`: a floating-point numeral
6438 ///
6439 /// # See also
6440 ///
6441 /// - [`Z3_fpa_is_numeral_inf`]
6442 /// - [`Z3_fpa_is_numeral_nan`]
6443 /// - [`Z3_fpa_is_numeral_normal`]
6444 /// - [`Z3_fpa_is_numeral_subnormal`]
6445 pub fn Z3_fpa_is_numeral_zero(c: Z3_context, t: Z3_ast) -> bool;
6446 /// Checks whether a given floating-point numeral is normal.
6447 ///
6448 /// - `c`: logical context
6449 /// - `t`: a floating-point numeral
6450 ///
6451 /// # See also
6452 ///
6453 /// - [`Z3_fpa_is_numeral_inf`]
6454 /// - [`Z3_fpa_is_numeral_nan`]
6455 /// - [`Z3_fpa_is_numeral_subnormal`]
6456 /// - [`Z3_fpa_is_numeral_zero`]
6457 pub fn Z3_fpa_is_numeral_normal(c: Z3_context, t: Z3_ast) -> bool;
6458 /// Checks whether a given floating-point numeral is subnormal.
6459 ///
6460 /// - `c`: logical context
6461 /// - `t`: a floating-point numeral
6462 ///
6463 /// # See also
6464 ///
6465 /// - [`Z3_fpa_is_numeral_inf`]
6466 /// - [`Z3_fpa_is_numeral_nan`]
6467 /// - [`Z3_fpa_is_numeral_normal`]
6468 /// - [`Z3_fpa_is_numeral_zero`]
6469 pub fn Z3_fpa_is_numeral_subnormal(c: Z3_context, t: Z3_ast) -> bool;
6470 /// Checks whether a given floating-point numeral is positive.
6471 ///
6472 /// - `c`: logical context
6473 /// - `t`: a floating-point numeral
6474 ///
6475 /// # See also
6476 ///
6477 /// - [`Z3_fpa_is_numeral_negative`]
6478 pub fn Z3_fpa_is_numeral_positive(c: Z3_context, t: Z3_ast) -> bool;
6479 /// Checks whether a given floating-point numeral is negative.
6480 ///
6481 /// - `c`: logical context
6482 /// - `t`: a floating-point numeral
6483 ///
6484 /// # See also
6485 ///
6486 /// - [`Z3_fpa_is_numeral_positive`]
6487 pub fn Z3_fpa_is_numeral_negative(c: Z3_context, t: Z3_ast) -> bool;
6488 /// Retrieves the sign of a floating-point literal as a bit-vector expression.
6489 ///
6490 /// - `c`: logical context
6491 /// - `t`: a floating-point numeral
6492 ///
6493 /// Remarks: NaN is an invalid argument.
6494 pub fn Z3_fpa_get_numeral_sign_bv(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6495 /// Retrieves the significand of a floating-point literal as a bit-vector expression.
6496 ///
6497 /// - `c`: logical context
6498 /// - `t`: a floating-point numeral
6499 ///
6500 /// Remarks: NaN is an invalid argument.
6501 pub fn Z3_fpa_get_numeral_significand_bv(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6502 /// Retrieves the sign of a floating-point literal.
6503 ///
6504 /// - `c`: logical context
6505 /// - `t`: a floating-point numeral
6506 /// - `sgn`: the retrieved sign
6507 ///
6508 /// **Returns:** true if `t` corresponds to a floating point numeral, otherwise invokes exception handler or returns false
6509 ///
6510 /// Remarks: sets `sgn` to `false` if `t' is positive and to `true` otherwise, except for
6511 /// NaN, which is an invalid argument.
6512 pub fn Z3_fpa_get_numeral_sign(c: Z3_context, t: Z3_ast, sgn: *mut bool) -> bool;
6513 /// Return the significand value of a floating-point numeral as a string.
6514 ///
6515 /// - `c`: logical context
6516 /// - `t`: a floating-point numeral
6517 ///
6518 /// **Returns:** true if `t` corresponds to a floating point numeral, otherwise invokes exception handler or returns false
6519 ///
6520 /// Remarks: The significand `s` is always `0.0 <= s < 2.0`; the resulting string is long
6521 /// enough to represent the real significand precisely.
6522 pub fn Z3_fpa_get_numeral_significand_string(c: Z3_context, t: Z3_ast) -> Z3_string;
6523 /// Return the significand value of a floating-point numeral as a uint64.
6524 ///
6525 /// - `c`: logical context
6526 /// - `t`: a floating-point numeral
6527 /// - `n`: pointer to output uint64
6528 ///
6529 /// Remarks: This function extracts the significand bits in `t`, without the
6530 /// hidden bit or normalization. Sets the `Z3_INVALID_ARG` error code if the
6531 /// significand does not fit into a `uint64`. NaN is an invalid argument.
6532 pub fn Z3_fpa_get_numeral_significand_uint64(
6533 c: Z3_context,
6534 t: Z3_ast,
6535 n: *mut u64,
6536 ) -> bool;
6537 /// Return the exponent value of a floating-point numeral as a string.
6538 ///
6539 /// - `c`: logical context
6540 /// - `t`: a floating-point numeral
6541 /// - `biased`: flag to indicate whether the result is in biased representation
6542 ///
6543 /// **Returns:** true if `t` corresponds to a floating point numeral, otherwise invokes exception handler or returns false
6544 ///
6545 /// Remarks: This function extracts the exponent in `t`, without normalization.
6546 /// NaN is an invalid argument.
6547 pub fn Z3_fpa_get_numeral_exponent_string(
6548 c: Z3_context,
6549 t: Z3_ast,
6550 biased: bool,
6551 ) -> Z3_string;
6552 /// Return the exponent value of a floating-point numeral as a signed 64-bit integer
6553 ///
6554 /// - `c`: logical context
6555 /// - `t`: a floating-point numeral
6556 /// - `n`: exponent
6557 /// - `biased`: flag to indicate whether the result is in biased representation
6558 ///
6559 /// **Returns:** true if `t` corresponds to a floating point numeral, otherwise invokes exception handler or returns false
6560 ///
6561 /// Remarks: This function extracts the exponent in `t`, without normalization.
6562 /// NaN is an invalid argument.
6563 pub fn Z3_fpa_get_numeral_exponent_int64(
6564 c: Z3_context,
6565 t: Z3_ast,
6566 n: *mut i64,
6567 biased: bool,
6568 ) -> bool;
6569 /// Retrieves the exponent of a floating-point literal as a bit-vector expression.
6570 ///
6571 /// - `c`: logical context
6572 /// - `t`: a floating-point numeral
6573 /// - `biased`: flag to indicate whether the result is in biased representation
6574 ///
6575 /// Remarks: This function extracts the exponent in `t`, without normalization.
6576 /// NaN is an invalid arguments.
6577 pub fn Z3_fpa_get_numeral_exponent_bv(
6578 c: Z3_context,
6579 t: Z3_ast,
6580 biased: bool,
6581 ) -> Option<Z3_ast>;
6582 /// Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
6583 ///
6584 /// - `c`: logical context
6585 /// - `t`: term of FloatingPoint sort
6586 ///
6587 /// `t` must have FloatingPoint sort. The size of the resulting bit-vector is automatically
6588 /// determined.
6589 ///
6590 /// Note that IEEE 754-2008 allows multiple different representations of NaN. This conversion
6591 /// knows only one NaN and it will always produce the same bit-vector representation of
6592 /// that NaN.
6593 pub fn Z3_mk_fpa_to_ieee_bv(c: Z3_context, t: Z3_ast) -> Option<Z3_ast>;
6594 /// Conversion of a real-sorted significand and an integer-sorted exponent into a term of FloatingPoint sort.
6595 ///
6596 /// Produces a term that represents the conversion of `sig * 2^exp` into a
6597 /// floating-point term of sort `s`. If necessary, the result will be rounded
6598 /// according to rounding mode `rm`.
6599 ///
6600 /// - `c`: logical context
6601 /// - `rm`: term of RoundingMode sort
6602 /// - `exp`: exponent term of Int sort
6603 /// - `sig`: significand term of Real sort
6604 /// - `s`: FloatingPoint sort
6605 ///
6606 /// `s` must be a FloatingPoint sort, `rm` must be of RoundingMode sort, `exp` must be of int sort, `sig` must be of real sort.
6607 pub fn Z3_mk_fpa_to_fp_int_real(
6608 c: Z3_context,
6609 rm: Z3_ast,
6610 exp: Z3_ast,
6611 sig: Z3_ast,
6612 s: Z3_sort,
6613 ) -> Option<Z3_ast>;
6614 /// Pose a query against the asserted rules at the given level.
6615 ///
6616 /// ```c
6617 /// query ::= (exists (bound-vars) query)
6618 /// | literals
6619 /// ```
6620 ///
6621 /// query returns
6622 /// - `Z3_L_FALSE` if the query is unsatisfiable.
6623 /// - `Z3_L_TRUE` if the query is satisfiable. Obtain the answer by calling [`Z3_fixedpoint_get_answer`].
6624 /// - `Z3_L_UNDEF` if the query was interrupted, timed out or otherwise failed.
6625 pub fn Z3_fixedpoint_query_from_lvl(
6626 c: Z3_context,
6627 d: Z3_fixedpoint,
6628 query: Z3_ast,
6629 lvl: ::core::ffi::c_uint,
6630 ) -> Z3_lbool;
6631 /// Retrieve a bottom-up (from query) sequence of ground facts
6632 ///
6633 /// The previous call to [`Z3_fixedpoint_query`] must have returned `Z3_L_TRUE`.
6634 pub fn Z3_fixedpoint_get_ground_sat_answer(
6635 c: Z3_context,
6636 d: Z3_fixedpoint,
6637 ) -> Option<Z3_ast>;
6638 /// Obtain the list of rules along the counterexample trace.
6639 pub fn Z3_fixedpoint_get_rules_along_trace(
6640 c: Z3_context,
6641 d: Z3_fixedpoint,
6642 ) -> Option<Z3_ast_vector>;
6643 /// Obtain the list of rules along the counterexample trace.
6644 pub fn Z3_fixedpoint_get_rule_names_along_trace(
6645 c: Z3_context,
6646 d: Z3_fixedpoint,
6647 ) -> Option<Z3_symbol>;
6648 /// Add an invariant for the predicate `pred`.
6649 /// Add an assumed invariant of predicate `pred`.
6650 ///
6651 /// Note: this functionality is Spacer specific.
6652 pub fn Z3_fixedpoint_add_invariant(
6653 c: Z3_context,
6654 d: Z3_fixedpoint,
6655 pred: Z3_func_decl,
6656 property: Z3_ast,
6657 );
6658 /// Retrieve reachable states of a predicate.
6659 /// Note: this functionality is Spacer specific.
6660 pub fn Z3_fixedpoint_get_reachable(
6661 c: Z3_context,
6662 d: Z3_fixedpoint,
6663 pred: Z3_func_decl,
6664 ) -> Option<Z3_ast>;
6665 /// Project variables given a model
6666 pub fn Z3_qe_model_project(
6667 c: Z3_context,
6668 m: Z3_model,
6669 num_bounds: ::core::ffi::c_uint,
6670 bound: *const Z3_app,
6671 body: Z3_ast,
6672 ) -> Option<Z3_ast>;
6673 /// Project variables given a model
6674 pub fn Z3_qe_model_project_skolem(
6675 c: Z3_context,
6676 m: Z3_model,
6677 num_bounds: ::core::ffi::c_uint,
6678 bound: *const Z3_app,
6679 body: Z3_ast,
6680 map: Z3_ast_map,
6681 ) -> Option<Z3_ast>;
6682 /// Project with witness extraction.
6683 ///
6684 /// The returned map contains a binding of variables to terms that such that when the binding
6685 /// is used for the formula, it remains true within the model.
6686 pub fn Z3_qe_model_project_with_witness(
6687 c: Z3_context,
6688 m: Z3_model,
6689 num_bounds: ::core::ffi::c_uint,
6690 bound: *const Z3_app,
6691 body: Z3_ast,
6692 map: Z3_ast_map,
6693 ) -> Option<Z3_ast>;
6694 /// Extrapolates a model of a formula
6695 pub fn Z3_model_extrapolate(
6696 c: Z3_context,
6697 m: Z3_model,
6698 fml: Z3_ast,
6699 ) -> Option<Z3_ast>;
6700 /// Best-effort quantifier elimination
6701 pub fn Z3_qe_lite(
6702 c: Z3_context,
6703 vars: Z3_ast_vector,
6704 body: Z3_ast,
6705 ) -> Option<Z3_ast>;
6706}