/*****************************************************************************/
/*!
*\file expr_transform.h
*\brief Generally Useful Expression Transformations
*
* Author: Clark Barrett
*
* Created: Fri Aug 5 16:11:51 2005
*
*
*
* 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.
*
*
*
*/
/*****************************************************************************/
#ifndef _cvc3__include__expr_transform_h_
#define _cvc3__include__expr_transform_h_
#include "expr.h"
namespace CVC3 {
class VCL;
class TheoryCore;
class CommonProofRules;
class CoreProofRules;
class ExprTransform {
TheoryCore* d_core;
CommonProofRules* d_commonRules;
CoreProofRules* d_rules;
//! Cache for pushNegation()
ExprMap d_pushNegCache;
public:
ExprTransform(TheoryCore* core);
~ExprTransform() {}
//! Simplification that avoids stack overflow
/*! Stack overflow is avoided by traversing the expression to depths that are
multiples of 5000 until the bottom is reached. Then, simplification is done
bottom-up.
*/
Theorem smartSimplify(const Expr& e, ExprMap& cache);
Theorem preprocess(const Expr& e);
Theorem preprocess(const Theorem& thm);
//! Push all negations down to the leaves
Theorem pushNegation(const Expr& e);
//! Auxiliary recursive function for pushNegation().
Theorem pushNegationRec(const Expr& e, bool neg);
//! Its version for transitivity
Theorem pushNegationRec(const Theorem& e, bool neg);
//! Push negation one level down. Takes 'e' which is 'NOT e[0]'
Theorem pushNegation1(const Expr& e);
/*@}*/ // end of preprocessor stuff
};
}
#endif