Skip to main content

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}