Merge branch '1.4.x'
[cvc5.git] / src / theory / quantifiers / theory_quantifiers.cpp
1 /********************* */
2 /*! \file theory_quantifiers.cpp
3 ** \verbatim
4 ** Original author: Morgan Deters
5 ** Major contributors: Andrew Reynolds
6 ** Minor contributors (to current version): Dejan Jovanovic
7 ** This file is part of the CVC4 project.
8 ** Copyright (c) 2009-2014 New York University and The University of Iowa
9 ** See the file COPYING in the top-level source directory for licensing
10 ** information.\endverbatim
11 **
12 ** \brief Implementation of the theory of quantifiers
13 **
14 ** Implementation of the theory of quantifiers.
15 **/
16
17
18 #include "theory/quantifiers/theory_quantifiers.h"
19 #include "theory/valuation.h"
20 #include "theory/quantifiers_engine.h"
21 #include "theory/quantifiers/instantiation_engine.h"
22 #include "theory/quantifiers/model_engine.h"
23 #include "expr/kind.h"
24 #include "util/cvc4_assert.h"
25 #include "theory/quantifiers/options.h"
26 #include "theory/quantifiers/term_database.h"
27 #include "theory/quantifiers/quantifiers_attributes.h"
28
29 using namespace std;
30 using namespace CVC4;
31 using namespace CVC4::kind;
32 using namespace CVC4::context;
33 using namespace CVC4::theory;
34 using namespace CVC4::theory::quantifiers;
35
36 TheoryQuantifiers::TheoryQuantifiers(Context* c, context::UserContext* u, OutputChannel& out, Valuation valuation, const LogicInfo& logicInfo) :
37 Theory(THEORY_QUANTIFIERS, c, u, out, valuation, logicInfo),
38 d_numRestarts(0),
39 d_masterEqualityEngine(0)
40 {
41 d_numInstantiations = 0;
42 d_baseDecLevel = -1;
43 out.handleUserAttribute( "axiom", this );
44 out.handleUserAttribute( "conjecture", this );
45 out.handleUserAttribute( "inst-level", this );
46 out.handleUserAttribute( "rr-priority", this );
47 }
48
49 TheoryQuantifiers::~TheoryQuantifiers() {
50 }
51
52 void TheoryQuantifiers::setMasterEqualityEngine(eq::EqualityEngine* eq) {
53 d_masterEqualityEngine = eq;
54 }
55
56 void TheoryQuantifiers::addSharedTerm(TNode t) {
57 Debug("quantifiers-other") << "TheoryQuantifiers::addSharedTerm(): "
58 << t << endl;
59 }
60
61
62 void TheoryQuantifiers::notifyEq(TNode lhs, TNode rhs) {
63 Debug("quantifiers-other") << "TheoryQuantifiers::notifyEq(): "
64 << lhs << " = " << rhs << endl;
65
66 }
67
68 void TheoryQuantifiers::preRegisterTerm(TNode n) {
69 Debug("quantifiers-prereg") << "TheoryQuantifiers::preRegisterTerm() " << n << endl;
70 if( n.getKind()==FORALL && !TermDb::hasInstConstAttr(n) ){
71 getQuantifiersEngine()->registerQuantifier( n );
72 }
73 }
74
75
76 void TheoryQuantifiers::presolve() {
77 Debug("quantifiers-presolve") << "TheoryQuantifiers::presolve()" << endl;
78 }
79
80 Node TheoryQuantifiers::getValue(TNode n) {
81 //NodeManager* nodeManager = NodeManager::currentNM();
82 switch(n.getKind()) {
83 case FORALL:
84 case EXISTS:
85 bool value;
86 if( d_valuation.hasSatValue( n, value ) ){
87 return NodeManager::currentNM()->mkConst(value);
88 }else{
89 return NodeManager::currentNM()->mkConst(false); //FIX_THIS?
90 }
91 break;
92 default:
93 Unhandled(n.getKind());
94 }
95 }
96
97 void TheoryQuantifiers::collectModelInfo(TheoryModel* m, bool fullModel) {
98 if(fullModel) {
99 for(assertions_iterator i = facts_begin(); i != facts_end(); ++i) {
100 if((*i).assertion.getKind() == kind::NOT) {
101 Debug("quantifiers::collectModelInfo") << "got quant FALSE: " << (*i).assertion[0] << endl;
102 m->assertPredicate((*i).assertion[0], false);
103 } else {
104 Debug("quantifiers::collectModelInfo") << "got quant TRUE : " << *i << endl;
105 m->assertPredicate(*i, true);
106 }
107 }
108 }
109 }
110
111 void TheoryQuantifiers::check(Effort e) {
112 CodeTimer codeTimer(d_theoryTime);
113
114 Trace("quantifiers-check") << "quantifiers::check(" << e << ")" << std::endl;
115 while(!done()) {
116 Node assertion = get();
117 Trace("quantifiers-assert") << "quantifiers::assert(): " << assertion << std::endl;
118 switch(assertion.getKind()) {
119 case kind::FORALL:
120 assertUniversal( assertion );
121 break;
122 case kind::NOT:
123 {
124 switch( assertion[0].getKind()) {
125 case kind::FORALL:
126 assertExistential( assertion );
127 break;
128 default:
129 Unhandled(assertion[0].getKind());
130 break;
131 }
132 }
133 break;
134 default:
135 Unhandled(assertion.getKind());
136 break;
137 }
138 }
139 // call the quantifiers engine to check
140 getQuantifiersEngine()->check( e );
141 }
142
143 void TheoryQuantifiers::propagate(Effort level){
144 //CodeTimer codeTimer(d_theoryTime);
145 //getQuantifiersEngine()->propagate( level );
146 }
147
148 Node TheoryQuantifiers::getNextDecisionRequest(){
149 return getQuantifiersEngine()->getNextDecisionRequest();
150 }
151
152 void TheoryQuantifiers::assertUniversal( Node n ){
153 Assert( n.getKind()==FORALL );
154 if( options::recurseCbqi() || !TermDb::hasInstConstAttr(n) ){
155 getQuantifiersEngine()->assertQuantifier( n, true );
156 }
157 }
158
159 void TheoryQuantifiers::assertExistential( Node n ){
160 Assert( n.getKind()== NOT && n[0].getKind()==FORALL );
161 if( !options::cbqi() || options::recurseCbqi() || !TermDb::hasInstConstAttr(n[0]) ){
162 getQuantifiersEngine()->assertQuantifier( n[0], false );
163 }
164 }
165
166 bool TheoryQuantifiers::flipDecision(){
167 //Debug("quantifiers-flip") << "No instantiation given, flip decision, level = " << d_valuation.getDecisionLevel() << std::endl;
168 //for( int i=1; i<=(int)d_valuation.getDecisionLevel(); i++ ){
169 // Debug("quantifiers-flip") << " " << d_valuation.getDecision( i ) << std::endl;
170 //}
171 //if( d_valuation.getDecisionLevel()>0 ){
172 // double r = double(rand())/double(RAND_MAX);
173 // unsigned decisionLevel = (unsigned)(r*d_valuation.getDecisionLevel());
174 // d_out->flipDecision( decisionLevel );
175 // return true;
176 //}else{
177 // return false;
178 //}
179
180 if( !d_out->flipDecision() ){
181 return restart();
182 }
183 return true;
184 }
185
186 bool TheoryQuantifiers::restart(){
187 static const int restartLimit = 0;
188 if( d_numRestarts==restartLimit ){
189 Debug("quantifiers-flip") << "No more restarts." << std::endl;
190 return false;
191 }else{
192 d_numRestarts++;
193 Debug("quantifiers-flip") << "Do restart." << std::endl;
194 return true;
195 }
196 }
197
198 void TheoryQuantifiers::setUserAttribute(const std::string& attr, Node n, std::vector<Node> node_values, std::string str_value){
199 QuantifiersAttributes::setUserAttribute( attr, n, node_values, str_value );
200 }