Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Mathias Preiner 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 a cache of skolems for theory of sets. 14 : : */ 15 : : 16 : : #include "theory/sets/skolem_cache.h" 17 : : 18 : : #include "expr/skolem_manager.h" 19 : : #include "theory/rewriter.h" 20 : : 21 : : using namespace cvc5::internal::kind; 22 : : 23 : : namespace cvc5::internal { 24 : : namespace theory { 25 : : namespace sets { 26 : : 27 : 49994 : SkolemCache::SkolemCache(NodeManager* nm, Rewriter* rr) 28 : 49994 : : d_nm(nm), d_rewriter(rr) 29 : : { 30 : 49994 : } 31 : : 32 : 10881 : Node SkolemCache::mkTypedSkolemCached( 33 : : TypeNode tn, Node a, Node b, SkolemId id, const char* c) 34 : : { 35 [ + - ]: 10881 : if (d_rewriter != nullptr) 36 : : { 37 [ - + ][ + - ]: 10881 : a = a.isNull() ? a : d_rewriter->rewrite(a); [ - - ] 38 [ + + ][ + + ]: 10881 : b = b.isNull() ? b : d_rewriter->rewrite(b); [ - - ] 39 : : } 40 : 10881 : std::map<SkolemId, Node>::iterator it = d_skolemCache[a][b].find(id); 41 [ + + ]: 10881 : if (it == d_skolemCache[a][b].end()) 42 : : { 43 : 9037 : SkolemManager* sm = d_nm->getSkolemManager(); 44 : 18074 : Node sk; 45 [ + + ]: 9037 : if (id == SkolemId::SK_PURIFY) 46 : : { 47 [ - + ][ - + ]: 7680 : Assert(a.getType() == tn); [ - - ] 48 : 7680 : sk = sm->mkPurifySkolem(a); 49 : : } 50 : : else 51 : : { 52 : 1357 : sk = NodeManager::mkDummySkolem(c, tn, "sets skolem"); 53 : : } 54 : 9037 : d_skolemCache[a][b][id] = sk; 55 : 9037 : d_allSkolems.insert(sk); 56 : 9037 : return sk; 57 : : } 58 : 1844 : return it->second; 59 : : } 60 : 7684 : Node SkolemCache::mkTypedSkolemCached(TypeNode tn, 61 : : Node a, 62 : : SkolemId id, 63 : : const char* c) 64 : : { 65 : 7684 : return mkTypedSkolemCached(tn, a, Node::null(), id, c); 66 : : } 67 : : 68 : 0 : Node SkolemCache::mkTypedSkolem(TypeNode tn, const char* c) 69 : : { 70 : 0 : Node n = NodeManager::mkDummySkolem(c, tn, "sets skolem"); 71 : 0 : d_allSkolems.insert(n); 72 : 0 : return n; 73 : : } 74 : : 75 : 428627 : bool SkolemCache::isSkolem(Node n) const 76 : : { 77 : 428627 : return d_allSkolems.find(n) != d_allSkolems.end(); 78 : : } 79 : : 80 : : } // namespace sets 81 : : } // namespace theory 82 : : } // namespace cvc5::internal