cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
functions.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module:
4
5
Author: Daniel Kroening, kroening@kroening.com
6
7
\*******************************************************************/
8
9
#include "
functions.h
"
10
11
#include <
util/std_expr.h
>
12
13
#include <
solvers/decision_procedure.h
>
14
15
void
functionst::record
(
const
function_application_exprt
&function_application)
16
{
17
function_map
[function_application.
function
()].applications.insert(
18
function_application);
19
}
20
21
void
functionst::add_function_constraints
()
22
{
23
for
(
const
auto
&function :
function_map
)
24
add_function_constraints
(function.second);
25
}
26
27
exprt
functionst::arguments_equal
(
28
const
exprt::operandst
&o1,
29
const
exprt::operandst
&o2)
30
{
31
PRECONDITION
(o1.size() == o2.size());
32
33
exprt::operandst
conjuncts;
34
conjuncts.reserve(o1.size());
35
36
for
(std::size_t i = 0; i < o1.size(); i++)
37
{
38
exprt
lhs = o1[i];
39
exprt
rhs =
typecast_exprt::conditional_cast
(o2[i], o1[i].type());
40
conjuncts.push_back(
equal_exprt
(lhs, rhs));
41
}
42
43
return
conjunction
(conjuncts);
44
}
45
46
void
functionst::add_function_constraints
(
const
function_infot
&info)
47
{
48
// Do Ackermann's function reduction.
49
// This is quadratic, slow, and needs to be modernized.
50
51
for
(std::set<function_application_exprt>::const_iterator it1 =
52
info.
applications
.begin();
53
it1 != info.
applications
.end();
54
it1++)
55
{
56
for
(std::set<function_application_exprt>::const_iterator it2 =
57
info.
applications
.begin();
58
it2 != it1;
59
it2++)
60
{
61
exprt
arguments_equal_expr =
62
arguments_equal
(it1->arguments(), it2->arguments());
63
64
implies_exprt
implication
(arguments_equal_expr,
equal_exprt
(*it1, *it2));
65
66
decision_procedure
.set_to_true(
implication
);
67
}
68
}
69
}
equal_exprt
Equality.
Definition
std_expr.h:1329
exprt
Base class for all expressions.
Definition
expr.h:57
exprt::operandst
std::vector< exprt > operandst
Definition
expr.h:59
function_application_exprt
Application of (mathematical) function.
Definition
mathematical_expr.h:213
function_application_exprt::function
exprt & function()
Definition
mathematical_expr.h:221
functionst::function_map
function_mapt function_map
Definition
functions.h:52
functionst::add_function_constraints
virtual void add_function_constraints()
Definition
functions.cpp:21
functionst::arguments_equal
exprt arguments_equal(const exprt::operandst &o1, const exprt::operandst &o2)
Definition
functions.cpp:27
functionst::record
void record(const function_application_exprt &function_application)
Definition
functions.cpp:15
functionst::decision_procedure
decision_proceduret & decision_procedure
Definition
functions.h:42
implies_exprt
Boolean implication.
Definition
std_expr.h:2144
typecast_exprt::conditional_cast
static exprt conditional_cast(const exprt &expr, const typet &type)
Definition
std_expr.h:1993
decision_procedure.h
Decision Procedure Interface.
functions.h
Uninterpreted Functions.
implication
static exprt implication(exprt lhs, exprt rhs)
Definition
goto_check_c.cpp:421
PRECONDITION
#define PRECONDITION(CONDITION)
Definition
invariant.h:463
conjunction
exprt conjunction(exprt a, exprt b)
Conjunction of two expressions.
Definition
std_expr.cpp:252
std_expr.h
API to expression classes.
functionst::function_infot
Definition
functions.h:47
functionst::function_infot::applications
applicationst applications
Definition
functions.h:48
solvers
lowering
functions.cpp
Generated by
1.17.0