(proof-new) Fixes for theory preprocessing proofs (#5171)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 2 Oct 2020 21:15:16 +0000 (16:15 -0500)
committerGitHub <noreply@github.com>
Fri, 2 Oct 2020 21:15:16 +0000 (16:15 -0500)
commit51b9c07af2001e961911e59f3e7e80728c88550a
treebd3e2139979fc183474d3254ddc59df88934b75b
parent26601663d6cc8fb8613df5a1d253eba8743e57cb
(proof-new) Fixes for theory preprocessing proofs (#5171)

This fixes several subtle issues with theory preprocessing.

The main fix is to ensure proofs are correct for cases where the theory preprocessor applies either with or without theory preprocessing (calling Theory::ppRewrite on subterms) enabled, see argument doTheoryPreprocess of preprocess. If disabled, it applies term formula removal and rewriting only. This is required for processing lemmas that are marked as "do not preprocess", which is an optimization, but is also necessary since theory combination may e.g. split on equality that was solved during ppRewrite. The solution is to use 2 separate term conversion sequences for these 2 cases.

It also fixes an issue where preprocessing is term-context-sensitive: terms underneath quantifiers are treated differently. This is now handled by a new TermContext callback "InQuantTermContext".
src/expr/term_context.cpp
src/expr/term_context.h
src/smt/term_formula_removal.cpp
src/smt/term_formula_removal.h
src/theory/theory_preprocessor.cpp
src/theory/theory_preprocessor.h