GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/proof/alethe/alethe_post_processor.h Lines: 0 2 0.0 %
Date: 2021-09-29 Branches: 0 0 0.0 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Hanna Lachnitt, Haniel Barbosa
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
 * The module for processing proof nodes into Alethe proof nodes
14
 */
15
16
#ifndef CVC4__PROOF__ALETHE_PROOF_PROCESSOR_H
17
#define CVC4__PROOF__ALETHE_PROOF_PROCESSOR_H
18
19
#include "proof/alethe/alethe_node_converter.h"
20
#include "proof/alethe/alethe_proof_rule.h"
21
#include "proof/proof_node_updater.h"
22
23
namespace cvc5 {
24
25
namespace proof {
26
27
/**
28
 * A callback class used by the Alethe converter for post-processing proof nodes
29
 * by replacing internal rules by the rules in the Alethe calculus.
30
 */
31
class AletheProofPostprocessCallback : public ProofNodeUpdaterCallback
32
{
33
 public:
34
  AletheProofPostprocessCallback(ProofNodeManager* pnm,
35
                                 AletheNodeConverter& anc);
36
  ~AletheProofPostprocessCallback() {}
37
  /** Should proof pn be updated? Only if its top-level proof rule is not an
38
   *  Alethe proof rule.
39
   */
40
  bool shouldUpdate(std::shared_ptr<ProofNode> pn,
41
                    const std::vector<Node>& fa,
42
                    bool& continueUpdate) override;
43
  /**
44
   * This method updates the proof rule application depending on the given
45
   * rule and translating it into a proof node in terms of the Alethe rules.
46
   */
47
  bool update(Node res,
48
              PfRule id,
49
              const std::vector<Node>& children,
50
              const std::vector<Node>& args,
51
              CDProof* cdp,
52
              bool& continueUpdate) override;
53
54
 private:
55
  /** The proof node manager */
56
  ProofNodeManager* d_pnm;
57
  /** The Alethe node converter */
58
  AletheNodeConverter& d_anc;
59
  /** The cl operator
60
   * For every step the conclusion is a clause. But since the or operator
61
   *requires at least two arguments it is extended by the cl operator. In case
62
   *of more than one argument it corresponds to or otherwise it is the identity.
63
   **/
64
  Node d_cl;
65
  /**
66
   * This method adds a new ALETHE_RULE step to the proof, with `rule` as the
67
   * first argument, the original conclusion `res` as the second and
68
   * `conclusion`, the result to be printed (which may or may not differ from
69
   * `res`), as the third.
70
   *
71
   * @param rule The id of the Alethe rule,
72
   * @param res The expected result of the application,
73
   * @param conclusion The conclusion to be printed for the step
74
   * @param children The children of the application,
75
   * @param args The arguments of the application
76
   * @param cdp The proof to add to
77
   * @return True if the step could be added, or false if not.
78
   */
79
  bool addAletheStep(AletheRule rule,
80
                     Node res,
81
                     Node conclusion,
82
                     const std::vector<Node>& children,
83
                     const std::vector<Node>& args,
84
                     CDProof& cdp);
85
  /**
86
   * As above, but for proof nodes with original conclusions of the form `(or F1
87
   * ... Fn)` whose conclusion-to-be-printed must be `(cl F1 ... Fn)`.
88
   *
89
   * This method internally calls addAletheStep. The kind of the given Node has
90
   * to be OR.
91
   *
92
   * @param rule The id of the Alethe rule,
93
   * @param res The expected result of the application in form (or F1 ... Fn),
94
   * @param children The children of the application,
95
   * @param args The arguments of the application
96
   * @param cdp The proof to add to
97
   * @return True if the step could be added, or false if not.
98
   */
99
  bool addAletheStepFromOr(AletheRule rule,
100
		           Node res,
101
                           const std::vector<Node>& children,
102
                           const std::vector<Node>& args,
103
                           CDProof& cdp);
104
};
105
106
/**
107
 * Final callback class used by the Alethe converter to add the last step to a
108
 * proof in the following two cases. The last step should always be printed as
109
 * (cl).
110
 *
111
 * 1. If the last step of a proof which is false is reached it is printed as (cl
112
 *    false).
113
 * 2. If one of the assumptions is false it is printed as false.
114
 *
115
 * Thus, an additional resolution step with (cl (not true)) has to be added to
116
 * transfer (cl false) into (cl).
117
 */
118
class AletheProofPostprocessFinalCallback : public ProofNodeUpdaterCallback
119
{
120
 public:
121
  AletheProofPostprocessFinalCallback(ProofNodeManager* pnm,
122
                                      AletheNodeConverter& anc);
123
  ~AletheProofPostprocessFinalCallback() {}
124
  /** Should proof pn be updated? It should, if the last step is printed as (cl
125
   * false) or if it is an assumption (in that case it is printed as false).
126
   * Since the proof node should not be traversed, this method will always set
127
   * continueUpdate to false.
128
   */
129
  bool shouldUpdate(std::shared_ptr<ProofNode> pn,
130
                    const std::vector<Node>& fa,
131
                    bool& continueUpdate) override;
132
  /**
133
   * This method gets a proof node pn. If the last step of the proof is false
134
   * which is printed as (cl false) it updates the proof for false such that
135
   * (cl) is printed instead.
136
   */
137
  bool update(Node res,
138
              PfRule id,
139
              const std::vector<Node>& children,
140
              const std::vector<Node>& args,
141
              CDProof* cdp,
142
              bool& continueUpdate) override;
143
144
 private:
145
  /** The proof node manager */
146
  ProofNodeManager* d_pnm;
147
  /** The Alethe node converter */
148
  AletheNodeConverter& d_anc;
149
  /** The cl operator is defined as described in the
150
   * AletheProofPostprocessCallback class above
151
   **/
152
  Node d_cl;
153
};
154
155
/**
156
 * The proof postprocessor module. This postprocesses a proof node into one
157
 * using the rules from the Alethe calculus.
158
 */
159
class AletheProofPostprocess
160
{
161
 public:
162
  AletheProofPostprocess(ProofNodeManager* pnm, AletheNodeConverter& anc);
163
  ~AletheProofPostprocess();
164
  /** post-process */
165
  void process(std::shared_ptr<ProofNode> pf);
166
167
 private:
168
  /** The proof node manager */
169
  ProofNodeManager* d_pnm;
170
  /** The post process callback */
171
  AletheProofPostprocessCallback d_cb;
172
  /** The final post process callback */
173
  AletheProofPostprocessFinalCallback d_fcb;
174
};
175
176
}  // namespace proof
177
178
}  // namespace cvc5
179
180
#endif