#include <z3.h>
// String sort
Z3_sort string_sort = Z3_mk_string_sort(ctx);
// Sequence sort
Z3_sort elem_sort = Z3_mk_int_sort(ctx);
Z3_sort seq_sort = Z3_mk_seq_sort(ctx, elem_sort);
// String value
Z3_ast str = Z3_mk_string(ctx, "hello");
Z3_ast lstr = Z3_mk_lstring(ctx, 5, "hello"); // with length
// Operations
Z3_ast concat = Z3_mk_seq_concat(ctx, 2, (Z3_ast[]){s1, s2});
Z3_ast length = Z3_mk_seq_length(ctx, s);
Z3_ast at = Z3_mk_seq_at(ctx, s, Z3_mk_int(ctx, 0, Z3_mk_int_sort(ctx)));
Z3_ast substr = Z3_mk_seq_extract(ctx, s, offset, length);
// String predicates
Z3_ast contains = Z3_mk_seq_contains(ctx, s, t);
Z3_ast prefix = Z3_mk_seq_prefix(ctx, t, s);
Z3_ast suffix = Z3_mk_seq_suffix(ctx, t, s);
// Regular expressions
Z3_sort re_sort = Z3_mk_re_sort(ctx, string_sort);
Z3_ast re = Z3_mk_re_literal(ctx, str);
Z3_ast re_range = Z3_mk_re_range(ctx, a, b);
Z3_ast re_star = Z3_mk_re_star(ctx, re);
Z3_ast re_plus = Z3_mk_re_plus(ctx, re);
Z3_ast in_re = Z3_mk_seq_in_re(ctx, s, re);
// Conversions
Z3_ast str_to_int = Z3_mk_str_to_int(ctx, s);
Z3_ast int_to_str = Z3_mk_int_to_str(ctx, n);