Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Mudathir Mohamed, Andrew Reynolds, 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 : : * Implementation of inference information utility. 14 : : */ 15 : : 16 : : #include "theory/bags/infer_info.h" 17 : : 18 : : #include "theory/bags/inference_manager.h" 19 : : #include "theory/inference_manager_buffered.h" 20 : : 21 : : namespace cvc5::internal { 22 : : namespace theory { 23 : : namespace bags { 24 : : 25 : 80448 : InferInfo::InferInfo(InferenceManagerBuffered* im, InferenceId id) 26 : 80448 : : TheoryInference(id), d_im(im) 27 : : { 28 : 80448 : } 29 : : 30 : 80448 : TrustNode InferInfo::processLemma(LemmaProperty& p) 31 : : { 32 : 80448 : Node lemma = getLemma(); 33 : : 34 [ + - ]: 80448 : Trace("bags::InferInfo::process") << (*this) << std::endl; 35 : 80448 : d_im->addPendingLemma(lemma, getId()); 36 : 160896 : return TrustNode::mkTrustLemma(lemma, nullptr); 37 : : } 38 : : 39 : 80448 : Node InferInfo::getLemma() const 40 : : { 41 : 80448 : NodeManager* nm = NodeManager::currentNM(); 42 : 160896 : std::vector<Node> nodes; 43 : 160896 : Node premises = nm->mkAnd(d_premises); 44 : 241344 : Node lemma = nm->mkNode(Kind::IMPLIES, premises, d_conclusion); 45 : 80448 : nodes.push_back(lemma); 46 : : // send lemmas corresponding to the skolems introduced 47 [ - + ]: 80448 : for (const auto& pair : d_skolems) 48 : : { 49 : 0 : Node n = pair.first.eqNode(pair.second); 50 : 0 : nodes.push_back(n); 51 : : } 52 [ + - ]: 80448 : if (nodes.size() == 1) 53 : : { 54 : 80448 : return lemma; 55 : : } 56 : 0 : return nm->mkNode(Kind::AND, nodes); 57 : : } 58 : : 59 : 0 : bool InferInfo::isTrivial() const 60 : : { 61 : 0 : Assert(!d_conclusion.isNull()); 62 [ - - ][ - - ]: 0 : return d_conclusion.isConst() && d_conclusion.getConst<bool>(); 63 : : } 64 : : 65 : 0 : bool InferInfo::isConflict() const 66 : : { 67 : 0 : Assert(!d_conclusion.isNull()); 68 [ - - ][ - - ]: 0 : return d_conclusion.isConst() && !d_conclusion.getConst<bool>(); 69 : : } 70 : : 71 : 0 : bool InferInfo::isFact() const 72 : : { 73 : 0 : Assert(!d_conclusion.isNull()); 74 : : TNode atom = 75 [ - - ]: 0 : d_conclusion.getKind() == Kind::NOT ? d_conclusion[0] : d_conclusion; 76 : 0 : return !atom.isConst() && atom.getKind() != Kind::OR; 77 : : } 78 : : 79 : 0 : std::ostream& operator<<(std::ostream& out, const InferInfo& ii) 80 : : { 81 : 0 : out << "(infer ;id " << std::endl << ii.getId() << std::endl; 82 : 0 : out << ";conclusion " << std::endl << ii.d_conclusion << std::endl; 83 [ - - ]: 0 : if (!ii.d_premises.empty()) 84 : : { 85 : 0 : out << " ;premise" << std::endl << ii.d_premises << std::endl; 86 : : } 87 : 0 : out << ";skolems " << ii.d_skolems << std::endl; 88 : 0 : out << ")"; 89 : 0 : return out; 90 : : } 91 : : 92 : : } // namespace bags 93 : : } // namespace theory 94 : : } // namespace cvc5::internal