Skip to content

Commit ac60269

Browse files
Merge branch 'master' into fix-static-linking
2 parents 7eb6731 + c181f89 commit ac60269

13 files changed

+386
-416
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@ To clean Z3 you can delete the build directory and run the ``mk_make.py`` script
9797

9898
## Building Z3 using CMake
9999

100-
Z3 has an unofficial build system using CMake. Read the [README-CMake.md](README-CMake.md)
101-
file for details.
100+
Z3 has a build system using CMake. Read the [README-CMake.md](README-CMake.md)
101+
file for details. It is recommended for most build tasks,
102+
except for building OCaml bindings.
102103

103104
## Z3 bindings
104105

src/smt/asserted_formulas.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Revision History:
2525
#include "ast/normal_forms/nnf.h"
2626
#include "ast/pattern/pattern_inference.h"
2727
#include "ast/macros/quasi_macros.h"
28+
#include "ast/occurs.h"
2829
#include "smt/asserted_formulas.h"
2930

3031
asserted_formulas::asserted_formulas(ast_manager & m, smt_params & sp, params_ref const& p):
@@ -133,7 +134,7 @@ void asserted_formulas::set_eliminate_and(bool flag) {
133134
m_params.set_bool("eq2ineq", m_smt_params.m_arith_eq2ineq);
134135
m_params.set_bool("gcd_rounding", true);
135136
m_params.set_bool("expand_select_store", true);
136-
m_params.set_bool("expand_nested_stores", true);
137+
//m_params.set_bool("expand_nested_stores", true);
137138
m_params.set_bool("bv_sort_ac", true);
138139
m_params.set_bool("som", true);
139140
m_rewriter.updt_params(m_params);

src/smt/dyn_ack.cpp

Lines changed: 55 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ namespace smt {
105105

106106
dyn_ack_manager::dyn_ack_manager(context & ctx, dyn_ack_params & p):
107107
m_context(ctx),
108-
m_manager(ctx.get_manager()),
108+
m(ctx.get_manager()),
109109
m_params(p) {
110110
}
111111

@@ -115,12 +115,9 @@ namespace smt {
115115
}
116116

117117
void dyn_ack_manager::reset_app_pairs() {
118-
svector<app_pair>::iterator it = m_app_pairs.begin();
119-
svector<app_pair>::iterator end = m_app_pairs.end();
120-
for (; it != end; ++it) {
121-
app_pair & p = *it;
122-
m_manager.dec_ref(p.first);
123-
m_manager.dec_ref(p.second);
118+
for (app_pair& p : m_app_pairs) {
119+
m.dec_ref(p.first);
120+
m.dec_ref(p.second);
124121
}
125122
m_app_pairs.reset();
126123
}
@@ -144,22 +141,24 @@ namespace smt {
144141
SASSERT(n1->get_decl() == n2->get_decl());
145142
SASSERT(n1->get_num_args() == n2->get_num_args());
146143
SASSERT(n1 != n2);
147-
if (m_manager.is_eq(n1))
144+
if (m.is_eq(n1)) {
148145
return;
146+
}
149147
if (n1->get_id() > n2->get_id())
150148
std::swap(n1,n2);
151149
app_pair p(n1, n2);
152-
if (m_instantiated.contains(p))
150+
if (m_instantiated.contains(p)) {
153151
return;
152+
}
154153
unsigned num_occs = 0;
155154
if (m_app_pair2num_occs.find(n1, n2, num_occs)) {
156-
TRACE("dyn_ack", tout << "used_cg_eh:\n" << mk_pp(n1, m_manager) << "\n" << mk_pp(n2, m_manager) << "\nnum_occs: " << num_occs << "\n";);
155+
TRACE("dyn_ack", tout << "used_cg_eh:\n" << mk_pp(n1, m) << "\n" << mk_pp(n2, m) << "\nnum_occs: " << num_occs << "\n";);
157156
num_occs++;
158157
}
159158
else {
160159
num_occs = 1;
161-
m_manager.inc_ref(n1);
162-
m_manager.inc_ref(n2);
160+
m.inc_ref(n1);
161+
m.inc_ref(n2);
163162
m_app_pairs.push_back(p);
164163
}
165164
SASSERT(num_occs > 0);
@@ -169,34 +168,35 @@ namespace smt {
169168
SASSERT(m_app_pair2num_occs.find(n1, n2, num_occs2) && num_occs == num_occs2);
170169
#endif
171170
if (num_occs == m_params.m_dack_threshold) {
172-
TRACE("dyn_ack", tout << "found candidate:\n" << mk_pp(n1, m_manager) << "\n" << mk_pp(n2, m_manager) << "\nnum_occs: " << num_occs << "\n";);
171+
TRACE("dyn_ack", tout << "found candidate:\n" << mk_pp(n1, m) << "\n" << mk_pp(n2, m) << "\nnum_occs: " << num_occs << "\n";);
173172
m_to_instantiate.push_back(p);
174173
}
175174
}
176175

177176
void dyn_ack_manager::eq_eh(app * n1, app * n2, app* r) {
178-
if (n1 == n2 || r == n1 || r == n2 || m_manager.is_bool(n1)) {
177+
if (n1 == n2 || r == n1 || r == n2 || m.is_bool(n1)) {
179178
return;
180179
}
181180
if (n1->get_id() > n2->get_id())
182181
std::swap(n1,n2);
183182
TRACE("dyn_ack",
184-
tout << mk_pp(n1, m_manager) << " = " << mk_pp(n2, m_manager)
185-
<< " = " << mk_pp(r, m_manager) << "\n";);
183+
tout << mk_pp(n1, m) << " = " << mk_pp(n2, m)
184+
<< " = " << mk_pp(r, m) << "\n";);
186185
app_triple tr(n1, n2, r);
187-
if (m_triple.m_instantiated.contains(tr))
186+
if (m_triple.m_instantiated.contains(tr)) {
188187
return;
188+
}
189189
unsigned num_occs = 0;
190190
if (m_triple.m_app2num_occs.find(n1, n2, r, num_occs)) {
191-
TRACE("dyn_ack", tout << mk_pp(n1, m_manager) << "\n" << mk_pp(n2, m_manager)
192-
<< mk_pp(r, m_manager) << "\n" << "\nnum_occs: " << num_occs << "\n";);
191+
TRACE("dyn_ack", tout << mk_pp(n1, m) << "\n" << mk_pp(n2, m)
192+
<< mk_pp(r, m) << "\n" << "\nnum_occs: " << num_occs << "\n";);
193193
num_occs++;
194194
}
195195
else {
196196
num_occs = 1;
197-
m_manager.inc_ref(n1);
198-
m_manager.inc_ref(n2);
199-
m_manager.inc_ref(r);
197+
m.inc_ref(n1);
198+
m.inc_ref(n2);
199+
m.inc_ref(r);
200200
m_triple.m_apps.push_back(tr);
201201
}
202202
SASSERT(num_occs > 0);
@@ -206,8 +206,8 @@ namespace smt {
206206
SASSERT(m_triple.m_app2num_occs.find(n1, n2, r, num_occs2) && num_occs == num_occs2);
207207
#endif
208208
if (num_occs == m_params.m_dack_threshold) {
209-
TRACE("dyn_ack", tout << "found candidate:\n" << mk_pp(n1, m_manager) << "\n" << mk_pp(n2, m_manager)
210-
<< "\n" << mk_pp(r, m_manager)
209+
TRACE("dyn_ack", tout << "found candidate:\n" << mk_pp(n1, m) << "\n" << mk_pp(n2, m)
210+
<< "\n" << mk_pp(r, m)
211211
<< "\nnum_occs: " << num_occs << "\n";);
212212
m_triple.m_to_instantiate.push_back(tr);
213213
}
@@ -245,9 +245,9 @@ namespace smt {
245245
for (; it != end; ++it) {
246246
app_pair & p = *it;
247247
if (m_instantiated.contains(p)) {
248-
TRACE("dyn_ack", tout << "1) erasing:\n" << mk_pp(p.first, m_manager) << "\n" << mk_pp(p.second, m_manager) << "\n";);
249-
m_manager.dec_ref(p.first);
250-
m_manager.dec_ref(p.second);
248+
TRACE("dyn_ack", tout << "1) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
249+
m.dec_ref(p.first);
250+
m.dec_ref(p.second);
251251
SASSERT(!m_app_pair2num_occs.contains(p.first, p.second));
252252
continue;
253253
}
@@ -261,10 +261,10 @@ namespace smt {
261261
num_occs = static_cast<unsigned>(num_occs * m_params.m_dack_gc_inv_decay);
262262
if (num_occs <= 1) {
263263
num_deleted++;
264-
TRACE("dyn_ack", tout << "2) erasing:\n" << mk_pp(p.first, m_manager) << "\n" << mk_pp(p.second, m_manager) << "\n";);
264+
TRACE("dyn_ack", tout << "2) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
265265
m_app_pair2num_occs.erase(p.first, p.second);
266-
m_manager.dec_ref(p.first);
267-
m_manager.dec_ref(p.second);
266+
m.dec_ref(p.first);
267+
m.dec_ref(p.second);
268268
continue;
269269
}
270270
*it2 = p;
@@ -283,20 +283,19 @@ namespace smt {
283283
}
284284

285285
class dyn_ack_clause_del_eh : public clause_del_eh {
286-
dyn_ack_manager & m_manager;
286+
dyn_ack_manager & m;
287287
public:
288288
dyn_ack_clause_del_eh(dyn_ack_manager & m):
289-
m_manager(m) {
289+
m(m) {
290290
}
291291
~dyn_ack_clause_del_eh() override {}
292-
void operator()(ast_manager & m, clause * cls) override {
293-
m_manager.del_clause_eh(cls);
292+
void operator()(ast_manager & _m, clause * cls) override {
293+
m.del_clause_eh(cls);
294294
dealloc(this);
295295
}
296296
};
297297

298298
void dyn_ack_manager::del_clause_eh(clause * cls) {
299-
TRACE("dyn_ack", tout << "del_clause_eh: "; m_context.display_clause(tout, cls); tout << "\n";);
300299
m_context.m_stats.m_num_del_dyn_ack++;
301300

302301
app_pair p((app*)nullptr,(app*)nullptr);
@@ -342,7 +341,7 @@ namespace smt {
342341
app * eq = m_context.mk_eq_atom(n1, n2);
343342
m_context.internalize(eq, true);
344343
literal l = m_context.get_literal(eq);
345-
TRACE("dyn_ack", tout << "eq:\n" << mk_pp(eq, m_manager) << "\nliteral: ";
344+
TRACE("dyn_ack", tout << "eq:\n" << mk_pp(eq, m) << "\nliteral: ";
346345
m_context.display_literal(tout, l); tout << "\n";);
347346
return l;
348347
}
@@ -354,7 +353,7 @@ namespace smt {
354353
SASSERT(n1 != n2);
355354
m_context.m_stats.m_num_dyn_ack++;
356355
TRACE("dyn_ack_inst", tout << "dyn_ack: " << n1->get_id() << " " << n2->get_id() << "\n";);
357-
TRACE("dyn_ack", tout << "expanding Ackermann's rule for:\n" << mk_pp(n1, m_manager) << "\n" << mk_pp(n2, m_manager) << "\n";);
356+
TRACE("dyn_ack", tout << "expanding Ackermann's rule for:\n" << mk_pp(n1, m) << "\n" << mk_pp(n2, m) << "\n";);
358357
unsigned num_args = n1->get_num_args();
359358
literal_buffer lits;
360359
for (unsigned i = 0; i < num_args; i++) {
@@ -372,7 +371,7 @@ namespace smt {
372371
clause_del_eh * del_eh = alloc(dyn_ack_clause_del_eh, *this);
373372

374373
justification * js = nullptr;
375-
if (m_manager.proofs_enabled())
374+
if (m.proofs_enabled())
376375
js = alloc(dyn_ack_justification, n1, n2);
377376
clause * cls = m_context.mk_clause(lits.size(), lits.c_ptr(), js, CLS_TH_LEMMA, del_eh);
378377
if (!cls) {
@@ -392,13 +391,10 @@ namespace smt {
392391
}
393392

394393
void dyn_ack_manager::reset_app_triples() {
395-
svector<app_triple>::iterator it = m_triple.m_apps.begin();
396-
svector<app_triple>::iterator end = m_triple.m_apps.end();
397-
for (; it != end; ++it) {
398-
app_triple & p = *it;
399-
m_manager.dec_ref(p.first);
400-
m_manager.dec_ref(p.second);
401-
m_manager.dec_ref(p.third);
394+
for (app_triple& p : m_triple.m_apps) {
395+
m.dec_ref(p.first);
396+
m.dec_ref(p.second);
397+
m.dec_ref(p.third);
402398
}
403399
m_triple.m_apps.reset();
404400
}
@@ -408,9 +404,9 @@ namespace smt {
408404
SASSERT(n1 != n2 && n1 != r && n2 != r);
409405
m_context.m_stats.m_num_dyn_ack++;
410406
TRACE("dyn_ack_inst", tout << "dyn_ack: " << n1->get_id() << " " << n2->get_id() << " " << r->get_id() << "\n";);
411-
TRACE("dyn_ack", tout << "expanding Ackermann's rule for:\n" << mk_pp(n1, m_manager) << "\n"
412-
<< mk_pp(n2, m_manager) << "\n"
413-
<< mk_pp(r, m_manager) << "\n";
407+
TRACE("dyn_ack", tout << "expanding Ackermann's rule for:\n" << mk_pp(n1, m) << "\n"
408+
<< mk_pp(n2, m) << "\n"
409+
<< mk_pp(r, m) << "\n";
414410
);
415411
app_triple tr(n1, n2, r);
416412
SASSERT(m_triple.m_app2num_occs.contains(n1, n2, r));
@@ -424,7 +420,7 @@ namespace smt {
424420
clause_del_eh * del_eh = alloc(dyn_ack_clause_del_eh, *this);
425421

426422
justification * js = nullptr;
427-
if (m_manager.proofs_enabled())
423+
if (m.proofs_enabled())
428424
js = alloc(dyn_ack_justification, n1, n2);
429425
clause * cls = m_context.mk_clause(lits.size(), lits.c_ptr(), js, CLS_TH_LEMMA, del_eh);
430426
if (!cls) {
@@ -467,10 +463,10 @@ namespace smt {
467463
for (; it != end; ++it) {
468464
app_triple & p = *it;
469465
if (m_triple.m_instantiated.contains(p)) {
470-
TRACE("dyn_ack", tout << "1) erasing:\n" << mk_pp(p.first, m_manager) << "\n" << mk_pp(p.second, m_manager) << "\n";);
471-
m_manager.dec_ref(p.first);
472-
m_manager.dec_ref(p.second);
473-
m_manager.dec_ref(p.third);
466+
TRACE("dyn_ack", tout << "1) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
467+
m.dec_ref(p.first);
468+
m.dec_ref(p.second);
469+
m.dec_ref(p.third);
474470
SASSERT(!m_triple.m_app2num_occs.contains(p.first, p.second, p.third));
475471
continue;
476472
}
@@ -484,11 +480,11 @@ namespace smt {
484480
num_occs = static_cast<unsigned>(num_occs * m_params.m_dack_gc_inv_decay);
485481
if (num_occs <= 1) {
486482
num_deleted++;
487-
TRACE("dyn_ack", tout << "2) erasing:\n" << mk_pp(p.first, m_manager) << "\n" << mk_pp(p.second, m_manager) << "\n";);
483+
TRACE("dyn_ack", tout << "2) erasing:\n" << mk_pp(p.first, m) << "\n" << mk_pp(p.second, m) << "\n";);
488484
m_triple.m_app2num_occs.erase(p.first, p.second, p.third);
489-
m_manager.dec_ref(p.first);
490-
m_manager.dec_ref(p.second);
491-
m_manager.dec_ref(p.third);
485+
m.dec_ref(p.first);
486+
m.dec_ref(p.second);
487+
m.dec_ref(p.third);
492488
continue;
493489
}
494490
*it2 = p;
@@ -509,10 +505,8 @@ namespace smt {
509505

510506
#ifdef Z3DEBUG
511507
bool dyn_ack_manager::check_invariant() const {
512-
clause2app_pair::iterator it = m_clause2app_pair.begin();
513-
clause2app_pair::iterator end = m_clause2app_pair.end();
514-
for (; it != end; ++it) {
515-
app_pair const & p = it->get_value();
508+
for (auto const& kv : m_clause2app_pair) {
509+
app_pair const & p = kv.get_value();
516510
SASSERT(m_instantiated.contains(p));
517511
SASSERT(!m_app_pair2num_occs.contains(p.first, p.second));
518512
}

src/smt/dyn_ack.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace smt {
4444
typedef obj_map<clause, app_triple> clause2app_triple;
4545

4646
context & m_context;
47-
ast_manager & m_manager;
47+
ast_manager & m;
4848
dyn_ack_params & m_params;
4949
app_pair2num_occs m_app_pair2num_occs;
5050
app_pair_vector m_app_pairs;

src/smt/smt_clause.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ namespace smt {
123123
if (lit.sign()) args[args.size()-1] = m.mk_not(args.back());
124124
}
125125
expr_ref disj(m.mk_or(args.size(), args.c_ptr()), m);
126-
return out << disj;
126+
return out << mk_bounded_pp(disj, m, 3);
127127
}
128128

129129
};

src/smt/smt_conflict_resolution.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ Module Name:
1616
Revision History:
1717
1818
--*/
19-
#include "smt/smt_context.h"
20-
#include "smt/smt_conflict_resolution.h"
19+
2120
#include "ast/ast_pp.h"
2221
#include "ast/ast_ll_pp.h"
22+
#include "smt/smt_context.h"
23+
#include "smt/smt_conflict_resolution.h"
2324

2425
namespace smt {
2526

0 commit comments

Comments
 (0)