diff --git a/src/api/api_array.cpp b/src/api/api_array.cpp index a9f5d7d70..bec0e7560 100644 --- a/src/api/api_array.cpp +++ b/src/api/api_array.cpp @@ -263,6 +263,7 @@ extern "C" { MK_UNARY(Z3_mk_set_complement, mk_c(c)->get_array_fid(), OP_SET_COMPLEMENT, SKIP); MK_BINARY(Z3_mk_set_subset, mk_c(c)->get_array_fid(), OP_SET_SUBSET, SKIP); MK_BINARY(Z3_mk_array_ext, mk_c(c)->get_array_fid(), OP_ARRAY_EXT, SKIP); + MK_BINARY(Z3_mk_set_has_size, mk_c(c)->get_array_fid(), OP_SET_HAS_SIZE, SKIP); Z3_ast Z3_API Z3_mk_as_array(Z3_context c, Z3_func_decl f) { Z3_TRY; diff --git a/src/api/python/z3/z3.py b/src/api/python/z3/z3.py index dfa5a0b41..485107e44 100644 --- a/src/api/python/z3/z3.py +++ b/src/api/python/z3/z3.py @@ -4504,6 +4504,11 @@ def Ext(a, b): _z3_assert(is_array(a) and is_array(b), "arguments must be arrays") return _to_expr_ref(Z3_mk_array_ext(ctx.ref(), a.as_ast(), b.as_ast()), ctx) +def SetHasSize(a, k): + ctx = a.ctx + k = _py2expr(k, ctx) + return _to_expr_ref(Z3_mk_set_has_size(ctx.ref(), a.as_ast(), k.as_ast()), ctx) + def is_select(a): """Return `True` if `a` is a Z3 array select application. diff --git a/src/api/z3_api.h b/src/api/z3_api.h index 2c07ae73a..f4db07cfc 100644 --- a/src/api/z3_api.h +++ b/src/api/z3_api.h @@ -3106,6 +3106,14 @@ extern "C" { def_API('Z3_mk_as_array', AST, (_in(CONTEXT), _in(FUNC_DECL))) */ Z3_ast Z3_API Z3_mk_as_array(Z3_context c, Z3_func_decl f); + + /** + \brief Create predicate that holds if Boolean array \c set has \c k elements set to true. + + def_API('Z3_mk_set_has_size', AST, (_in(CONTEXT), _in(AST), _in(AST))) + */ + Z3_ast Z3_API Z3_mk_set_has_size(Z3_context c, Z3_ast set, Z3_ast k); + /*@}*/ /** @name Sets */ diff --git a/src/smt/theory_array_base.cpp b/src/smt/theory_array_base.cpp index af9d87cf5..a9418f3b6 100644 --- a/src/smt/theory_array_base.cpp +++ b/src/smt/theory_array_base.cpp @@ -621,7 +621,7 @@ namespace smt { if (!ctx.is_relevant(n)) continue; - if (is_store(n) || is_const(n) || is_default(n)) + if (is_store(n) || is_const(n) || is_default(n) || is_set_has_size(n)) return false; } return true;