#include "Lib/Environment.hpp"
#include "Saturation/SaturationAlgorithm.hpp"
#include "FMB/FiniteModelBuilder.hpp"
#include "SAT/Z3MainLoop.hpp"
#include "Shell/Options.hpp"
#include "Shell/UIHelper.hpp"
#include "Clause.hpp"
#include "Problem.hpp"
#include "MainLoop.hpp"
using namespace Kernel;
using namespace Saturation;
using namespace FMB;
void MainLoopResult::updateStatistics()
{
env.statistics->terminationReason = terminationReason;
env.statistics->refutation = refutation;
env.statistics->saturatedSet = saturatedSet;
if(refutation) {
env.statistics->maxInductionDepth = refutation->inference().inductionDepth();
}
}
MainLoopResult MainLoop::run()
{
TIME_TRACE("main loop");
try {
TIME_TRACE_EXPR("init", init());
return TIME_TRACE_EXPR("run", runImpl());
}
catch(RefutationFoundException& rs)
{
return MainLoopResult(TerminationReason::REFUTATION, rs.refutation);
}
catch(TimeLimitExceededException&)
{
return MainLoopResult(TerminationReason::TIME_LIMIT);
}
catch(ActivationLimitExceededException&)
{
return MainLoopResult(TerminationReason::ACTIVATION_LIMIT);
}
catch(MainLoopFinishedException& e)
{
return e.result;
}
}
bool MainLoop::isRefutation(Clause* cl)
{
return cl->isEmpty() && cl->noSplits();
}
MainLoop* MainLoop::createFromOptions(Problem& prb, const Options& opt)
{
#if VZ3
bool isComplete = false;
#endif
MainLoop* res;
switch (opt.saturationAlgorithm()) {
case Options::SaturationAlgorithm::FINITE_MODEL_BUILDING:
if(env.getMainProblem()->hasPolymorphicSym() || env.getMainProblem()->isHigherOrder()){
USER_ERROR("Finite model building is currently not compatible with polymorphism or higher-order constructs");
}
if(env.options->outputMode() == Shell::Options::Output::UCORE){
USER_ERROR("Finite model building is not compatible with producing unsat cores");
}
res = new FiniteModelBuilder(prb,opt);
break;
#if VZ3
case Options::SaturationAlgorithm::Z3:
if(!isComplete || !prb.getProperty()->allNonTheoryClausesGround()){
reportSpiderStatus('u');
USER_ERROR("Z3 saturation algorithm is only appropriate where preprocessing produces a ground problem");
}
res = new SAT::Z3MainLoop(prb,opt);
break;
#endif
default:
res = SaturationAlgorithm::createFromOptions(prb, opt);
break;
}
return res;
}