Skip to content

Commit b14c4ff

Browse files
committed
Refactor smt_not_term into core theory
For consistency with how the functions for the bit vector theory are defined. Note that the factory is called `make_not` rather than `not`, because not is a keyword in C++ which is equivalent to the `!` operator.
1 parent 454e97b commit b14c4ff

File tree

11 files changed

+50
-76
lines changed

11 files changed

+50
-76
lines changed

src/solvers/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ SRC = $(BOOLEFORCE_SRC) \
194194
smt2/smt2irep.cpp \
195195
smt2_incremental/smt_bit_vector_theory.cpp \
196196
smt2_incremental/smt_commands.cpp \
197+
smt2_incremental/smt_core_theory.cpp \
197198
smt2_incremental/smt_logics.cpp \
198199
smt2_incremental/smt_options.cpp \
199200
smt2_incremental/smt_sorts.cpp \
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Author: Diffblue Ltd.
2+
3+
#include <solvers/smt2_incremental/smt_core_theory.h>
4+
5+
const char *smt_core_theoryt::nott::identifier()
6+
{
7+
return "not";
8+
}
9+
10+
smt_sortt smt_core_theoryt::nott::return_sort(const smt_termt &operand)
11+
{
12+
return smt_bool_sortt{};
13+
}
14+
15+
void smt_core_theoryt::nott::validate(const smt_termt &operand)
16+
{
17+
INVARIANT(
18+
operand.get_sort() == smt_bool_sortt{},
19+
"\"not\" may only be applied to terms which have bool sort.");
20+
}
21+
22+
const smt_function_application_termt::factoryt<smt_core_theoryt::nott>
23+
smt_core_theoryt::make_not{};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Author: Diffblue Ltd.
2+
3+
#ifndef CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_CORE_THEORY_H
4+
#define CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_CORE_THEORY_H
5+
6+
#include <solvers/smt2_incremental/smt_terms.h>
7+
8+
class smt_core_theoryt
9+
{
10+
public:
11+
struct nott final
12+
{
13+
static const char *identifier();
14+
static smt_sortt return_sort(const smt_termt &operand);
15+
static void validate(const smt_termt &operand);
16+
};
17+
static const smt_function_application_termt::factoryt<nott> make_not;
18+
};
19+
20+
#endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_CORE_THEORY_H

src/solvers/smt2_incremental/smt_terms.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,6 @@ bool smt_bool_literal_termt::value() const
4848
return get_bool(ID_value);
4949
}
5050

51-
smt_not_termt::smt_not_termt(smt_termt operand)
52-
: smt_termt{ID_smt_not_term, smt_bool_sortt{}}
53-
{
54-
INVARIANT(
55-
operand.get_sort() == smt_bool_sortt{},
56-
"smt_not_termt may only be applied to terms which have bool sort.");
57-
get_sub().push_back(std::move(operand));
58-
}
59-
60-
const smt_termt &smt_not_termt::operand() const
61-
{
62-
return static_cast<const smt_termt &>(get_sub().at(0));
63-
}
64-
6551
static bool is_valid_smt_identifier(irep_idt identifier)
6652
{
6753
static const std::regex valid{R"(^[^\|\\]*$)"};

src/solvers/smt2_incremental/smt_terms.def

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
/// * The member functions of the `smt_term_const_downcast_visitort` class.
88
/// * The type of term checks required to implement `smt_termt::accept`.
99
TERM_ID(bool_literal)
10-
TERM_ID(not)
1110
TERM_ID(identifier)
1211
TERM_ID(bit_vector_constant)
1312
TERM_ID(function_application)

src/solvers/smt2_incremental/smt_terms.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,6 @@ class smt_bool_literal_termt : public smt_termt
7575
bool value() const;
7676
};
7777

78-
class smt_not_termt : public smt_termt
79-
{
80-
public:
81-
explicit smt_not_termt(smt_termt operand);
82-
const smt_termt &operand() const;
83-
};
84-
8578
/// Stores identifiers in unescaped and unquoted form. Any escaping or quoting
8679
/// required should be performed during printing.
8780
class smt_identifier_termt : public smt_termt

src/solvers/smt2_incremental/smt_to_smt2_string.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ class smt_term_to_string_convertert : private smt_term_const_downcast_visitort
102102
smt_term_to_string_convertert() = default;
103103

104104
void visit(const smt_bool_literal_termt &bool_literal) override;
105-
void visit(const smt_not_termt &not_term) override;
106105
void visit(const smt_identifier_termt &identifier_term) override;
107106
void visit(const smt_bit_vector_constant_termt &bit_vector_constant) override;
108107
void
@@ -171,11 +170,6 @@ void smt_term_to_string_convertert::visit(
171170
push_output(bool_literal.value() ? "true" : "false");
172171
}
173172

174-
void smt_term_to_string_convertert::visit(const smt_not_termt &not_term)
175-
{
176-
push_outputs("(not ", not_term.operand(), ")");
177-
}
178-
179173
void smt_term_to_string_convertert::visit(
180174
const smt_identifier_termt &identifier_term)
181175
{

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ SRC += analyses/ai/ai.cpp \
8787
solvers/smt2/smt2_conv.cpp \
8888
solvers/smt2_incremental/smt_bit_vector_theory.cpp \
8989
solvers/smt2_incremental/smt_commands.cpp \
90+
solvers/smt2_incremental/smt_core_theory.cpp \
9091
solvers/smt2_incremental/smt_sorts.cpp \
9192
solvers/smt2_incremental/smt_terms.cpp \
9293
solvers/smt2_incremental/smt_to_smt2_string.cpp \

unit/solvers/smt2_incremental/smt_commands.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <testing-utils/use_catch.h>
44

55
#include <solvers/smt2_incremental/smt_commands.h>
6+
#include <solvers/smt2_incremental/smt_core_theory.h>
67

78
TEST_CASE("Test smt_commandt.pretty is accessible.", "[core][smt2_incremental]")
89
{
@@ -32,11 +33,13 @@ TEST_CASE("smt_declare_function_commandt getters", "[core][smt2_incremental]")
3233

3334
TEST_CASE("smt_define_function_commandt getters", "[core][smt2_incremental]")
3435
{
36+
const auto not_x =
37+
smt_core_theoryt::make_not(smt_identifier_termt{"x", smt_bool_sortt{}});
3538
const smt_define_function_commandt function_definition{
3639
"not first",
3740
{smt_identifier_termt{"x", smt_bool_sortt{}},
3841
smt_identifier_termt{"y", smt_bool_sortt{}}},
39-
smt_not_termt{smt_identifier_termt{"x", smt_bool_sortt{}}}};
42+
not_x};
4043
CHECK(
4144
function_definition.identifier() ==
4245
smt_identifier_termt{"not first", smt_bool_sortt{}});
@@ -46,9 +49,7 @@ TEST_CASE("smt_define_function_commandt getters", "[core][smt2_incremental]")
4649
CHECK(
4750
function_definition.parameters()[1].get() ==
4851
smt_identifier_termt{"y", smt_bool_sortt{}});
49-
CHECK(
50-
function_definition.definition() ==
51-
smt_not_termt{smt_identifier_termt{"x", smt_bool_sortt{}}});
52+
CHECK(function_definition.definition() == not_x);
5253
}
5354

5455
TEST_CASE("smt_get_value_commandt getter", "[core][smt2_incremental]")

unit/solvers/smt2_incremental/smt_terms.cpp

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,6 @@ TEST_CASE(
3333
REQUIRE_FALSE(smt_bool_literal_termt{false}.value());
3434
}
3535

36-
TEST_CASE("smt_not_termt sort.", "[core][smt2_incremental]")
37-
{
38-
REQUIRE(
39-
smt_not_termt{smt_bool_literal_termt{true}}.get_sort() == smt_bool_sortt{});
40-
}
41-
42-
TEST_CASE("smt_not_termt operand getter.", "[core][smt2_incremental]")
43-
{
44-
const smt_bool_literal_termt bool_term{true};
45-
const smt_not_termt not_term{bool_term};
46-
REQUIRE(not_term.operand() == bool_term);
47-
}
48-
4936
TEST_CASE("smt_identifier_termt construction", "[core][smt2_incremental]")
5037
{
5138
cbmc_invariants_should_throwt invariants_throw;
@@ -78,11 +65,6 @@ TEST_CASE("smt_termt equality.", "[core][smt2_incremental]")
7865
CHECK(
7966
smt_bit_vector_constant_termt{42, 8} !=
8067
smt_bit_vector_constant_termt{12, 8});
81-
smt_termt not_false = smt_not_termt{smt_bool_literal_termt{false}};
82-
smt_termt not_true = smt_not_termt{smt_bool_literal_termt{true}};
83-
CHECK_FALSE(not_false == true_term);
84-
CHECK_FALSE(not_false == not_true);
85-
CHECK(not_false == smt_not_termt{smt_bool_literal_termt{false}});
8668
}
8769

8870
template <typename expected_termt>
@@ -104,18 +86,6 @@ class term_visit_type_checkert final : public smt_term_const_downcast_visitort
10486
}
10587
}
10688

107-
void visit(const smt_not_termt &) override
108-
{
109-
if(std::is_same<expected_termt, smt_not_termt>::value)
110-
{
111-
expected_term_visited = true;
112-
}
113-
else
114-
{
115-
unexpected_term_visited = true;
116-
}
117-
}
118-
11989
void visit(const smt_identifier_termt &) override
12090
{
12191
if(std::is_same<expected_termt, smt_identifier_termt>::value)
@@ -162,12 +132,6 @@ smt_bool_literal_termt make_test_term<smt_bool_literal_termt>()
162132
return smt_bool_literal_termt{false};
163133
}
164134

165-
template <>
166-
smt_not_termt make_test_term<smt_not_termt>()
167-
{
168-
return smt_not_termt{smt_bool_literal_termt{false}};
169-
}
170-
171135
template <>
172136
smt_identifier_termt make_test_term<smt_identifier_termt>()
173137
{
@@ -191,7 +155,6 @@ TEMPLATE_TEST_CASE(
191155
"smt_termt::accept(visitor)",
192156
"[core][smt2_incremental]",
193157
smt_bool_literal_termt,
194-
smt_not_termt,
195158
smt_identifier_termt,
196159
smt_bit_vector_constant_termt,
197160
smt_function_application_termt)

unit/solvers/smt2_incremental/smt_to_smt2_string.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ TEST_CASE("Test smt_sortt to string conversion", "[core][smt2_incremental]")
1616
CHECK(smt_to_smt2_string(smt_bit_vector_sortt{16}) == "(_ BitVec 16)");
1717
}
1818

19-
TEST_CASE("Test smt_not_termt to string conversion", "[core][smt2_incremental]")
20-
{
21-
CHECK(
22-
smt_to_smt2_string(smt_not_termt{
23-
smt_identifier_termt{"foo", smt_bool_sortt{}}}) == "(not |foo|)");
24-
}
25-
2619
TEST_CASE(
2720
"Test smt_bit_vector_constant_termt to string conversion",
2821
"[core][smt2_incremental]")

0 commit comments

Comments
 (0)