Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Morgan Deters, Dejan Jovanovic 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 theory of booleans. 14 : : */ 15 : : 16 : : #include "theory/booleans/theory_bool.h" 17 : : 18 : : #include <stack> 19 : : #include <vector> 20 : : 21 : : #include "proof/proof_node_manager.h" 22 : : #include "theory/booleans/circuit_propagator.h" 23 : : #include "theory/booleans/theory_bool_rewriter.h" 24 : : #include "theory/substitutions.h" 25 : : #include "theory/theory.h" 26 : : #include "theory/trust_substitutions.h" 27 : : #include "theory/valuation.h" 28 : : #include "util/hash.h" 29 : : 30 : : using namespace cvc5::internal::kind; 31 : : 32 : : namespace cvc5::internal { 33 : : namespace theory { 34 : : namespace booleans { 35 : : 36 : 49172 : TheoryBool::TheoryBool(Env& env, OutputChannel& out, Valuation valuation) 37 : : : Theory(THEORY_BOOL, env, out, valuation), 38 : : d_rewriter(nodeManager()), 39 : 49172 : d_checker(nodeManager()) 40 : : { 41 : 49172 : } 42 : : 43 : 19648 : Theory::PPAssertStatus TheoryBool::ppAssert( 44 : : TrustNode tin, TrustSubstitutionMap& outSubstitutions) 45 : : { 46 [ - + ][ - + ]: 19648 : Assert(tin.getKind() == TrustNodeKind::LEMMA); [ - - ] 47 : 39296 : TNode in = tin.getNode(); 48 [ + + ][ + + ]: 19648 : if (in.getKind() == Kind::CONST_BOOLEAN && !in.getConst<bool>()) [ + + ] 49 : : { 50 : : // If we get a false literal, we're in conflict 51 : 1 : return PP_ASSERT_STATUS_CONFLICT; 52 : : } 53 : : 54 : : // Add the substitution from the variable to its value 55 [ + + ]: 19647 : if (in.getKind() == Kind::NOT) 56 : : { 57 [ + + ]: 8929 : if (in[0].isVar()) 58 : : { 59 : 17052 : outSubstitutions.addSubstitutionSolved( 60 : 17052 : in[0], nodeManager()->mkConst<bool>(false), tin); 61 : 8526 : return PP_ASSERT_STATUS_SOLVED; 62 : : } 63 : 403 : else if (in[0].getKind() == Kind::EQUAL && in[0][0].getType().isBoolean()) 64 : : { 65 : 192 : TNode eq = in[0]; 66 : 192 : if (eq[0].isVar() && isLegalElimination(eq[0], eq[1])) 67 : : { 68 : 108 : outSubstitutions.addSubstitutionSolved(eq[0], eq[1].notNode(), tin); 69 : 108 : return PP_ASSERT_STATUS_SOLVED; 70 : : } 71 : 84 : else if (eq[1].isVar() && isLegalElimination(eq[1], eq[0])) 72 : : { 73 : 0 : outSubstitutions.addSubstitutionSolved(eq[1], eq[0].notNode(), tin); 74 : 0 : return PP_ASSERT_STATUS_SOLVED; 75 : : } 76 : : } 77 : : } 78 [ + + ]: 10718 : else if (in.isVar()) 79 : : { 80 : 13946 : outSubstitutions.addSubstitutionSolved( 81 : 13946 : in, nodeManager()->mkConst<bool>(true), tin); 82 : 6973 : return PP_ASSERT_STATUS_SOLVED; 83 : : } 84 : : 85 : : // the positive Boolean equality case is handled in the default way 86 : 4040 : return Theory::ppAssert(tin, outSubstitutions); 87 : : } 88 : : 89 : 49172 : TheoryRewriter* TheoryBool::getTheoryRewriter() { return &d_rewriter; } 90 : : 91 : 18572 : ProofRuleChecker* TheoryBool::getProofChecker() { return &d_checker; } 92 : : 93 : 0 : std::string TheoryBool::identify() const { return std::string("TheoryBool"); } 94 : : 95 : : } // namespace booleans 96 : : } // namespace theory 97 : : } // namespace cvc5::internal