/*****************************************************************************/
/*!
* \file translator.h
* \brief An exception to be thrown by the smtlib translator.
*
* Author: Clark Barrett
*
* Created: Sat Jun 25 18:03:09 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__translator_h_
#define _cvc3__translator_h_
#include
#include
#include
#include "queryresult.h"
namespace CVC3 {
class Expr;
class Type;
class ExprManager;
class ExprStream;
class TheoryCore;
class TheoryUF;
class TheoryArith;
class TheoryArray;
class TheoryQuant;
class TheoryRecords;
class TheorySimulate;
class TheoryBitvector;
class TheoryDatatype;
template class ExprMap;
//! Used to keep track of which subset of arith is being used
typedef enum {
NOT_USED = 0,
TERMS_ONLY,
DIFF_ONLY,
LINEAR,
NONLINEAR
} ArithLang;
//All the translation code should go here
class Translator {
ExprManager* d_em;
const bool& d_translate;
const bool& d_real2int;
const bool& d_convertArith;
const std::string& d_convertToDiff;
bool d_iteLiftArith;
const std::string& d_expResult;
const std::string& d_category;
bool d_convertArray;
bool d_combineAssump;
//! The log file for top-level API calls in the CVC3 input language
std::ostream* d_osdump;
std::ofstream d_osdumpFile;
std::ifstream d_tmpFile;
bool d_dump, d_dumpFileOpen;
bool d_intIntArray, d_intRealArray, d_intIntRealArray, d_ax, d_unknown;
bool d_realUsed;
bool d_intUsed;
bool d_intConstUsed;
ArithLang d_langUsed;
bool d_UFIDL_ok;
bool d_arithUsed;
Expr* d_zeroVar;
TheoryCore* d_theoryCore;
TheoryUF* d_theoryUF;
TheoryArith* d_theoryArith;
TheoryArray* d_theoryArray;
TheoryQuant* d_theoryQuant;
TheoryRecords* d_theoryRecords;
TheorySimulate* d_theorySimulate;
TheoryBitvector* d_theoryBitvector;
TheoryDatatype* d_theoryDatatype;
std::vector d_dumpExprs;
std::string fileToSMTLIBIdentifier(const std::string& filename);
Expr preprocessRec(const Expr& e, ExprMap& cache);
Expr preprocess(const Expr& e, ExprMap& cache);
Expr preprocess2Rec(const Expr& e, ExprMap& cache, Type desiredType);
Expr preprocess2(const Expr& e, ExprMap& cache);
bool containsArray(const Expr& e);
Expr processType(const Expr& e);
public:
// Constructors
Translator(ExprManager* em,
const bool& translate,
const bool& real2int,
const bool& convertArith,
const std::string& convertToDiff,
bool iteLiftArith,
const std::string& expResult,
const std::string& category,
bool convertArray,
bool combineAssump);
bool start(const std::string& dumpFile);
void dump(const Expr& e, bool dumpOnly = false);
bool dumpAssertion(const Expr& e);
bool dumpQuery(const Expr& e);
void dumpQueryResult(QueryResult qres);
void finish();
void setTheoryCore(TheoryCore* theoryCore) { d_theoryCore = theoryCore; }
void setTheoryUF(TheoryUF* theoryUF) { d_theoryUF = theoryUF; }
void setTheoryArith(TheoryArith* theoryArith) { d_theoryArith = theoryArith; }
void setTheoryArray(TheoryArray* theoryArray) { d_theoryArray = theoryArray; }
void setTheoryQuant(TheoryQuant* theoryQuant) { d_theoryQuant = theoryQuant; }
void setTheoryRecords(TheoryRecords* theoryRecords) { d_theoryRecords = theoryRecords; }
void setTheorySimulate(TheorySimulate* theorySimulate) { d_theorySimulate = theorySimulate; }
void setTheoryBitvector(TheoryBitvector* theoryBitvector) { d_theoryBitvector = theoryBitvector; }
void setTheoryDatatype(TheoryDatatype* theoryDatatype) { d_theoryDatatype = theoryDatatype; }
const std::string fixConstName(const std::string& s);
//! Returns true if expression has been printed
/*! If false is returned, array theory should print expression as usual */
bool printArrayExpr(ExprStream& os, const Expr& e);
Expr zeroVar();
// Destructor
virtual ~Translator() { }
}; // end of class Translator
} // end of namespace CVC3
#endif