Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Mathias Preiner, Andrew Reynolds, Daniel Larraz 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2025 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 : : * Arrays skolem cache. 14 : : */ 15 : : 16 : : #include "theory/arrays/skolem_cache.h" 17 : : 18 : : #include "expr/attribute.h" 19 : : #include "expr/bound_var_manager.h" 20 : : #include "expr/skolem_manager.h" 21 : : #include "expr/type_node.h" 22 : : 23 : : using namespace cvc5::internal::kind; 24 : : 25 : : namespace cvc5::internal { 26 : : namespace theory { 27 : : namespace arrays { 28 : : 29 : : /** 30 : : * A bound variable corresponding to the index used in the eqrange expansion. 31 : : */ 32 : : struct EqRangeVarAttributeId 33 : : { 34 : : }; 35 : : typedef expr::Attribute<EqRangeVarAttributeId, Node> EqRangeVarAttribute; 36 : : 37 : 0 : SkolemCache::SkolemCache() {} 38 : : 39 : 4084 : Node SkolemCache::getExtIndexSkolem(NodeManager* nm, Node deq) 40 : : { 41 : 8168 : Assert(deq.getKind() == Kind::NOT && deq[0].getKind() == Kind::EQUAL); 42 : 8168 : Node a = deq[0][0]; 43 : 4084 : Node b = deq[0][1]; 44 [ - + ][ - + ]: 4084 : Assert(a.getType().isArray()); [ - - ] 45 [ - + ][ - + ]: 4084 : Assert(b.getType() == a.getType()); [ - - ] 46 : : 47 : : // make the skolem, which is deterministic for a,b. 48 : 4084 : SkolemManager* sm = nm->getSkolemManager(); 49 [ + + ][ - - ]: 16336 : return sm->mkSkolemFunction(SkolemId::ARRAY_DEQ_DIFF, {a, b}); 50 : : } 51 : : 52 : 44 : Node SkolemCache::getEqRangeVar(NodeManager* nm, TNode eqr) 53 : : { 54 [ - + ][ - + ]: 44 : Assert(eqr.getKind() == Kind::EQ_RANGE); [ - - ] 55 : 44 : BoundVarManager* bvm = nm->getBoundVarManager(); 56 : 44 : return bvm->mkBoundVar<EqRangeVarAttribute>(eqr, eqr[2].getType()); 57 : : } 58 : : 59 : : 60 : : } // namespace arrays 61 : : } // namespace theory 62 : : } // namespace cvc5::internal