cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
equality.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 "
equality.h
"
10
11
#ifdef DEBUG
12
#include <iostream>
13
#endif
14
15
#include "
bv_utils.h
"
16
17
literalt
equalityt::equality
(
const
exprt
&e1,
const
exprt
&e2)
18
{
19
if
(e1<e2)
20
return
equality2
(e1, e2);
21
else
22
return
equality2
(e2, e1);
23
}
24
25
literalt
equalityt::equality2
(
const
exprt
&e1,
const
exprt
&e2)
26
{
27
PRECONDITION
(e1.
type
() == e2.
type
());
28
29
const
typet
&type = e1.
type
();
30
31
// check for syntactical equality
32
33
if
(e1==e2)
34
return
const_literal
(
true
);
35
36
// check for boolean equality
37
38
INVARIANT
(
39
type.
id
() != ID_bool,
"method shall not be used to compare Boolean types"
);
40
41
// look it up
42
43
typestructt
&typestruct=
typemap
[type];
44
elementst
&elements=typestruct.
elements
;
45
elements_revt
&elements_rev=typestruct.
elements_rev
;
46
equalitiest
&equalities=typestruct.
equalities
;
47
48
std::pair<unsigned, unsigned> u;
49
50
{
51
std::pair<elementst::iterator, bool> result=
52
elements.insert(std::pair<exprt, unsigned>(e1, elements.size()));
53
54
u.first=result.first->second;
55
56
if
(result.second)
57
elements_rev[u.first]=e1;
58
}
59
60
{
61
std::pair<elementst::iterator, bool> result=
62
elements.insert(elementst::value_type(e2, elements.size()));
63
64
u.second=result.first->second;
65
66
if
(result.second)
67
elements_rev[u.second]=e2;
68
}
69
70
literalt
l;
71
72
{
73
equalitiest::const_iterator result=equalities.find(u);
74
75
if
(result==equalities.end())
76
{
77
l=
prop
.new_variable();
78
if
(
freeze_all
&& !l.
is_constant
())
79
prop
.set_frozen(l);
80
equalities.insert(equalitiest::value_type(u, l));
81
}
82
else
83
l=result->second;
84
}
85
86
return
l;
87
}
88
89
void
equalityt::add_equality_constraints
()
90
{
91
for
(typemapt::const_iterator it=
typemap
.begin();
92
it!=
typemap
.end(); it++)
93
add_equality_constraints
(it->second);
94
}
95
96
void
equalityt::add_equality_constraints
(
const
typestructt
&typestruct)
97
{
98
std::size_t no_elements=typestruct.
elements
.size();
99
std::size_t
bits
=0;
100
101
// get number of necessary bits
102
103
for
(std::size_t i=no_elements; i!=0;
bits
++)
104
i=(i>>1);
105
106
// generate bit vectors
107
108
std::vector<bvt> eq_bvs;
109
110
eq_bvs.resize(no_elements);
111
112
for
(std::size_t i=0; i<no_elements; i++)
113
eq_bvs[i] =
prop
.new_variables(
bits
);
114
115
// generate equality constraints
116
117
bv_utilst
bv_utils(
prop
);
118
119
for
(equalitiest::const_iterator
120
it=typestruct.
equalities
.begin();
121
it!=typestruct.
equalities
.end();
122
it++)
123
{
124
const
bvt
&bv1=eq_bvs[it->first.first];
125
const
bvt
&bv2=eq_bvs[it->first.second];
126
127
prop
.set_equal(bv_utils.
equal
(bv1, bv2), it->second);
128
}
129
}
bv_utils.h
bv_utilst
Definition
bv_utils.h:24
bv_utilst::equal
literalt equal(const bvt &op0, const bvt &op1)
Bit-blasting ID_equal and use in other encodings.
Definition
bv_utils.cpp:1370
equalityt::equalitiest
std::map< std::pair< unsigned, unsigned >, literalt > equalitiest
Definition
equality.h:40
equalityt::elementst
std::unordered_map< const exprt, unsigned, irep_hash > elementst
Definition
equality.h:39
equalityt::add_equality_constraints
virtual void add_equality_constraints()
Definition
equality.cpp:89
equalityt::typemap
typemapt typemap
Definition
equality.h:52
equalityt::elements_revt
std::map< unsigned, exprt > elements_revt
Definition
equality.h:41
equalityt::equality2
virtual literalt equality2(const exprt &e1, const exprt &e2)
Definition
equality.cpp:25
equalityt::equality
virtual literalt equality(const exprt &e1, const exprt &e2)
Definition
equality.cpp:17
exprt
Base class for all expressions.
Definition
expr.h:57
exprt::type
typet & type()
Return the type of the expression.
Definition
expr.h:85
irept::id
const irep_idt & id() const
Definition
irep.h:388
literalt
Definition
literal.h:26
literalt::is_constant
bool is_constant() const
Definition
literal.h:166
prop_conv_solvert::freeze_all
bool freeze_all
Definition
prop_conv_solver.h:76
prop_conv_solvert::prop
propt & prop
Definition
prop_conv_solver.h:130
typet
The type of an expression, extends irept.
Definition
type.h:29
equality.h
bvt
std::vector< literalt > bvt
Definition
literal.h:201
const_literal
literalt const_literal(bool value)
Definition
literal.h:188
bits
const std::size_t sharing_mapt< keyT, valueT, fail_if_equal, hashT, equalT >::bits
Definition
sharing_map.h:1467
PRECONDITION
#define PRECONDITION(CONDITION)
Definition
invariant.h:463
INVARIANT
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
Definition
invariant.h:423
equalityt::typestructt
Definition
equality.h:44
equalityt::typestructt::elements_rev
elements_revt elements_rev
Definition
equality.h:46
equalityt::typestructt::elements
elementst elements
Definition
equality.h:45
equalityt::typestructt::equalities
equalitiest equalities
Definition
equality.h:47
solvers
flattening
equality.cpp
Generated by
1.17.0