/*****************************************************************************/
/*!
* \file theorem_producer.cpp
* \brief See theorem_producer.h file for more information.
*
* Author: Sergey Berezin
*
* Created: Thu Feb 20 16:22:31 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.
*
*
*
*/
/*****************************************************************************/
#define _CVC3_TRUSTED_
#include "theorem_producer.h"
#include "sound_exception.h"
#include "command_line_flags.h"
using namespace std;
using namespace CVC3;
void TheoremProducer::soundError(const std::string& file, int line,
const std::string& cond,
const std::string& msg)
{
ostringstream ss;
ss << "in " << file << ":" << line << " (" << cond << ")\n" << msg;
throw SoundException(ss.str());
}
// Constructor
TheoremProducer::TheoremProducer(TheoremManager *tm)
: d_tm(tm), d_em(tm->getEM()),
d_checkProofs(&(tm->getFlags()["check-proofs"].getBool())),
// Proof rule application: will have kids
d_pfOp(PF_APPLY)
{ d_hole = d_em->newLeafExpr(PF_HOLE); }
Proof TheoremProducer::newLabel(const Expr& e)
{
// Counter to generate unique proof labels ('u')
static int s_counter = 0;
static string s_prefix = "assump";
ostringstream ss;
ss << s_counter++;
//TODO: Get rid of hack storing expr in Type field
Expr var = d_tm->getEM()->newBoundVarExpr(s_prefix, ss.str(), Type(e, true));
return Proof(var);
}
Proof TheoremProducer::newPf(const string& name)
{ return Proof(Expr(d_pfOp, d_em->newVarExpr(name))); }
Proof TheoremProducer::newPf(const string& name, const Expr& e)
{ return Proof(Expr(d_pfOp, d_em->newVarExpr(name), e)); }
Proof TheoremProducer::newPf(const string& name, const Proof& pf)
{ return Proof(Expr(d_pfOp, d_em->newVarExpr(name), pf.getExpr())); }
Proof TheoremProducer::newPf(const string& name,
const Expr& e1, const Expr& e2)
{ return Proof(Expr(d_pfOp, d_em->newVarExpr(name), e1, e2)); }
Proof TheoremProducer::newPf(const string& name, const Expr& e,
const Proof& pf)
{ return Proof(Expr(d_pfOp, d_em->newVarExpr(name), e, pf.getExpr())); }
Proof TheoremProducer::newPf(const string& name, const Expr& e1,
const Expr& e2, const Expr& e3) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.push_back(e1);
kids.push_back(e2);
kids.push_back(e3);
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name, const Expr& e1,
const Expr& e2, const Proof& pf) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.push_back(e1);
kids.push_back(e2);
kids.push_back(pf.getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
Expr::iterator begin,
const Expr::iterator &end) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.insert(kids.end(), begin, end);
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name, const Expr& e,
Expr::iterator begin, const Expr::iterator &end) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.push_back(e);
kids.insert(kids.end(), begin, end);
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
Expr::iterator begin, const Expr::iterator &end,
const vector& pfs) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.insert(kids.end(), begin, end);
for(vector::const_iterator i=pfs.begin(), iend=pfs.end();
i != iend; ++i)
kids.push_back(i->getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const vector& args) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.insert(kids.end(), args.begin(), args.end());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const Expr& e,
const vector& args) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.push_back(e);
kids.insert(kids.end(), args.begin(), args.end());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const Expr& e,
const vector& pfs) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.push_back(e);
for(vector::const_iterator i=pfs.begin(), iend=pfs.end();
i != iend; ++i)
kids.push_back(i->getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const Expr& e1, const Expr& e2,
const vector& pfs) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.push_back(e1);
kids.push_back(e2);
for(vector::const_iterator i=pfs.begin(), iend=pfs.end();
i != iend; ++i)
kids.push_back(i->getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const vector& pfs) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
for(vector::const_iterator i=pfs.begin(), iend=pfs.end();
i != iend; ++i)
kids.push_back(i->getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const vector& args,
const Proof& pf) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.insert(kids.end(), args.begin(), args.end());
kids.push_back(pf.getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const string& name,
const vector& args,
const vector& pfs) {
vector kids;
kids.push_back(d_em->newVarExpr(name));
kids.insert(kids.end(), args.begin(), args.end());
for(vector::const_iterator i=pfs.begin(), iend=pfs.end();
i != iend; ++i)
kids.push_back(i->getExpr());
return Proof(Expr(d_pfOp, kids));
}
Proof TheoremProducer::newPf(const Proof& label, const Expr& frm,
const Proof& pf) {
Expr v(label.getExpr());
IF_DEBUG(Type tp(frm, true));
DebugAssert(v.isVar() && v.getType() == tp,
"TheoremProducer::newPf: bad variable in LAMBDA expression: "
+v.toString());
vector u;
u.push_back(v);
return Proof(d_tm->getEM()->newClosureExpr(LAMBDA, u, pf.getExpr()));
}
Proof TheoremProducer::newPf(const Proof& label, const Proof& pf) {
Expr v(label.getExpr());
DebugAssert(v.isVar(),
"TheoremProducer::newPf: bad variable in LAMBDA expression: "
+v.toString());
vector u;
u.push_back(v);
return Proof(d_tm->getEM()->newClosureExpr(LAMBDA, u, pf.getExpr()));
}
Proof TheoremProducer::newPf(const std::vector& labels,
const std::vector& frms,
const Proof& pf) {
std::vector u;
for(unsigned i=0; igetEM()->newClosureExpr(LAMBDA, u, pf.getExpr()));
}
Proof TheoremProducer::newPf(const std::vector& labels,
const Proof& pf) {
std::vector u;
for(unsigned i=0; igetEM()->newClosureExpr(LAMBDA, u, pf.getExpr()));
}