4 changed files with 689 additions and 548 deletions
-
719src/storm-dft/modelchecker/dft/DFTASFChecker.cpp
-
87src/storm-dft/modelchecker/dft/DFTASFChecker.h
-
407src/storm-dft/modelchecker/dft/SmtConstraint.cpp
-
24src/storm-dft/modelchecker/dft/SmtConstraint.h
@ -0,0 +1,407 @@ |
|||||
|
#include "DFTASFChecker.h"
|
||||
|
#include <string>
|
||||
|
|
||||
|
namespace storm { |
||||
|
|
||||
|
namespace modelchecker { |
||||
|
|
||||
|
/*
|
||||
|
* Variable[VarIndex] is the maximum of the others |
||||
|
*/ |
||||
|
class IsMaximum : public SmtConstraint { |
||||
|
public: |
||||
|
IsMaximum(uint64_t varIndex, std::vector<uint64_t> const &varIndices) : varIndex(varIndex), |
||||
|
varIndices(varIndices) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsMaximum() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(and "; |
||||
|
// assert it is largereq than all values.
|
||||
|
for (auto const &ovi : varIndices) { |
||||
|
sstr << "(>= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; |
||||
|
} |
||||
|
// assert it is one of the values.
|
||||
|
sstr << "(or "; |
||||
|
for (auto const &ovi : varIndices) { |
||||
|
sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; |
||||
|
} |
||||
|
sstr << ")"; // end of the or
|
||||
|
sstr << ")"; // end outer and.
|
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
std::vector<uint64_t> varIndices; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
* First is the minimum of the others |
||||
|
*/ |
||||
|
class IsMinimum : public SmtConstraint { |
||||
|
public: |
||||
|
IsMinimum(uint64_t varIndex, std::vector<uint64_t> const &varIndices) : varIndex(varIndex), |
||||
|
varIndices(varIndices) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsMinimum() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(and "; |
||||
|
// assert it is smallereq than all values.
|
||||
|
for (auto const &ovi : varIndices) { |
||||
|
sstr << "(<= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; |
||||
|
} |
||||
|
// assert it is one of the values.
|
||||
|
sstr << "(or "; |
||||
|
for (auto const &ovi : varIndices) { |
||||
|
sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; |
||||
|
} |
||||
|
sstr << ")"; // end of the or
|
||||
|
sstr << ")"; // end outer and.
|
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
std::vector<uint64_t> varIndices; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class BetweenValues : public SmtConstraint { |
||||
|
public: |
||||
|
BetweenValues(uint64_t varIndex, uint64_t lower, uint64_t upper) : varIndex(varIndex), upperBound(upper), |
||||
|
lowerBound(lower) { |
||||
|
} |
||||
|
|
||||
|
virtual ~BetweenValues() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(and "; |
||||
|
sstr << "(>= " << varNames.at(varIndex) << " " << lowerBound << ")"; |
||||
|
sstr << "(<= " << varNames.at(varIndex) << " " << upperBound << ")"; |
||||
|
sstr << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
uint64_t upperBound; |
||||
|
uint64_t lowerBound; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class And : public SmtConstraint { |
||||
|
public: |
||||
|
And(std::vector<std::shared_ptr<SmtConstraint>> const &constraints) : constraints(constraints) { |
||||
|
} |
||||
|
|
||||
|
virtual ~And() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
if (constraints.empty()) { |
||||
|
sstr << "true"; |
||||
|
} else { |
||||
|
sstr << "(and"; |
||||
|
for (auto const &c : constraints) { |
||||
|
sstr << " " << c->toSmtlib2(varNames); |
||||
|
} |
||||
|
sstr << ")"; |
||||
|
} |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::vector<std::shared_ptr<SmtConstraint>> constraints; |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class Or : public SmtConstraint { |
||||
|
public: |
||||
|
Or(std::vector<std::shared_ptr<SmtConstraint>> const &constraints) : constraints(constraints) { |
||||
|
} |
||||
|
|
||||
|
virtual ~Or() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
if (constraints.empty()) { |
||||
|
sstr << "false"; |
||||
|
} else { |
||||
|
sstr << "(or"; |
||||
|
for (auto const &c : constraints) { |
||||
|
sstr << " " << c->toSmtlib2(varNames); |
||||
|
} |
||||
|
sstr << ")"; |
||||
|
} |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::vector<std::shared_ptr<SmtConstraint>> constraints; |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class Implies : public SmtConstraint { |
||||
|
public: |
||||
|
Implies(std::shared_ptr<SmtConstraint> l, std::shared_ptr<SmtConstraint> r) : lhs(l), rhs(r) { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(=> " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<SmtConstraint> lhs; |
||||
|
std::shared_ptr<SmtConstraint> rhs; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class Iff : public SmtConstraint { |
||||
|
public: |
||||
|
Iff(std::shared_ptr<SmtConstraint> l, std::shared_ptr<SmtConstraint> r) : lhs(l), rhs(r) { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(= " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<SmtConstraint> lhs; |
||||
|
std::shared_ptr<SmtConstraint> rhs; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IsTrue : public SmtConstraint { |
||||
|
public: |
||||
|
IsTrue(bool val) : value(val) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsTrue() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << (value ? "true" : "false"); |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
bool value; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IsBoolValue : public SmtConstraint { |
||||
|
public: |
||||
|
IsBoolValue(uint64_t varIndex, bool val) : varIndex(varIndex), value(val) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsBoolValue() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
assert(varIndex < varNames.size()); |
||||
|
if (value) { |
||||
|
sstr << varNames.at(varIndex); |
||||
|
} else { |
||||
|
sstr << "(not " << varNames.at(varIndex) << ")"; |
||||
|
} |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
bool value; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IsConstantValue : public SmtConstraint { |
||||
|
public: |
||||
|
IsConstantValue(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsConstantValue() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
assert(varIndex < varNames.size()); |
||||
|
sstr << "(= " << varNames.at(varIndex) << " " << value << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
uint64_t value; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IsLessConstant : public SmtConstraint { |
||||
|
public: |
||||
|
IsLessConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsLessConstant() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
assert(varIndex < varNames.size()); |
||||
|
sstr << "(< " << varNames.at(varIndex) << " " << value << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
uint64_t value; |
||||
|
}; |
||||
|
|
||||
|
class IsLessEqualConstant : public SmtConstraint { |
||||
|
public: |
||||
|
IsLessEqualConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsLessEqualConstant() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
assert(varIndex < varNames.size()); |
||||
|
sstr << "(<= " << varNames.at(varIndex) << " " << value << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t varIndex; |
||||
|
uint64_t value; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IsEqual : public SmtConstraint { |
||||
|
public: |
||||
|
IsEqual(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsEqual() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
return "(= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")"; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t var1Index; |
||||
|
uint64_t var2Index; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IsLess : public SmtConstraint { |
||||
|
public: |
||||
|
IsLess(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) { |
||||
|
} |
||||
|
|
||||
|
virtual ~IsLess() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
return "(< " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")"; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
uint64_t var1Index; |
||||
|
uint64_t var2Index; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class PairwiseDifferent : public SmtConstraint { |
||||
|
public: |
||||
|
PairwiseDifferent(std::vector<uint64_t> const &indices) : varIndices(indices) { |
||||
|
} |
||||
|
|
||||
|
virtual ~PairwiseDifferent() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(distinct"; |
||||
|
// for(uint64_t i = 0; i < varIndices.size(); ++i) {
|
||||
|
// for(uint64_t j = i + 1; j < varIndices.size(); ++j) {
|
||||
|
// sstr << "()";
|
||||
|
// }
|
||||
|
// }
|
||||
|
for (auto const &varIndex : varIndices) { |
||||
|
sstr << " " << varNames.at(varIndex); |
||||
|
} |
||||
|
sstr << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::vector<uint64_t> varIndices; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class Sorted : public SmtConstraint { |
||||
|
public: |
||||
|
Sorted(std::vector<uint64_t> varIndices) : varIndices(varIndices) { |
||||
|
} |
||||
|
|
||||
|
virtual ~Sorted() { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(and "; |
||||
|
for (uint64_t i = 1; i < varIndices.size(); ++i) { |
||||
|
sstr << "(<= " << varNames.at(varIndices.at(i - 1)) << " " << varNames.at(varIndices.at(i)) << ")"; |
||||
|
} |
||||
|
sstr << ") "; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::vector<uint64_t> varIndices; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IfThenElse : public SmtConstraint { |
||||
|
public: |
||||
|
IfThenElse(std::shared_ptr<SmtConstraint> ifC, std::shared_ptr<SmtConstraint> thenC, |
||||
|
std::shared_ptr<SmtConstraint> elseC) : ifConstraint(ifC), thenConstraint(thenC), |
||||
|
elseConstraint(elseC) { |
||||
|
} |
||||
|
|
||||
|
std::string toSmtlib2(std::vector<std::string> const &varNames) const override { |
||||
|
std::stringstream sstr; |
||||
|
sstr << "(ite " << ifConstraint->toSmtlib2(varNames) << " " << thenConstraint->toSmtlib2(varNames) |
||||
|
<< " " << elseConstraint->toSmtlib2(varNames) << ")"; |
||||
|
return sstr.str(); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<SmtConstraint> ifConstraint; |
||||
|
std::shared_ptr<SmtConstraint> thenConstraint; |
||||
|
std::shared_ptr<SmtConstraint> elseConstraint; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,24 @@ |
|||||
|
#include <string> |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
class SmtConstraint { |
||||
|
public: |
||||
|
virtual ~SmtConstraint() { |
||||
|
} |
||||
|
|
||||
|
virtual std::string toSmtlib2(std::vector<std::string> const &varNames) const = 0; |
||||
|
|
||||
|
virtual std::string description() const { |
||||
|
return descript; |
||||
|
} |
||||
|
|
||||
|
void setDescription(std::string const &descr) { |
||||
|
descript = descr; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
std::string descript; |
||||
|
}; |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue