#ifndef __Inferences_ProofExtra__
#define __Inferences_ProofExtra__
#include "Kernel/Term.hpp"
#include "Lib/ProofExtra.hpp"
namespace Inferences {
struct LiteralInferenceExtra : public InferenceExtra {
LiteralInferenceExtra(Kernel::Literal *selected) : selectedLiteral(selected) {}
void output(std::ostream &out) const override;
Kernel::Literal *selectedLiteral;
};
struct TwoLiteralInferenceExtra : public InferenceExtra {
struct SynthesisExtra {
SynthesisExtra(Kernel::Literal *conditionLiteral, Kernel::Literal *thenLiteral, Kernel::Literal* elseLiteral) : condition(conditionLiteral), thenLit(thenLiteral), elseLit(elseLiteral) {}
Kernel::Literal *condition;
Kernel::Literal *thenLit;
Kernel::Literal *elseLit;
};
TwoLiteralInferenceExtra(Kernel::Literal *selected, Kernel::Literal *other, Kernel::Literal *condition = nullptr, Kernel::Literal* thenLit = nullptr, Kernel::Literal* elseLit = nullptr)
: selectedLiteral(selected), otherLiteral(other), synthesisExtra(condition, thenLit, elseLit) {}
void output(std::ostream &out) const override;
LiteralInferenceExtra selectedLiteral;
Kernel::Literal *otherLiteral;
SynthesisExtra synthesisExtra;
};
struct RewriteInferenceExtra : public InferenceExtra {
RewriteInferenceExtra(Kernel::TermList lhs, Kernel::TermList target)
: lhs(lhs), rewritten(target) {}
void output(std::ostream &out) const override;
Kernel::TermList lhs;
Kernel::TermList rewritten;
};
struct TwoLiteralRewriteInferenceExtra : public InferenceExtra {
TwoLiteralRewriteInferenceExtra(
Kernel::Literal *selected,
Kernel::Literal *other,
Kernel::TermList lhs,
Kernel::TermList rewritten,
Kernel::Literal *condition = nullptr,
Kernel::Literal *thenLit = nullptr,
Kernel::Literal *elseLit = nullptr)
: selected(selected, other, condition, thenLit, elseLit), rewrite(lhs, rewritten) {}
void output(std::ostream &out) const override;
TwoLiteralInferenceExtra selected;
RewriteInferenceExtra rewrite;
};
}
#endif