65 lines
2.6 KiB
65 lines
2.6 KiB
#include "storm/automata/LTL2DeterministicAutomaton.h"
|
|
#include "storm/automata/DeterministicAutomaton.h"
|
|
|
|
#include "storm/logic/Formula.h"
|
|
#include "storm/utility/macros.h"
|
|
#include "storm/exceptions/ExpressionEvaluationException.h"
|
|
#include "storm/exceptions/WrongFormatException.h"
|
|
|
|
#ifdef STORM_HAVE_SPOT
|
|
#include "spot/tl/formula.hh"
|
|
#include "spot/tl/parse.hh"
|
|
#include "spot/twaalgos/translate.hh"
|
|
#include "spot/twaalgos/hoa.hh"
|
|
#include "spot/twaalgos/totgba.hh"
|
|
#include "spot/twaalgos/toparity.hh"
|
|
#include "spot/twa/acc.hh"
|
|
#endif
|
|
|
|
namespace storm {
|
|
namespace automata {
|
|
|
|
std::shared_ptr<DeterministicAutomaton> LTL2DeterministicAutomaton::ltl2da(storm::logic::Formula const& f, bool dnf) {
|
|
#ifdef STORM_HAVE_SPOT
|
|
|
|
std::string prefixLtl = f.toPrefixString();
|
|
spot::parsed_formula spotPrefixLtl = spot::parse_prefix_ltl(prefixLtl);
|
|
if(!spotPrefixLtl.errors.empty()){
|
|
std::ostringstream errorMsg;
|
|
spotPrefixLtl.format_errors(errorMsg);
|
|
STORM_LOG_THROW(false, storm::exceptions::ExpressionEvaluationException, "Spot could not parse formula: " << prefixLtl << ": " << errorMsg.str());
|
|
}
|
|
spot::formula spotFormula = spotPrefixLtl.f;
|
|
|
|
|
|
// Request a deterministic, complete automaton with state-based acceptance
|
|
spot::translator trans = spot::translator();
|
|
trans.set_type(spot::postprocessor::Generic); //Generic
|
|
trans.set_pref(spot::postprocessor::Deterministic | spot::postprocessor::SBAcc | spot::postprocessor::Complete);
|
|
STORM_LOG_INFO("Construct deterministic automaton for "<< spotFormula);
|
|
auto aut = trans.run(spotFormula);
|
|
|
|
// TODO necessary for MDP LTL-MC
|
|
if(!(aut->get_acceptance().is_dnf()) && dnf){
|
|
STORM_LOG_INFO("Convert acceptance condition "<< aut->get_acceptance() << " into DNF...");
|
|
// Transform the acceptance condition in disjunctive normal form and merge all the Fin-sets of each clause
|
|
aut = to_generalized_rabin(aut,true);
|
|
}
|
|
|
|
|
|
STORM_LOG_INFO(aut->get_acceptance());
|
|
|
|
std::stringstream autStream;
|
|
// Print reachable states in HOA format, implicit edges (i), state-based acceptance (s)
|
|
spot::print_hoa(autStream, aut, "is");
|
|
|
|
storm::automata::DeterministicAutomaton::ptr da = DeterministicAutomaton::parse(autStream);
|
|
|
|
return da;
|
|
|
|
#else
|
|
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Storm is compiled without Spot support.");
|
|
#endif
|
|
}
|
|
}
|
|
}
|