GCC Code Coverage Report
 Directory: . Exec Total Coverage File: src/theory/output_channel.h Lines: 3 6 50.0 % Date: 2021-03-22 Branches: 0 0 0.0 %

 Line Exec Source 1 /********************* */ 2 /*! \file output_channel.h 3 ** \verbatim 4 ** Top contributors (to current version): 5 ** Morgan Deters, Andrew Reynolds, Tim King 6 ** This file is part of the CVC4 project. 7 ** Copyright (c) 2009-2021 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.\endverbatim 11 ** 12 ** \brief The theory output channel interface 13 ** 14 ** The theory output channel interface. 15 **/ 16 17 #include "cvc4_private.h" 18 19 #ifndef CVC4__THEORY__OUTPUT_CHANNEL_H 20 #define CVC4__THEORY__OUTPUT_CHANNEL_H 21 22 #include "theory/trust_node.h" 23 #include "util/resource_manager.h" 24 25 namespace CVC4 { 26 namespace theory { 27 28 /** Properties of lemmas */ 29 enum class LemmaProperty : uint32_t 30 { 31 // default 32 NONE = 0, 33 // whether the lemma is removable 34 REMOVABLE = 1, 35 // whether the processing of the lemma should send atoms to the caller 36 SEND_ATOMS = 2, 37 // whether the lemma is part of the justification for answering "sat" 38 NEEDS_JUSTIFY = 4 39 }; 40 /** Define operator lhs | rhs */ 41 LemmaProperty operator|(LemmaProperty lhs, LemmaProperty rhs); 42 /** Define operator lhs |= rhs */ 43 LemmaProperty& operator|=(LemmaProperty& lhs, LemmaProperty rhs); 44 /** Define operator lhs & rhs */ 45 LemmaProperty operator&(LemmaProperty lhs, LemmaProperty rhs); 46 /** Define operator lhs &= rhs */ 47 LemmaProperty& operator&=(LemmaProperty& lhs, LemmaProperty rhs); 48 /** is the removable bit set on p? */ 49 bool isLemmaPropertyRemovable(LemmaProperty p); 50 /** is the send atoms bit set on p? */ 51 bool isLemmaPropertySendAtoms(LemmaProperty p); 52 /** is the needs justify bit set on p? */ 53 bool isLemmaPropertyNeedsJustify(LemmaProperty p); 54 55 /** 56 * Writes an lemma property name to a stream. 57 * 58 * @param out The stream to write to 59 * @param p The lemma property to write to the stream 60 * @return The stream 61 */ 62 std::ostream& operator<<(std::ostream& out, LemmaProperty p); 63 64 class Theory; 65 66 /** 67 * Generic "theory output channel" interface. 68 * 69 * All methods can throw unrecoverable CVC4::Exception's unless otherwise 70 * documented. 71 */ 72 class OutputChannel { 73 public: 74 /** Construct an OutputChannel. */ 75 116977 OutputChannel() {} 76 77 /** 78 * Destructs an OutputChannel. This implementation does nothing, 79 * but we need a virtual destructor for safety in case subclasses 80 * have a destructor. 81 */ 82 116938 virtual ~OutputChannel() {} 83 84 OutputChannel(const OutputChannel&) = delete; 85 OutputChannel& operator=(const OutputChannel&) = delete; 86 87 /** 88 * With safePoint(), the theory signals that it is at a safe point 89 * and can be interrupted. 90 * 91 * @throws Interrupted if the theory can be safely interrupted. 92 */ 93 virtual void safePoint(ResourceManager::Resource r) {} 94 95 /** 96 * Indicate a theory conflict has arisen. 97 * 98 * @param n - a conflict at the current decision level. This should 99 * be an AND-kinded node of literals that are TRUE in the current 100 * assignment and are in conflict (i.e., at least one must be 101 * assigned false), or else a literal by itself (in the case of a 102 * unit conflict) which is assigned TRUE (and T-conflicting) in the 103 * current assignment. 104 */ 105 virtual void conflict(TNode n) = 0; 106 107 /** 108 * Propagate a theory literal. 109 * 110 * @param n - a theory consequence at the current decision level 111 * @return false if an immediate conflict was encountered 112 */ 113 virtual bool propagate(TNode n) = 0; 114 115 /** 116 * Tell the core that a valid theory lemma at decision level 0 has 117 * been detected. (This requests a split.) 118 * 119 * @param n - a theory lemma valid at decision level 0 120 * @param p The properties of the lemma 121 */ 122 virtual void lemma(TNode n, LemmaProperty p = LemmaProperty::NONE) = 0; 123 124 /** 125 * Request a split on a new theory atom. This is equivalent to 126 * calling lemma({OR n (NOT n)}). 127 * 128 * @param n - a theory atom; must be of Boolean type 129 */ 130 void split(TNode n); 131 132 virtual void splitLemma(TNode n, bool removable = false) = 0; 133 134 /** 135 * If a decision is made on n, it must be in the phase specified. 136 * Note that this is enforced *globally*, i.e., it is completely 137 * context-INdependent. If you ever requirePhase() on a literal, 138 * it is phase-locked forever and ever. If it is to ever have the 139 * other phase as its assignment, it will be because it has been 140 * propagated that way (or it's a unit, at decision level 0). 141 * 142 * @param n - a theory atom with a SAT literal assigned; must have 143 * been pre-registered 144 * @param phase - the phase to decide on n 145 */ 146 virtual void requirePhase(TNode n, bool phase) = 0; 147 148 /** 149 * Notification from a theory that it realizes it is incomplete at 150 * this context level. If SAT is later determined by the 151 * TheoryEngine, it should actually return an UNKNOWN result. 152 */ 153 virtual void setIncomplete() = 0; 154 155 /** 156 * "Spend" a "resource." The meaning is specific to the context in 157 * which the theory is operating, and may even be ignored. The 158 * intended meaning is that if the user has set a limit on the "units 159 * of resource" that can be expended in a search, and that limit is 160 * exceeded, then the search is terminated. Note that the check for 161 * termination occurs in the main search loop, so while theories 162 * should call OutputChannel::spendResource() during particularly 163 * long-running operations, they cannot rely on resource() to break 164 * out of infinite or intractable computations. 165 */ 166 2 virtual void spendResource(ResourceManager::Resource r) {} 167 168 /** 169 * Handle user attribute. 170 * Associates theory t with the attribute attr. Theory t will be 171 * notified whenever an attribute of name attr is set on a node. 172 * This can happen through, for example, the SMT-LIBv2 language. 173 */ 174 virtual void handleUserAttribute(const char* attr, Theory* t) {} 175 176 /** Demands that the search restart from sat search level 0. 177 * Using this leads to non-termination issues. 178 * It is appropriate for prototyping for theories. 179 */ 180 virtual void demandRestart() {} 181 182 //---------------------------- new proof 183 /** 184 * Let pconf be the pair (Node conf, ProofGenerator * pfg). This method 185 * sends conf on the output channel of this class whose proof can be generated 186 * by the generator pfg. Apart from pfg, the interface for this method is 187 * the same as OutputChannel. 188 */ 189 virtual void trustedConflict(TrustNode pconf); 190 /** 191 * Let plem be the pair (Node lem, ProofGenerator * pfg). 192 * Send lem on the output channel of this class whose proof can be generated 193 * by the generator pfg. Apart from pfg, the interface for this method is 194 * the same as OutputChannel. 195 */ 196 virtual void trustedLemma(TrustNode lem, 197 LemmaProperty p = LemmaProperty::NONE); 198 //---------------------------- end new proof 199 }; /* class OutputChannel */ 200 201 } // namespace theory 202 } // namespace CVC4 203 204 #endif /* CVC4__THEORY__OUTPUT_CHANNEL_H */

 Generated by: GCOVR (Version 3.2)