mirror of
https://github.com/Z3Prover/z3
synced 2025-06-27 00:18:45 +00:00
randomize generation of 'some value' for user sorts. #4557
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d91ca423ab
commit
655166b867
3 changed files with 14 additions and 2 deletions
|
@ -18,6 +18,7 @@ Revision History:
|
||||||
--*/
|
--*/
|
||||||
|
|
||||||
#include "model/value_factory.h"
|
#include "model/value_factory.h"
|
||||||
|
#include "ast/ast_pp.h"
|
||||||
|
|
||||||
value_factory::value_factory(ast_manager & m, family_id fid):
|
value_factory::value_factory(ast_manager & m, family_id fid):
|
||||||
m_manager(m),
|
m_manager(m),
|
||||||
|
@ -81,7 +82,17 @@ expr * user_sort_factory::get_some_value(sort * s) {
|
||||||
m_sort2value_set.find(s, set);
|
m_sort2value_set.find(s, set);
|
||||||
SASSERT(set != 0);
|
SASSERT(set != 0);
|
||||||
SASSERT(!set->m_values.empty());
|
SASSERT(!set->m_values.empty());
|
||||||
return *(set->m_values.begin());
|
unsigned nv = set->m_values.size();
|
||||||
|
random_gen rand(m_manager.get_num_asts());
|
||||||
|
unsigned n = 1;
|
||||||
|
expr* result = nullptr;
|
||||||
|
for (auto v : set->m_values) {
|
||||||
|
if (0 == (rand() % (n++)))
|
||||||
|
result = v;
|
||||||
|
if (n > 10)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
return simple_factory<unsigned>::get_some_value(s);
|
return simple_factory<unsigned>::get_some_value(s);
|
||||||
}
|
}
|
||||||
|
|
|
@ -359,6 +359,7 @@ namespace smt {
|
||||||
break;
|
break;
|
||||||
model_ref cex;
|
model_ref cex;
|
||||||
m_aux_context->get_model(cex);
|
m_aux_context->get_model(cex);
|
||||||
|
|
||||||
if (!add_instance(q, cex.get(), sks, true)) {
|
if (!add_instance(q, cex.get(), sks, true)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -958,7 +958,7 @@ namespace smt {
|
||||||
ptr_vector<node> need_fresh;
|
ptr_vector<node> need_fresh;
|
||||||
for (node * n : m_root_nodes) {
|
for (node * n : m_root_nodes) {
|
||||||
SASSERT(n->is_root());
|
SASSERT(n->is_root());
|
||||||
instantiation_set const * s = n->get_instantiation_set();
|
instantiation_set const * s = n->get_instantiation_set();
|
||||||
TRACE("model_finder", s->display(tout););
|
TRACE("model_finder", s->display(tout););
|
||||||
obj_map<expr, unsigned> const & elems = s->get_elems();
|
obj_map<expr, unsigned> const & elems = s->get_elems();
|
||||||
if (elems.empty()) {
|
if (elems.empty()) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue