Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Mathias Preiner, Aina Niemetz 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS 8 : : * in the top-level source directory and their institutional affiliations. 9 : : * All rights reserved. See the file COPYING in the top-level source 10 : : * directory for licensing information. 11 : : * **************************************************************************** 12 : : * 13 : : * The strings eager preprocess utility. 14 : : */ 15 : : 16 : : #include "preprocessing/passes/strings_eager_pp.h" 17 : : 18 : : #include "preprocessing/assertion_pipeline.h" 19 : : #include "theory/rewriter.h" 20 : : #include "theory/strings/theory_strings_preprocess.h" 21 : : 22 : : using namespace cvc5::internal::theory; 23 : : 24 : : namespace cvc5::internal { 25 : : namespace preprocessing { 26 : : namespace passes { 27 : : 28 : 48144 : StringsEagerPp::StringsEagerPp(PreprocessingPassContext* preprocContext) 29 : 48144 : : PreprocessingPass(preprocContext, "strings-eager-pp"){}; 30 : : 31 : 69 : PreprocessingPassResult StringsEagerPp::applyInternal( 32 : : AssertionPipeline* assertionsToPreprocess) 33 : : { 34 : 69 : NodeManager* nm = nodeManager(); 35 : 138 : theory::strings::SkolemCache skc(nullptr); 36 : 138 : theory::strings::StringsPreprocess pp(d_env, &skc); 37 [ + + ]: 273 : for (size_t i = 0, nasserts = assertionsToPreprocess->size(); i < nasserts; 38 : : ++i) 39 : : { 40 : 204 : Node prev = (*assertionsToPreprocess)[i]; 41 : 204 : std::vector<Node> asserts; 42 : 204 : Node rew = pp.processAssertion(prev, asserts); 43 [ + + ]: 204 : if (!asserts.empty()) 44 : : { 45 : 52 : std::vector<Node> conj; 46 : 52 : conj.push_back(rew); 47 : 52 : conj.insert(conj.end(), asserts.begin(), asserts.end()); 48 : 52 : rew = nm->mkAnd(conj); 49 : : } 50 [ + + ]: 204 : if (prev != rew) 51 : : { 52 : 52 : assertionsToPreprocess->replace(i, rewrite(rew)); 53 [ - + ]: 52 : if (assertionsToPreprocess->isInConflict()) 54 : : { 55 : 0 : return PreprocessingPassResult::CONFLICT; 56 : : } 57 : : } 58 : : } 59 : : 60 : 69 : return PreprocessingPassResult::NO_CONFLICT; 61 : : } 62 : : 63 : : } // namespace passes 64 : : } // namespace preprocessing 65 : : } // namespace cvc5::internal