/*****************************************************************************/
/*!
* \file quant_proof_rules.h
*
* Author: Daniel Wichs
*
* Created: Jul 07 22:22:38 GMT 2003
*
* <hr>
*
* License to use, copy, modify, sell and/or distribute this software
* and its documentation for any purpose is hereby granted without
* royalty, subject to the terms and conditions defined in the \ref
* LICENSE file provided with this distribution.
*
* <hr>
*
*/
/*****************************************************************************/
#ifndef _cvc3__quant_proof_rules_h_
#define _cvc3__quant_proof_rules_h_
#include <vector>
namespace CVC3 {
class Expr;
class Theorem;
class QuantProofRules {
public:
//! Destructor
virtual ~QuantProofRules() { }
virtual Theorem addNewConst(const Expr& e) =0;
//! ==> NOT EXISTS (vars): e IFF FORALL (vars) NOT e
virtual Theorem rewriteNotExists(const Expr& e) = 0;
//! ==> NOT FORALL (vars): e IFF EXISTS (vars) NOT e
virtual Theorem rewriteNotForall(const Expr& e) = 0;
//! Instantiate a universally quantified formula
/*! From T|-FORALL(var): e generate T|-e' where e' is obtained
* from e by instantiating bound variables with terms in
* vector<Expr>& terms. The vector of terms should be the same
* size as the vector of bound variables in e. Also elements in
* each position i need to have matching types.
* \param t1 is the quantifier (a Theorem)
* \param terms are the terms to instantiate.
* \param quantLevel is the quantification level for the theorem.
*/
virtual Theorem universalInst(const Theorem& t1,
const std::vector<Expr>& terms, int quantLevel) = 0;
virtual Theorem universalInst(const Theorem& t1,
const std::vector<Expr>& terms) = 0;
virtual Theorem partialUniversalInst(const Theorem& t1,
const std::vector<Expr>& terms,
int quantLevel) = 0;
/*! @brief From T|- QUANTIFIER (vars): e we get T|-QUANTIFIER(vars') e
* where vars' is obtained from vars by removing all bound variables
* not used in e. If vars' is empty the produced theorem is just T|-e
*/
virtual Theorem boundVarElim(const Theorem& t1) = 0;
virtual Theorem packVar(const Theorem& t1) = 0;
virtual Theorem pullVarOut(const Theorem& t1) = 0;
virtual Theorem adjustVarUniv(const Theorem& t1,
const std::vector<Expr>& newBvs) = 0;
};
}
#endif
syntax highlighted by Code2HTML, v. 0.9.1