3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-07-15 03:25:43 +00:00
z3/src/test/api_datalog.cpp
2026-07-12 23:48:30 +00:00

233 lines
6.5 KiB
C++

/*++
Copyright (c) 2025 Daily Test Coverage Improver
Module Name:
api_datalog.cpp
Abstract:
Test API datalog/fixedpoint functions
Author:
Daily Test Coverage Improver 2025-09-17
Notes:
--*/
#include "api/z3.h"
#include "util/trace.h"
#include "util/debug.h"
void tst_api_datalog() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_del_config(cfg);
// Test 1: Z3_mk_finite_domain_sort and size functions
{
Z3_symbol name = Z3_mk_string_symbol(ctx, "Domain");
Z3_sort finite_sort = Z3_mk_finite_domain_sort(ctx, name, 5);
ENSURE(finite_sort != nullptr);
uint64_t size;
bool success = Z3_get_finite_domain_sort_size(ctx, finite_sort, &size);
ENSURE(success);
ENSURE(size == 5);
// Test with non-finite domain sort (should fail)
Z3_sort int_sort = Z3_mk_int_sort(ctx);
uint64_t wrong_size;
bool wrong_success = Z3_get_finite_domain_sort_size(ctx, int_sort, &wrong_size);
ENSURE(!wrong_success);
}
// Test 2: Z3_mk_fixedpoint basic operations
{
Z3_fixedpoint fp = Z3_mk_fixedpoint(ctx);
ENSURE(fp != nullptr);
Z3_fixedpoint_inc_ref(ctx, fp);
// Test string conversion (empty fixedpoint)
Z3_string fp_str = Z3_fixedpoint_to_string(ctx, fp, 0, nullptr);
ENSURE(fp_str != nullptr);
// Test statistics
Z3_stats stats = Z3_fixedpoint_get_statistics(ctx, fp);
ENSURE(stats != nullptr);
// Test reason unknown
Z3_string reason = Z3_fixedpoint_get_reason_unknown(ctx, fp);
(void)reason; // May be null
Z3_fixedpoint_dec_ref(ctx, fp);
}
// Regression test for Spacer model construction on ADT CHCs
{
char const* chc =
"(set-logic HORN)\n"
"(set-option :fp.engine spacer)\n"
"(set-option :fp.spacer.random_seed 51)\n"
"(set-option :timeout 2000)\n"
"(declare-datatypes ((L 0)) (((cons (hd Int) (tl L)) (nil))))\n"
"(declare-fun reva (L L L) Bool)\n"
"(assert (forall ((a L)) (reva nil a a)))\n"
"(assert (forall ((x L) (acc L) (r L) (h Int))\n"
" (=> (reva x (cons h acc) r)\n"
" (reva (cons h x) acc r))))\n"
"(assert (forall ((B L) (C L) (D L) (E L) (F L))\n"
" (=> (and (reva B C D)\n"
" (reva D nil E)\n"
" (reva C B F)\n"
" (not (= E F)))\n"
" false)))\n"
"(check-sat)\n";
Z3_string response = Z3_eval_smtlib2_string(ctx, chc);
ENSURE(response != nullptr);
ENSURE(Z3_get_error_code(ctx) == Z3_OK);
}
// Regression test for assertion violation in Spacer QE projection (#3845)
{
char const* chc = R"(
(set-logic HORN)
(set-option :fp.xform.inline_eager false)
(set-option :fp.spacer.native_mbp false)
(set-option :fp.spacer.reach_dnf false)
(declare-fun a (Int Bool Int Bool) Bool)
(declare-fun c (Int Int Bool Bool Int Int Int Int Bool Bool Bool Int Int Bool Bool Int Int Int Int Bool Bool Bool) Bool)
(declare-fun d (Bool Bool Bool Int Bool Int Int Bool Bool Int Int Int Int Bool Bool Bool Int Int Bool Bool Int Int Int Int Bool Bool Bool) Bool)
(declare-fun e (Int Int Bool Bool Int Int Int Int Bool Bool Bool Bool) Bool)
(assert (forall ((ef Int) (eaa Int) (eabacad Bool) (eabacg Bool)) (=> eabacad (a eaa eabacg ef eabacad))))
(assert
(forall ((no Int)
(naf Int)
(nphl Bool)
(nphiacg Bool)
(nphq Bool)
(nphiacad Bool)
(nrsag Int)
(nrsah Int)
(nrst Int)
(nrsai Int)
(nrsuacg Bool)
(nrsv Int)
(nrsw Int)
(nrsx Int)
(nrsaj Int)
(nrsuacad Bool)
(nyacad Bool)
(nzeaa Int)
(nzeabacg Bool)
(nzef Int)
(nzeabacad Bool)
(nyacg Bool))
(=> (a nzeaa nzeabacg nzef nzeabacad)
(c naf nzeaa nzeabacg nyacg nrsag nrsah nrst nrsai nrsuacg nphl nphiacg no nzef
nzeabacad nyacad nrsv nrsw nrsx nrsaj nrsuacad nphq nphiacad))))
(assert
(forall ((nak Bool)
(nal Bool)
(nam Bool)
(nphl Bool)
(nphiacg Bool)
(ninit_invalid_s Int)
(nao Bool)
(nphae Bool)
(nphiacj Bool)
(nrsag Int)
(nrsah Int)
(nrst Int)
(nrsai Int)
(nrsuacg Bool)
(nap Int)
(nrsaq Int)
(nrsar Int)
(nrsas Int)
(nrs__synapse_5_x Int)
(nrsuacj Bool)
(nyacg Bool)
(nyacj Bool)
(naf Int)
(nat Int)
(nzeaa Int)
(nzeabacg Bool)
(nau Int)
(nzeav Int)
(nzeabacj Bool)
(naw Bool))
(let ((ax (=> nao (< nap 0 nau))))
(let ((ay (= naw ax)))
(=> ay (d nak nal nam ninit_invalid_s naw naf nzeaa nzeabacg nyacg nrsag nrsah nrst nrsai
nrsuacg nphl nphiacg nat nzeav nzeabacj nyacj nrsaq nrsar nrsas nrs__synapse_5_x nrsuacj nphae nphiacj))))))
(assert
(forall ((naf Int)
(nzeaa Int)
(nzeabacg Bool)
(nyacg Bool)
(nrsag Int)
(nrsah Int)
(nrst Int)
(nrsai Int)
(nrsuacg Bool)
(nphl Bool)
(nphiacg Bool)
(no Int)
(nzef Int)
(nzeabacad Bool)
(nyacad Bool)
(nrsv Int)
(nrsw Int)
(nrsx Int)
(nrsaj Int)
(nrsuacad Bool)
(nphq Bool)
(nphiacad Bool)
(nak Bool)
(nal Bool)
(nam Bool)
(ninit_invalid_s Int)
(naw Bool)
(nat Int)
(nzeav Int)
(nzeabacj Bool)
(nyacj Bool)
(nrsaq Int)
(nrsar Int)
(nrsas Int)
(nrs__synapse_5_x Int)
(nrsuacj Bool)
(nphae Bool)
(nphiacj Bool))
(=> (c naf nzeaa nzeabacg nyacg nrsag nrsah nrst nrsai nrsuacg nphl nphiacg no nzef nzeabacad
nyacad nrsv nrsw nrsx nrsaj nrsuacad nphq nphiacad)
(d nak nal nam ninit_invalid_s naw no nzef nzeabacad nyacad nrsv nrsw nrsx nrsaj nrsuacad nphq
nphiacad nat nzeav nzeabacj nyacj nrsaq nrsar nrsas nrs__synapse_5_x nrsuacj nphae nphiacj)
(e nat nzeav nzeabacj nyacj nrsaq nrsar nrsas nrs__synapse_5_x nrsuacj nphae nphiacj naw))))
(assert
(forall ((naw Bool)
(nat Int)
(nzeav Int)
(nzeabacj Bool)
(nyacj Bool)
(nrsaq Int)
(nrsar Int)
(nrsas Int)
(nrs__synapse_5_x Int)
(nrsuacj Bool)
(nphae Bool)
(nphiacj Bool))
(not (e nat nzeav nzeabacj nyacj nrsaq nrsar nrsas nrs__synapse_5_x nrsuacj nphae nphiacj naw))))
(check-sat)
)";
Z3_string response = Z3_eval_smtlib2_string(ctx, chc);
ENSURE(response != nullptr);
ENSURE(Z3_get_error_code(ctx) == Z3_OK);
}
Z3_del_context(ctx);
}