Make model builder robust to multiple value-like terms in the same equivalence class...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 24 Feb 2022 23:33:23 +0000 (17:33 -0600)
committerGitHub <noreply@github.com>
Thu, 24 Feb 2022 23:33:23 +0000 (23:33 +0000)
commitc7e68b150858560656ee2fd557cd8358842b03c9
tree9b3a78763db30b37f0ff84762047c53f63e6a97b
parent2481c6194dc1d9d35562cbf18fdfc572961997d6
Make model builder robust to multiple value-like terms in the same equivalence class (#8150)

This changes our policy on handling when two value-like terms are in the same equivalence class. We now give preference to the "base" model value, and either warn or throw a debug exception.

After f7675b2, we can have the situation where e.g. (seq.nth seq.empty 1) is in the same equivalence class as a constant, where (seq.nth seq.empty 1) is considered value-like, despite being unevaluatable. We now ensure that the constant is taken as the representative of the equivalence class, and not this term.

It also removes assignable terms from consideration when assigning values to equivalence classes. In particular, (seq.nth seq.empty 1) is skipped, so a warning is not even given when the above occurs.

Fixes #8148.
src/theory/theory_model_builder.cpp
test/regress/CMakeLists.txt
test/regress/regress1/seq/issue8148-2-const-mv.smt2 [new file with mode: 0644]
test/regress/regress1/seq/issue8148-const-mv.smt2 [new file with mode: 0644]