GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/quantifiers/quant_util.h Lines: 4 6 66.7 %
Date: 2021-09-10 Branches: 0 0 0.0 %

Line Exec Source
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-2021 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
 * quantifier util
14
 */
15
16
#include "cvc5_private.h"
17
18
#ifndef CVC5__THEORY__QUANT_UTIL_H
19
#define CVC5__THEORY__QUANT_UTIL_H
20
21
#include <iostream>
22
#include <map>
23
#include <vector>
24
25
#include "expr/node.h"
26
#include "smt/env_obj.h"
27
#include "theory/incomplete_id.h"
28
#include "theory/theory.h"
29
30
namespace cvc5 {
31
namespace theory {
32
33
/** Quantifiers utility
34
 *
35
 * This is a lightweight version of a quantifiers module that does not implement
36
 * methods for checking satisfiability.
37
 */
38
class QuantifiersUtil : protected EnvObj
39
{
40
 public:
41
  QuantifiersUtil(Env& env);
42
49652
  virtual ~QuantifiersUtil(){}
43
  /**  Called at the beginning of check-sat call. */
44
32890
  virtual void presolve() {}
45
  /* reset
46
   * Called at the beginning of an instantiation round
47
   * Returns false if the reset failed. When reset fails, the utility should
48
   * have added a lemma via a call to d_qim.addPendingLemma.
49
   */
50
  virtual bool reset(Theory::Effort e) { return true; }
51
  /* Called for new quantifiers */
52
  virtual void registerQuantifier(Node q) {}
53
  /** Identify this module (for debugging, dynamic configuration, etc..) */
54
  virtual std::string identify() const = 0;
55
  /** Check complete?
56
   *
57
   * Returns false if the utility's reasoning was globally incomplete
58
   * (e.g. "sat" must be replaced with "incomplete"). If this method returns
59
   * false, it should update incId to the reason for incompleteness.
60
   */
61
10742
  virtual bool checkComplete(IncompleteId& incId) { return true; }
62
};
63
64
class QuantPhaseReq
65
{
66
private:
67
  /** helper functions compute phase requirements */
68
  void computePhaseReqs( Node n, bool polarity, std::map< Node, int >& phaseReqs );
69
public:
70
  QuantPhaseReq(){}
71
  QuantPhaseReq( Node n, bool computeEq = false );
72
112744
  ~QuantPhaseReq(){}
73
  void initialize( Node n, bool computeEq );
74
  /** is phase required */
75
  bool isPhaseReq( Node lit ) { return d_phase_reqs.find( lit )!=d_phase_reqs.end(); }
76
  /** get phase requirement */
77
  bool getPhaseReq( Node lit ) { return d_phase_reqs.find( lit )==d_phase_reqs.end() ? false : d_phase_reqs[ lit ]; }
78
  /** phase requirements for each quantifier for each instantiation literal */
79
  std::map< Node, bool > d_phase_reqs;
80
  std::map< Node, bool > d_phase_reqs_equality;
81
  std::map< Node, Node > d_phase_reqs_equality_term;
82
83
  /**
84
   * Get the polarity of the child^th child of n, assuming its polarity
85
   * is given by (hasPol, pol). A term has polarity if it is only relevant
86
   * if asserted with one polarity. Its polarity is (typically) the number
87
   * of negations it is beneath.
88
   */
89
  static void getPolarity(Node n,
90
                          size_t child,
91
                          bool hasPol,
92
                          bool pol,
93
                          bool& newHasPol,
94
                          bool& newPol);
95
96
  /**
97
   * Get the entailed polarity of the child^th child of n, assuming its
98
   * entailed polarity is given by (hasPol, pol). A term has entailed polarity
99
   * if it must be asserted with a polarity. Its polarity is (typically) the
100
   * number of negations it is beneath.
101
   *
102
   * Entailed polarity and polarity above differ, e.g.:
103
   *   (and A B): A and B have true polarity and true entailed polarity
104
   *   (or A B): A and B have true polarity and no entailed polarity
105
   */
106
  static void getEntailPolarity(Node n,
107
                                size_t child,
108
                                bool hasPol,
109
                                bool pol,
110
                                bool& newHasPol,
111
                                bool& newPol);
112
};
113
114
}
115
}  // namespace cvc5
116
117
#endif /* CVC5__THEORY__QUANT_UTIL_H */