@@ -451,7 +451,6 @@ namespace smtfd {
451
451
ast_manager& m;
452
452
smtfd_abs& m_abs;
453
453
plugin_context& m_context;
454
- model_ref m_model;
455
454
expr_ref_vector m_values;
456
455
ast_ref_vector m_pinned;
457
456
expr_ref_vector m_args, m_vargs;
@@ -586,7 +585,6 @@ namespace smtfd {
586
585
m_tables.reset ();
587
586
m_ast2table.reset ();
588
587
m_values.reset ();
589
- m_model = nullptr ;
590
588
}
591
589
};
592
590
@@ -696,7 +694,7 @@ namespace smtfd {
696
694
bool sort_covered (sort* s) override { return m.is_bool (s); }
697
695
unsigned max_rounds () override { return 0 ; }
698
696
void populate_model (model_ref& mdl, expr_ref_vector const & core) override { }
699
- expr_ref model_value_core (expr* t) override { return m.is_bool (t) ? (*m_model )(m_abs.abs (t)) : expr_ref (m); }
697
+ expr_ref model_value_core (expr* t) override { return m.is_bool (t) ? m_context. get_model ( )(m_abs.abs (t)) : expr_ref (m); }
700
698
expr_ref model_value_core (sort* s) override { return m.is_bool (s) ? expr_ref (m.mk_false (), m) : expr_ref (m); }
701
699
};
702
700
@@ -1010,6 +1008,9 @@ namespace smtfd {
1010
1008
if (m_context.at_max ()) {
1011
1009
break ;
1012
1010
}
1011
+ if (m.get_sort (t) != m.get_sort (fA .m_t ->get_arg (0 ))) {
1012
+ continue ;
1013
+ }
1013
1014
if (!tT.find (fA , fT ) || (value_of (fA ) != value_of (fT ) && !eq (m_vargs, fA ))) {
1014
1015
TRACE (" smtfd" , tout << " found: " << tT.find (fA , fT ) << " \n " ;);
1015
1016
add_select_store_axiom (t, fA );
@@ -1023,7 +1024,7 @@ namespace smtfd {
1023
1024
if (m_context.at_max ()) {
1024
1025
break ;
1025
1026
}
1026
- if (!tA.find (fT , fA )) {
1027
+ if (!tA.find (fT , fA ) && m. get_sort (t) == m. get_sort ( fT . m_t -> get_arg ( 0 )) ) {
1027
1028
TRACE (" smtfd" , tout << " not found\n " ;);
1028
1029
add_select_store_axiom (t, fT );
1029
1030
++r;
@@ -1044,6 +1045,8 @@ namespace smtfd {
1044
1045
for (expr* arg : *f.m_t ) {
1045
1046
m_args.push_back (arg);
1046
1047
}
1048
+ SASSERT (m.get_sort (t) == m.get_sort (a));
1049
+ TRACE (" smtfd" , tout << mk_bounded_pp (t, m, 2 ) << " " << mk_bounded_pp (f.m_t , m, 2 ) << " \n " ;);
1047
1050
expr_ref eq = mk_eq_idxs (t, f.m_t );
1048
1051
m_args[0 ] = t;
1049
1052
expr_ref sel1 (m_autil.mk_select (m_args), m);
@@ -1349,14 +1352,17 @@ namespace smtfd {
1349
1352
if (!m_model->eval_expr (q->get_expr (), tmp, true )) {
1350
1353
return l_undef;
1351
1354
}
1355
+ if (m.is_true (tmp)) {
1356
+ return l_false;
1357
+ }
1352
1358
1353
1359
m_solver->push ();
1354
1360
expr_ref_vector vars (m), vals (m);
1355
1361
vars.resize (sz, nullptr );
1356
1362
vals.resize (sz, nullptr );
1357
1363
for (unsigned i = 0 ; i < sz; ++i) {
1358
1364
sort* s = q->get_decl_sort (i);
1359
- vars[i] = m.mk_fresh_const (q->get_decl_name (i), s);
1365
+ vars[i] = m.mk_fresh_const (q->get_decl_name (i), s, false );
1360
1366
if (m_model->has_uninterpreted_sort (s)) {
1361
1367
restrict_to_universe (vars.get (i), m_model->get_universe (s));
1362
1368
}
@@ -1381,6 +1387,7 @@ namespace smtfd {
1381
1387
}
1382
1388
}
1383
1389
m_solver->get_model (mdl);
1390
+ IF_VERBOSE (1 , verbose_stream () << *mdl << " \n " );
1384
1391
for (unsigned i = 0 ; i < sz; ++i) {
1385
1392
app* v = to_app (vars.get (i));
1386
1393
func_decl* f = v->get_decl ();
@@ -1389,6 +1396,7 @@ namespace smtfd {
1389
1396
r = l_undef;
1390
1397
break ;
1391
1398
}
1399
+
1392
1400
expr* t = nullptr ;
1393
1401
if (m_val2term.find (val, t)) {
1394
1402
val = t;
@@ -1397,6 +1405,7 @@ namespace smtfd {
1397
1405
}
1398
1406
if (r == l_true) {
1399
1407
body = subst (q->get_expr (), vals.size (), vals.c_ptr ());
1408
+ m_context.rewrite (body);
1400
1409
if (is_forall (q)) {
1401
1410
body = m.mk_implies (q, body);
1402
1411
}
@@ -1458,6 +1467,10 @@ namespace smtfd {
1458
1467
bool check_quantifiers (expr_ref_vector const & core) {
1459
1468
bool result = true ;
1460
1469
init_val2term (core);
1470
+ IF_VERBOSE (1 ,
1471
+ for (expr* c : core) {
1472
+ verbose_stream () << " core: " << mk_bounded_pp (c, m, 2 ) << " \n " ;
1473
+ });
1461
1474
for (expr* c : core) {
1462
1475
lbool r = l_false;
1463
1476
if (is_forall (c)) {
@@ -1548,6 +1561,8 @@ namespace smtfd {
1548
1561
tout << mk_bounded_pp (assumptions[i], m, 3 ) << " \n " ;
1549
1562
}
1550
1563
display (tout << asms << " \n " ););
1564
+ TRACE (" smtfd_verbose" , m_fd_sat_solver->display (tout););
1565
+
1551
1566
SASSERT (asms.contains (m_toggle));
1552
1567
m_fd_sat_solver->assert_expr (m_toggle);
1553
1568
lbool r = m_fd_sat_solver->check_sat (asms);
@@ -1653,10 +1668,12 @@ namespace smtfd {
1653
1668
return l_false;
1654
1669
}
1655
1670
for (expr* f : m_context) {
1656
- IF_VERBOSE (10 , verbose_stream () << " lemma: " << expr_ref (f, m) << " \n " );
1657
- assert_fd (f);
1671
+ IF_VERBOSE (10 , verbose_stream () << " lemma: " << f-> get_id () << " : " << expr_ref (f, m) << " \n " );
1672
+ assert_expr_core (f);
1658
1673
}
1674
+ flush_assertions ();
1659
1675
m_stats.m_num_mbqi += m_context.size ();
1676
+ IF_VERBOSE (10 , verbose_stream () << " context size: " << m_context.size () << " \n " );
1660
1677
return m_context.empty () ? is_decided : l_undef;
1661
1678
}
1662
1679
@@ -1887,6 +1904,7 @@ namespace smtfd {
1887
1904
case l_undef:
1888
1905
break ;
1889
1906
case l_false:
1907
+ break ;
1890
1908
r = check_smt (core);
1891
1909
switch (r) {
1892
1910
case l_true:
0 commit comments