10 UnaryCNFMethod::UnaryCNFMethod(
const std::set<std::string> &SpSet,
const std::set<std::string> &SmSet,
const std::set<std::string> &SSet,
const std::set<std::string> &prefixesSet,
const std::set<char> &alphabetSet,
unsigned int n) :
11 SATCNFMethod(SpSet, SmSet, SSet, prefixesSet, alphabetSet, n)
28 auto pair = std::make_pair(u, q);
30 m_stateName.insert(state(pair, var));
42 clause[q] = mkLit(m_stateName.find(std::make_pair(u, q))->second,
false);
50 for (
const auto &u : m_prefixes) {
54 Var qState = m_stateName.find(std::make_pair(u, q))->second;
55 Var pState = m_stateName.find(std::make_pair(u, p))->second;
56 clause[0] = mkLit(qState,
true);
57 clause[1] = mkLit(pState,
true);
67 for (
const auto &ua : m_prefixes) {
68 for (
const auto &va : m_prefixes) {
71 if (ua.size() > 0 && va.size() > 0 && ua.at(ua.size() - 1) == va.at(va.size() - 1)) {
72 std::string u = ua.substr(0, ua.size() - 1);
73 std::string v = va.substr(0, va.size() - 1);
77 Var upState = m_stateName.find(std::make_pair(u, p))->second;
78 Var vpState = m_stateName.find(std::make_pair(v, p))->second;
79 Var uaqState = m_stateName.find(std::make_pair(ua, q))->second;
80 Var vaqState = m_stateName.find(std::make_pair(va, q))->second;
82 clause[0] = mkLit(upState,
true);
83 clause[1] = mkLit(vpState,
true);
84 clause[2] = mkLit(uaqState,
false);
85 clause[3] = mkLit(vaqState,
true);
88 clause[0] = mkLit(upState,
true);
89 clause[1] = mkLit(vpState,
true);
90 clause[2] = mkLit(uaqState,
true);
91 clause[3] = mkLit(vaqState,
false);
102 for (
const auto &u :
m_Sp) {
103 for (
const auto &v :
m_Sm) {
105 Var uqState = m_stateName.find(std::make_pair(u, q))->second;
106 Var vqState = m_stateName.find(std::make_pair(v, q))->second;
108 clause[0] = mkLit(uqState,
true);
109 clause[1] = mkLit(vqState,
true);
119 unsigned int initial = 0;
121 Var v = m_stateName.find(std::make_pair(
"", i))->second;
122 if (model[v] == l_True) {
128 std::unique_ptr<DFA<char>> dfa = std::make_unique<DFA<char>>(initial,
m_Sp.find(
"") !=
m_Sp.end());
133 bool accepting =
false;
134 for (
const auto &u :
m_Sp) {
135 Var var = m_stateName.find(std::make_pair(u, q))->second;
136 if (model[var] == l_True) {
142 dfa->addState(q, accepting);
152 if (ua.size() > 0 && ua.at(ua.size() - 1) == a){
153 std::string u = ua.substr(0, ua.size() - 1);
155 Var uiState = m_stateName.find(std::make_pair(u, i))->second;
156 Var uajState = m_stateName.find(std::make_pair(ua, j))->second;
158 if (model[uiState] == l_True && model[uajState] == l_True) {
160 dfa->addTransition(i, a, j);
167 dfa->addTransition(i, a, i);
const std::set< char > m_alphabet
The namespace of the library.
void addClause(const Minisat::vec< Minisat::Lit > &clause)
Adds a new clause to the SAT solver.
const std::set< std::string > m_Sm
The set of words to reject .
const std::set< std::string > m_prefixes
void createVariables() override
Creates all needed variables for the method.
static bool s_registered
Useful to make sure the template is correctly used by the compiler.
const unsigned int m_numberStates
The number of states in the DFA to construct.
Base class for every method that relies on a SAT solver.
std::unique_ptr< DFA< char > > toDFA(const Minisat::vec< Minisat::lbool > &model) const override
Effectively creates the DFA from the values of the variables in the given model.
const std::set< std::string > m_Sp
The set of words to accept .
static std::string getFactoryName()
void createClauses() override
Creates all needed clauses for the method.
Minisat::Var newVariable()
Creates a new variable in the SAT solver.