@@ -27,6 +27,8 @@ datatype_factory::datatype_factory(ast_manager & m, model_core & md):
2727}
2828
2929expr * datatype_factory::get_some_value (sort * s) {
30+ if (!m_util.is_datatype (s))
31+ return m_model.get_some_value (s);
3032 value_set * set = nullptr ;
3133 if (m_sort2value_set.find (s, set) && !set->empty ())
3234 return *(set->begin ());
@@ -77,6 +79,8 @@ bool datatype_factory::is_subterm_of_last_value(app* e) {
7779 It also updates m_last_fresh_value
7880*/
7981expr * datatype_factory::get_almost_fresh_value (sort * s) {
82+ if (!m_util.is_datatype (s))
83+ return m_model.get_some_value (s);
8084 value_set * set = get_value_set (s);
8185 if (set->empty ()) {
8286 expr * val = get_some_value (s);
@@ -136,6 +140,8 @@ expr * datatype_factory::get_almost_fresh_value(sort * s) {
136140
137141
138142expr * datatype_factory::get_fresh_value (sort * s) {
143+ if (!m_util.is_datatype (s))
144+ return m_model.get_fresh_value (s);
139145 TRACE (" datatype" , tout << " generating fresh value for: " << s->get_name () << " \n " ;);
140146 value_set * set = get_value_set (s);
141147 // Approach 0)
@@ -162,7 +168,9 @@ expr * datatype_factory::get_fresh_value(sort * s) {
162168 unsigned num = constructor->get_arity ();
163169 for (unsigned i = 0 ; i < num; i++) {
164170 sort * s_arg = constructor->get_domain (i);
165- if (!found_fresh_arg && (!m_util.is_recursive (s) || !m_util.is_datatype (s_arg) || !m_util.are_siblings (s, s_arg))) {
171+ if (!found_fresh_arg &&
172+ !m_util.is_recursive_array (s_arg) &&
173+ (!m_util.is_recursive (s) || !m_util.is_datatype (s_arg) || !m_util.are_siblings (s, s_arg))) {
166174 expr * new_arg = m_model.get_fresh_value (s_arg);
167175 if (new_arg != nullptr ) {
168176 found_fresh_arg = true ;
@@ -191,7 +199,7 @@ expr * datatype_factory::get_fresh_value(sort * s) {
191199 // search for constructor...
192200 unsigned num_iterations = 0 ;
193201 if (m_util.is_recursive (s)) {
194- while (true ) {
202+ while (true ) {
195203 ++num_iterations;
196204 TRACE (" datatype" , tout << mk_pp (get_last_fresh_value (s), m_manager) << " \n " ;);
197205 ptr_vector<func_decl> const & constructors = *m_util.get_datatype_constructors (s);
@@ -207,15 +215,15 @@ expr * datatype_factory::get_fresh_value(sort * s) {
207215 << m_util.are_siblings (s, s_arg) << " is_datatype "
208216 << m_util.is_datatype (s_arg) << " found_sibling "
209217 << found_sibling << " \n " ;);
210- if (!found_sibling && m_util.is_datatype (s_arg) && m_util. are_siblings (s, s_arg)) {
218+ if (!found_sibling && m_util.are_siblings (s, s_arg)) {
211219 found_sibling = true ;
212220 expr * maybe_new_arg = nullptr ;
213- if (num_iterations <= 1 ) {
214- maybe_new_arg = get_almost_fresh_value (s_arg);
215- }
216- else {
221+ if (!m_util.is_datatype (s_arg))
222+ maybe_new_arg = m_model.get_fresh_value (s_arg);
223+ else if (num_iterations <= 1 )
224+ maybe_new_arg = get_almost_fresh_value (s_arg);
225+ else
217226 maybe_new_arg = get_fresh_value (s_arg);
218- }
219227 if (!maybe_new_arg) {
220228 TRACE (" datatype" ,
221229 tout << " no argument found for " << mk_pp (s_arg, m_manager) << " \n " ;);
0 commit comments