n = itAssigner->second.getNextAssignment();
Assert(!n.isNull());
}
- else if (!t.isFinite())
+ else if (t.isSort() || !t.isInterpretedFinite())
{
- // if its infinite, we get a fresh value that does not occur in
- // the model.
+ // If its interpreted as infinite, we get a fresh value that does
+ // not occur in the model.
+ // Note we also consider uninterpreted sorts to be infinite here
+ // regardless of whether isInterpretedFinite is true (which is true
+ // for uninterpreted sorts iff finite model finding is enabled).
+ // This is required because the UF solver does not explicitly
+ // assign uninterpreted constants to equivalence classes in its
+ // collectModelValues method. Doing so would have the same effect
+ // as running the code in this case.
bool success;
do
{
regress1/fmf/issue3689.smt2
regress1/fmf/issue4068-si-qf.smt2
regress1/fmf/issue4225-univ-fun.smt2
+ regress1/fmf/issue5738-dt-interp-finite.smt2
regress1/fmf/issue916-fmf-or.smt2
regress1/fmf/jasmin-cdt-crash.smt2
regress1/fmf/ko-bound-set.cvc
--- /dev/null
+(set-logic UFLIA)
+(set-info :status sat)
+(set-option :finite-model-find true)
+(declare-sort a 0)
+(declare-sort b 0)
+(declare-datatypes ((c 0)) (((d (m b)))))
+(declare-sort d 0)
+(declare-sort e 0)
+(declare-datatypes ((f 0)) (((n))))
+(declare-fun o (f e d c) a)
+(declare-fun g (f) e)
+(declare-fun h (f d) c)
+(declare-fun i () f)
+(declare-fun j (e) d)
+(assert (forall ((k e)) (exists ((l c)) (= (o i k (j k) l) (o i (g i) (j k) (h i (j k)))))))
+(check-sat)