Skip to content

Commit 9634f7e

Browse files
committed
Implement SMT2 incremental support for arithmetic integers
Adds support for mathematical integers (`__CPROVER_integer`) via a new smt_integer_theory with arithmetic and comparison operators. Fixes: #8074
1 parent 4fe3ade commit 9634f7e

File tree

15 files changed

+493
-3
lines changed

15 files changed

+493
-3
lines changed

regression/cbmc/integer-assignments1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE smt-backend broken-cprover-smt-backend no-new-smt
1+
CORE smt-backend broken-cprover-smt-backend
22
main.c
33
--trace --smt2
44
^EXIT=10$

src/solvers/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ SRC = $(BOOLEFORCE_SRC) \
218218
smt2_incremental/theories/smt_array_theory.cpp \
219219
smt2_incremental/theories/smt_bit_vector_theory.cpp \
220220
smt2_incremental/theories/smt_core_theory.cpp \
221+
smt2_incremental/theories/smt_integer_theory.cpp \
221222
# Empty last line
222223

223224
include ../common

src/solvers/smt2_incremental/ast/smt_logics.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ LOGIC_ID(quantifier_free_bit_vectors, QF_BV)
1111
LOGIC_ID(quantifier_free_uninterpreted_functions_bit_vectors, QF_UFBV)
1212
LOGIC_ID(quantifier_free_bit_vectors_arrays, QF_ABV)
1313
LOGIC_ID(quantifier_free_arrays_uninterpreted_functions_bit_vectors, QF_AUFBV)
14+
LOGIC_ID(quantifier_free_uninterpreted_functions_linear_integer_arithmetic, QF_UFLIA)
15+
LOGIC_ID(quantifier_free_arrays_uninterpreted_functions_linear_integer_arithmetic, QF_AUFLIA)
1416
LOGIC_ID(all, ALL)

src/solvers/smt2_incremental/ast/smt_sorts.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ const smt_sortt &smt_array_sortt::element_sort() const
8383
return static_cast<const smt_sortt &>(find(ID_value));
8484
}
8585

86+
smt_int_sortt::smt_int_sortt() : smt_sortt{ID_smt_int_sort}
87+
{
88+
}
89+
8690
template <typename visitort>
8791
void accept(const smt_sortt &sort, const irep_idt &id, visitort &&visitor)
8892
{

src/solvers/smt2_incremental/ast/smt_sorts.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
SORT_ID(bool)
1010
SORT_ID(bit_vector)
1111
SORT_ID(array)
12+
SORT_ID(int)

src/solvers/smt2_incremental/ast/smt_sorts.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ class smt_array_sortt final : public smt_sortt
9797
const smt_sortt &element_sort() const;
9898
};
9999

100+
class smt_int_sortt final : public smt_sortt
101+
{
102+
public:
103+
smt_int_sortt();
104+
};
105+
100106
class smt_sort_const_downcast_visitort
101107
{
102108
public:

src/solvers/smt2_incremental/ast/smt_terms.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,24 @@ const smt_bit_vector_sortt &smt_bit_vector_constant_termt::get_sort() const
125125
return static_cast<const smt_bit_vector_sortt &>(smt_termt::get_sort());
126126
}
127127

128+
smt_int_constant_termt::smt_int_constant_termt(const mp_integer &value)
129+
: smt_termt{ID_smt_int_constant_term, smt_int_sortt{}}
130+
{
131+
set(ID_value, integer2string(value));
132+
}
133+
134+
mp_integer smt_int_constant_termt::value() const
135+
{
136+
return string2integer(get_string(ID_value));
137+
}
138+
139+
const smt_int_sortt &smt_int_constant_termt::get_sort() const
140+
{
141+
// The below cast is sound because the constructor only allows int
142+
// sorts to be set.
143+
return static_cast<const smt_int_sortt &>(smt_termt::get_sort());
144+
}
145+
128146
smt_function_application_termt::smt_function_application_termt(
129147
smt_identifier_termt function_identifier,
130148
std::vector<smt_termt> arguments)

src/solvers/smt2_incremental/ast/smt_terms.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
TERM_ID(bool_literal)
1010
TERM_ID(identifier)
1111
TERM_ID(bit_vector_constant)
12+
TERM_ID(int_constant)
1213
TERM_ID(function_application)
1314
TERM_ID(forall)
1415
TERM_ID(exists)

src/solvers/smt2_incremental/ast/smt_terms.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,17 @@ class smt_bit_vector_constant_termt : public smt_termt
129129
const smt_bit_vector_sortt &get_sort() const;
130130
};
131131

132+
class smt_int_constant_termt : public smt_termt
133+
{
134+
public:
135+
smt_int_constant_termt(const mp_integer &value);
136+
mp_integer value() const;
137+
138+
// This deliberately hides smt_termt::get_sort, because int terms
139+
// always have int sorts.
140+
const smt_int_sortt &get_sort() const;
141+
};
142+
132143
class smt_function_application_termt : public smt_termt
133144
{
134145
private:

src/solvers/smt2_incremental/construct_value_expr_from_smt.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <util/arith_tools.h>
44
#include <util/c_types.h>
5+
#include <util/mathematical_types.h>
56
#include <util/namespace.h>
67
#include <util/pointer_expr.h>
78
#include <util/std_expr.h>
@@ -97,6 +98,23 @@ class value_expr_from_smt_factoryt : public smt_term_const_downcast_visitort
9798
type_to_construct.pretty());
9899
}
99100

101+
void visit(const smt_int_constant_termt &int_constant) override
102+
{
103+
if(
104+
const auto integer_type =
105+
type_try_dynamic_cast<integer_typet>(type_to_construct))
106+
{
107+
result = from_integer(int_constant.value(), type_to_construct);
108+
return;
109+
}
110+
111+
INVARIANT(
112+
false,
113+
"construct_value_expr_from_smt for integer should not be applied to "
114+
"unsupported type " +
115+
type_to_construct.pretty());
116+
}
117+
100118
void
101119
visit(const smt_function_application_termt &function_application) override
102120
{

0 commit comments

Comments
 (0)