Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Andres Noetzli, 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 sets term registry object. 14 : : */ 15 : : 16 : : #include "theory/sets/term_registry.h" 17 : : 18 : : #include "expr/emptyset.h" 19 : : #include "expr/skolem_manager.h" 20 : : 21 : : using namespace std; 22 : : using namespace cvc5::internal::kind; 23 : : 24 : : namespace cvc5::internal { 25 : : namespace theory { 26 : : namespace sets { 27 : : 28 : 49281 : TermRegistry::TermRegistry(Env& env, 29 : : SolverState& state, 30 : : InferenceManager& im, 31 : 49281 : SkolemCache& skc) 32 : : : EnvObj(env), 33 : : d_im(im), 34 : : d_skCache(skc), 35 : 98562 : d_proxy(userContext()), 36 : 98562 : d_proxy_to_term(userContext()), 37 : 98562 : d_epg(env.isTheoryProofProducing() ? new EagerProofGenerator( 38 : 10371 : env, nullptr, "sets::TermRegistry::epg") 39 : 59652 : : nullptr) 40 : : { 41 : 49281 : } 42 : : 43 : 45013 : Node TermRegistry::getProxy(Node n) 44 : : { 45 : 45013 : Kind nk = n.getKind(); 46 [ + + ][ + + ]: 45013 : if (nk != Kind::SET_EMPTY && nk != Kind::SET_SINGLETON 47 [ + + ][ + + ]: 19416 : && nk != Kind::SET_INTER && nk != Kind::SET_MINUS && nk != Kind::SET_UNION [ + + ] 48 [ + + ][ + + ]: 7367 : && nk != Kind::SET_UNIVERSE && nk != Kind::SET_MAP) 49 : : { 50 : 5420 : return n; 51 : : } 52 : 39593 : NodeMap::const_iterator it = d_proxy.find(n); 53 [ + + ]: 39593 : if (it != d_proxy.end()) 54 : : { 55 : 31858 : return (*it).second; 56 : : } 57 : 7735 : NodeManager* nm = nodeManager(); 58 : 7735 : Node k = d_skCache.mkTypedSkolemCached( 59 : 23205 : n.getType(), n, SkolemCache::SK_PURIFY, "sp"); 60 : : 61 : 7735 : d_proxy[n] = k; 62 : 7735 : d_proxy_to_term[k] = n; 63 : 15470 : Node eq = k.eqNode(n); 64 : 7735 : sendSimpleLemmaInternal(eq, InferenceId::SETS_PROXY); 65 [ + + ]: 7735 : if (nk == Kind::SET_SINGLETON) 66 : : { 67 : 7072 : Node slem = nm->mkNode(Kind::SET_MEMBER, n[0], k); 68 : 3536 : sendSimpleLemmaInternal(slem, InferenceId::SETS_PROXY_SINGLETON); 69 : : } 70 : 7735 : return k; 71 : : } 72 : : 73 : 23618 : Node TermRegistry::getEmptySet(TypeNode tn) 74 : : { 75 : 23618 : std::map<TypeNode, Node>::iterator it = d_emptyset.find(tn); 76 [ + + ]: 23618 : if (it != d_emptyset.end()) 77 : : { 78 : 23414 : return it->second; 79 : : } 80 : 408 : Node n = nodeManager()->mkConst(EmptySet(tn)); 81 : 204 : d_emptyset[tn] = n; 82 : 204 : return n; 83 : : } 84 : : 85 : 5401 : Node TermRegistry::getUnivSet(TypeNode tn) 86 : : { 87 : 5401 : std::map<TypeNode, Node>::iterator it = d_univset.find(tn); 88 [ + + ]: 5401 : if (it != d_univset.end()) 89 : : { 90 : 5136 : return it->second; 91 : : } 92 : 265 : NodeManager* nm = nodeManager(); 93 : 530 : Node n = nm->mkNullaryOperator(tn, Kind::SET_UNIVERSE); 94 : 265 : d_univset[tn] = n; 95 : 265 : return n; 96 : : } 97 : : 98 : 25970 : void TermRegistry::debugPrintSet(Node s, const char* c) const 99 : : { 100 [ + + ]: 25970 : if (s.getNumChildren() == 0) 101 : : { 102 : 16828 : NodeMap::const_iterator it = d_proxy_to_term.find(s); 103 [ + + ]: 16828 : if (it != d_proxy_to_term.end()) 104 : : { 105 : 4212 : debugPrintSet((*it).second, c); 106 : : } 107 : : else 108 : : { 109 [ + - ]: 12616 : Trace(c) << s; 110 : : } 111 : : } 112 : : else 113 : : { 114 [ + - ][ - + ]: 9142 : Trace(c) << "(" << s.getOperator(); [ - - ] 115 [ + + ]: 26240 : for (const Node& sc : s) 116 : : { 117 [ + - ]: 17098 : Trace(c) << " "; 118 : 17098 : debugPrintSet(sc, c); 119 : : } 120 [ + - ]: 9142 : Trace(c) << ")"; 121 : : } 122 : 25970 : } 123 : : 124 : 11271 : void TermRegistry::sendSimpleLemmaInternal(Node n, InferenceId id) 125 : : { 126 [ + - ]: 11271 : Trace("sets-lemma") << "Sets::Lemma : " << n << " by " << id << std::endl; 127 [ + + ]: 11271 : if (d_epg.get() != nullptr) 128 : : { 129 : : TrustNode teq = 130 : 19260 : d_epg->mkTrustNode(n, ProofRule::MACRO_SR_PRED_INTRO, {}, {n}); 131 : 4815 : d_im.trustedLemma(teq, id); 132 : : } 133 : : else 134 : : { 135 : 6456 : d_im.lemma(n, id); 136 : : } 137 : 11271 : } 138 : : 139 : : } // namespace sets 140 : : } // namespace theory 141 : : } // namespace cvc5::internal