/*****************************************************************************/ /*! * \file theory_uf.h * * Author: Clark Barrett * * Created: Fri Jan 17 18:25:40 2003 * *
* * 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__theory_uf_h_ #define _cvc3__include__theory_uf_h_ #include "theory.h" namespace CVC3 { class UFProofRules; //! Local kinds for transitive closure of binary relations typedef enum { TRANS_CLOSURE = 500, OLD_ARROW, // for backward compatibility with old function declarations } UFKinds; /*****************************************************************************/ /*! *\class TheoryUF *\ingroup Theories *\brief This theory handles uninterpreted functions. * * Author: Clark Barrett * * Created: Sat Feb 8 14:51:19 2003 */ /*****************************************************************************/ class TheoryUF :public Theory { UFProofRules* d_rules; //! Flag to include function applications to the concrete model const bool& d_applicationsInModel; // For computing transitive closure of binary relations typedef struct TCMapPair { ExprMap*> appearsFirstMap; ExprMap*> appearsSecondMap; } TCMapPair; ExprMap d_transClosureMap; //! Backtracking list of function applications /*! Used for building concrete models and beta-reducing * lambda-expressions. */ CDList d_funApplications; //! Pointer to the last unprocessed element (for lambda expansions) CDO d_funApplicationsIdx; public: TheoryUF(TheoryCore* core); ~TheoryUF(); // Trusted method that creates the proof rules class (used in constructor). // Implemented in uf_theorem_producer.cpp UFProofRules* createProofRules(); // Theory interface void addSharedTerm(const Expr& e) {} void assertFact(const Theorem& e); void checkSat(bool fullEffort); Theorem rewrite(const Expr& e); void setup(const Expr& e); void update(const Theorem& e, const Expr& d); void checkType(const Expr& e); void computeType(const Expr& e); Type computeBaseType(const Type& t); void computeModelTerm(const Expr& e, std::vector& v); void computeModel(const Expr& e, std::vector& vars); Expr computeTCC(const Expr& e); virtual Expr parseExprOp(const Expr& e); ExprStream& print(ExprStream& os, const Expr& e); //! Create a new LAMBDA-abstraction Expr lambdaExpr(const std::vector& vars, const Expr& body); //! Create a transitive closure expression Expr transClosureExpr(const std::string& name, const Expr& e1, const Expr& e2); }; } #endif