Skip to content

Commit 2601e6a

Browse files
committed
Add SMT2 core theory "distinct"
1 parent 1e45307 commit 2601e6a

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

src/solvers/smt2_incremental/smt_core_theory.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,26 @@ void smt_core_theoryt::equalt::validate(
4444

4545
const smt_function_application_termt::factoryt<smt_core_theoryt::equalt>
4646
smt_core_theoryt::equal{};
47+
48+
const char *smt_core_theoryt::distinctt::identifier()
49+
{
50+
return "distinct";
51+
}
52+
53+
smt_sortt
54+
smt_core_theoryt::distinctt::return_sort(const smt_termt &, const smt_termt &)
55+
{
56+
return smt_bool_sortt{};
57+
}
58+
59+
void smt_core_theoryt::distinctt::validate(
60+
const smt_termt &lhs,
61+
const smt_termt &rhs)
62+
{
63+
INVARIANT(
64+
lhs.get_sort() == rhs.get_sort(),
65+
"\"distinct\" may only be applied to terms which have the same sort.");
66+
}
67+
68+
const smt_function_application_termt::factoryt<smt_core_theoryt::distinctt>
69+
smt_core_theoryt::distinct{};

src/solvers/smt2_incremental/smt_core_theory.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ class smt_core_theoryt
2323
static void validate(const smt_termt &lhs, const smt_termt &rhs);
2424
};
2525
static const smt_function_application_termt::factoryt<equalt> equal;
26+
27+
struct distinctt final
28+
{
29+
static const char *identifier();
30+
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs);
31+
static void validate(const smt_termt &lhs, const smt_termt &rhs);
32+
};
33+
static const smt_function_application_termt::factoryt<distinctt> distinct;
2634
};
2735

2836
#endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_CORE_THEORY_H

unit/solvers/smt2_incremental/smt_core_theory.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,45 @@ TEST_CASE("SMT core theory \"=\".", "[core][smt2_incremental]")
6262
smt_bit_vector_constant_termt{2, 8}, smt_bool_literal_termt{true}));
6363
}
6464
}
65+
66+
TEST_CASE("SMT core theory \"distinct\".", "[core][smt2_incremental]")
67+
{
68+
SECTION("Bool sorted term comparison")
69+
{
70+
const smt_bool_literal_termt true_term{true};
71+
const smt_bool_literal_termt false_term{false};
72+
const auto bool_comparison =
73+
smt_core_theoryt::distinct(true_term, false_term);
74+
CHECK(bool_comparison.get_sort() == smt_bool_sortt{});
75+
CHECK(
76+
bool_comparison.function_identifier() ==
77+
smt_identifier_termt{"distinct", smt_bool_sortt{}});
78+
REQUIRE(bool_comparison.arguments().size() == 2);
79+
REQUIRE(bool_comparison.arguments()[0].get() == true_term);
80+
REQUIRE(bool_comparison.arguments()[1].get() == false_term);
81+
}
82+
83+
SECTION("Bit vector sorted term comparison")
84+
{
85+
const smt_bit_vector_constant_termt two{2, 8};
86+
const smt_bit_vector_constant_termt three{3, 8};
87+
const auto bit_vector_comparison = smt_core_theoryt::distinct(two, three);
88+
CHECK(bit_vector_comparison.get_sort() == smt_bool_sortt{});
89+
CHECK(
90+
bit_vector_comparison.function_identifier() ==
91+
smt_identifier_termt{"distinct", smt_bool_sortt{}});
92+
REQUIRE(bit_vector_comparison.arguments().size() == 2);
93+
REQUIRE(bit_vector_comparison.arguments()[0].get() == two);
94+
REQUIRE(bit_vector_comparison.arguments()[1].get() == three);
95+
}
96+
97+
SECTION("Mismatch sort invariant")
98+
{
99+
cbmc_invariants_should_throwt invariants_throw;
100+
CHECK_THROWS(smt_core_theoryt::distinct(
101+
smt_bit_vector_constant_termt{2, 8},
102+
smt_bit_vector_constant_termt{2, 16}));
103+
CHECK_THROWS(smt_core_theoryt::distinct(
104+
smt_bit_vector_constant_termt{2, 8}, smt_bool_literal_termt{true}));
105+
}
106+
}

0 commit comments

Comments
 (0)