Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Z3Prover/z3/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The Expression API provides functions for creating and manipulating Z3 abstract syntax trees (ASTs), which represent terms, formulas, and types.
Types
Z3_ast
Abstract syntax tree node - the fundamental data structure in Z3 for representing terms, formulas, and types.
Z3_app
A kind of AST used to represent function applications. Subtype of Z3_ast.
Z3_ast_kind
The different kinds of Z3 AST nodes:
Z3_symbol
Lisp-like symbol used to name types, constants, and functions. Can be created using strings or integers.
Symbol Creation
Z3_mk_int_symbol
Z3_symbol Z3_API Z3_mk_int_symbol(Z3_context c, int i);
Create a Z3 symbol using an integer.
Z3_mk_string_symbol
Z3_symbol Z3_API Z3_mk_string_symbol(Z3_context c, Z3_string s);
Create a Z3 symbol using a C string.
Example:
Z3_symbol x_sym = Z3_mk_string_symbol(ctx, "x");
Z3_symbol y_sym = Z3_mk_string_symbol(ctx, "y");
Boolean Expressions
Z3_mk_true
Z3_ast Z3_API Z3_mk_true(Z3_context c);
Create the true Boolean constant.
Z3_mk_false
Z3_ast Z3_API Z3_mk_false(Z3_context c);
Create the false Boolean constant.
Z3_mk_eq
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r);
Create an equality expression (l = r).
Example:
Z3_ast x = Z3_mk_const(ctx, Z3_mk_string_symbol(ctx, "x"), Z3_mk_int_sort(ctx));
Z3_ast y = Z3_mk_const(ctx, Z3_mk_string_symbol(ctx, "y"), Z3_mk_int_sort(ctx));
Z3_ast eq = Z3_mk_eq(ctx, x, y); // x = y
Z3_mk_distinct
Z3_ast Z3_API Z3_mk_distinct(Z3_context c, unsigned num_args, Z3_ast const args[]);
Create an n-ary distinct predicate (all arguments are pairwise distinct).
Z3_mk_not
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a);
Create a negation (not a).
Z3_mk_and
Z3_ast Z3_API Z3_mk_and(Z3_context c, unsigned num_args, Z3_ast const args[]);
Create an n-ary conjunction (and).
Example:
Z3_ast args[3] = {p, q, r};
Z3_ast conjunction = Z3_mk_and(ctx, 3, args); // p ∧ q ∧ r
Z3_mk_or
Z3_ast Z3_API Z3_mk_or(Z3_context c, unsigned num_args, Z3_ast const args[]);
Create an n-ary disjunction (or).
Z3_mk_implies
Z3_ast Z3_API Z3_mk_implies(Z3_context c, Z3_ast t1, Z3_ast t2);
Create an implication (t1 implies t2).
Z3_mk_ite
Z3_ast Z3_API Z3_mk_ite(Z3_context c, Z3_ast t1, Z3_ast t2, Z3_ast t3);
Create an if-then-else expression.
Example:
Z3_ast result = Z3_mk_ite(ctx, condition, then_val, else_val);
// if condition then then_val else else_val
Constants and Applications
Z3_mk_const
Z3_ast Z3_API Z3_mk_const(Z3_context c, Z3_symbol s, Z3_sort ty);
Create a constant (0-arity function application).
Example:
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_ast x = Z3_mk_const(ctx, Z3_mk_string_symbol(ctx, "x"), int_sort);
Z3_mk_app
Z3_ast Z3_API Z3_mk_app(Z3_context c, Z3_func_decl d, unsigned num_args, Z3_ast const args[]);
Create a function application.
Numeral Creation
Z3_mk_int
Z3_ast Z3_API Z3_mk_int(Z3_context c, int v, Z3_sort ty);
Create a numeral of a given sort from an integer.
Example:
Z3_ast five = Z3_mk_int(ctx, 5, Z3_mk_int_sort(ctx));
Z3_mk_unsigned_int
Z3_ast Z3_API Z3_mk_unsigned_int(Z3_context c, unsigned v, Z3_sort ty);
Create a numeral from an unsigned integer.
Z3_mk_int64
Z3_ast Z3_API Z3_mk_int64(Z3_context c, int64_t v, Z3_sort ty);
Create a numeral from a 64-bit integer.
Z3_mk_numeral
Z3_ast Z3_API Z3_mk_numeral(Z3_context c, Z3_string numeral, Z3_sort ty);
Create a numeral from a string representation.
Example:
Z3_ast large_num = Z3_mk_numeral(ctx, "123456789012345", Z3_mk_int_sort(ctx));
Z3_ast pi_approx = Z3_mk_numeral(ctx, "3.14159", Z3_mk_real_sort(ctx));
AST Inspection
Z3_get_ast_kind
Z3_ast_kind Z3_API Z3_get_ast_kind(Z3_context c, Z3_ast a);
Return the kind of the given AST.
Z3_is_app
bool Z3_API Z3_is_app(Z3_context c, Z3_ast a);
Return true if the given AST is an application.
True if application, false otherwise
Z3_to_app
Z3_app Z3_API Z3_to_app(Z3_context c, Z3_ast a);
Convert an AST to an application.
Z3_get_app_decl
Z3_func_decl Z3_API Z3_get_app_decl(Z3_context c, Z3_app a);
Return the declaration of a function application.
Z3_get_app_num_args
unsigned Z3_API Z3_get_app_num_args(Z3_context c, Z3_app a);
Return the number of arguments of a function application.
Z3_get_app_arg
Z3_ast Z3_API Z3_get_app_arg(Z3_context c, Z3_app a, unsigned i);
Return the i-th argument of a function application.
Complete Example
#include <z3.h>
int main() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_del_config(cfg);
// Create integer sort
Z3_sort int_sort = Z3_mk_int_sort(ctx);
// Create variables x and y
Z3_ast x = Z3_mk_const(ctx, Z3_mk_string_symbol(ctx, "x"), int_sort);
Z3_ast y = Z3_mk_const(ctx, Z3_mk_string_symbol(ctx, "y"), int_sort);
// Create expression: x + y = 10
Z3_ast args[2] = {x, y};
Z3_ast sum = Z3_mk_add(ctx, 2, args);
Z3_ast ten = Z3_mk_int(ctx, 10, int_sort);
Z3_ast constraint = Z3_mk_eq(ctx, sum, ten);
Z3_del_context(ctx);
return 0;
}