summaryrefslogtreecommitdiff
path: root/src/theory/uf/theory_uf.h
blob: eaab96f27a6ea31be1b94b9d00db94a48d053d71 (plain)
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
128
/*********************                                                        */
/*! \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 reason) {
      Debug("uf") << "NotifyClass::notifyEquality(" << reason << ")" << std::endl;
      // Just forward to uf
      return d_uf.propagate(reason);
    }
  };

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 literal. 
   */
  bool propagate(TNode literal);

  /**
   * 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";
  }

  void staticLearning(TNode in, NodeBuilder<>& learned);

};/* class TheoryUF */

}/* CVC4::theory::uf namespace */
}/* CVC4::theory namespace */
}/* CVC4 namespace */

#endif /* __CVC4__THEORY__UF__THEORY_UF_H */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback