1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/********************* */
/*! \file theory_uf.h
** \verbatim
** Original author: dejan
** Major contributors: none
** Minor contributors (to current version): none
** This file is part of the CVC4 prototype.
** Copyright (c) 2009, 2010 The Analysis of Computer Systems Group (ACSys)
** Courant Institute of Mathematical Sciences
** New York University
** See the file COPYING in the top-level source directory for licensing
** information.\endverbatim
**
** \brief This is the interface to TheoryUF implementations
**
** This is the interface to TheoryUF implementations. All
** implementations of TheoryUF should inherit from this class.
**/
#include "cvc4_private.h"
#ifndef __CVC4__THEORY__UF__THEORY_UF_H
#define __CVC4__THEORY__UF__THEORY_UF_H
#include "expr/node.h"
#include "expr/attribute.h"
#include "theory/theory.h"
#include "theory/uf/equality_engine.h"
#include "context/cdo.h"
#include "context/cdset.h"
namespace CVC4 {
namespace theory {
namespace uf {
class TheoryUF : public Theory {
public:
class NotifyClass {
TheoryUF& d_uf;
public:
NotifyClass(TheoryUF& uf): d_uf(uf) {}
bool notifyEquality(TNode eq) {
Debug("uf") << "NotifyClass::notifyEquality(" << eq << ")" << std::endl;
// Just forward to uf
return d_uf.propagate(eq, true);
}
};
private:
/** The notify class */
NotifyClass d_notify;
/** Equaltity engine */
EqualityEngine<NotifyClass> d_equalityEngine;
/** All the literals known to be true */
context::CDSet<TNode, TNodeHashFunction> d_knownFacts;
/** Are we in conflict */
context::CDO<bool> d_conflict;
/** The conflict node */
Node d_conflictNode;
/**
* Should be called to propagate the atom. If isTrue is true, the atom should be propagated,
* otherwise the negated atom should be propagated.
*/
bool propagate(TNode atom, bool isTrue);
/**
* Explain why this literal is true by adding assumptions
*/
void explain(TNode literal, std::vector<TNode>& assumptions);
/** Literals to propagate */
std::vector<TNode> d_literalsToPropagate;
/** True node for predicates = true */
Node d_true;
/** True node for predicates = false */
Node d_false;
public:
/** Constructs a new instance of TheoryUF w.r.t. the provided context.*/
TheoryUF(context::Context* ctxt, OutputChannel& out, Valuation valuation):
Theory(THEORY_UF, ctxt, out, valuation),
d_notify(*this),
d_equalityEngine(d_notify, ctxt, "theory::uf::TheoryUF"),
d_knownFacts(ctxt),
d_conflict(ctxt, false)
{
// The kinds we are treating as function application in congruence
d_equalityEngine.addFunctionKind(kind::APPLY_UF);
// The boolean constants
d_true = NodeManager::currentNM()->mkConst<bool>(true);
d_false = NodeManager::currentNM()->mkConst<bool>(false);
d_equalityEngine.addTerm(d_true);
d_equalityEngine.addTerm(d_false);
d_equalityEngine.addTriggerEquality(d_true, d_false, d_false);
}
void check(Effort);
void propagate(Effort);
void preRegisterTerm(TNode term);
void explain(TNode n);
std::string identify() const {
return "THEORY_UF";
}
};/* class TheoryUF */
}/* CVC4::theory::uf namespace */
}/* CVC4::theory namespace */
}/* CVC4 namespace */
#endif /* __CVC4__THEORY__UF__THEORY_UF_H */
|