59 lines
2.9 KiB
59 lines
2.9 KiB
#include "src/storage/expressions/UnaryBooleanFunctionExpression.h"
|
|
#include "src/storage/expressions/BooleanLiteralExpression.h"
|
|
#include "src/utility/macros.h"
|
|
#include "src/exceptions/InvalidTypeException.h"
|
|
|
|
namespace storm {
|
|
namespace expressions {
|
|
UnaryBooleanFunctionExpression::UnaryBooleanFunctionExpression(ExpressionManager const& manager, Type const& type, std::shared_ptr<BaseExpression const> const& operand, OperatorType operatorType) : UnaryExpression(manager, type, operand), operatorType(operatorType) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
UnaryBooleanFunctionExpression::OperatorType UnaryBooleanFunctionExpression::getOperatorType() const {
|
|
return this->operatorType;
|
|
}
|
|
|
|
storm::expressions::OperatorType UnaryBooleanFunctionExpression::getOperator() const {
|
|
storm::expressions::OperatorType result = storm::expressions::OperatorType::Not;
|
|
switch (this->getOperatorType()) {
|
|
case OperatorType::Not: result = storm::expressions::OperatorType::Not;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool UnaryBooleanFunctionExpression::evaluateAsBool(Valuation const* valuation) const {
|
|
STORM_LOG_THROW(this->hasBooleanType(), storm::exceptions::InvalidTypeException, "Unable to evaluate expression as boolean.");
|
|
|
|
bool result = this->getOperand()->evaluateAsBool(valuation);
|
|
switch (this->getOperatorType()) {
|
|
case OperatorType::Not: result = !result; break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
std::shared_ptr<BaseExpression const> UnaryBooleanFunctionExpression::simplify() const {
|
|
std::shared_ptr<BaseExpression const> operandSimplified = this->getOperand()->simplify();
|
|
switch (this->getOperatorType()) {
|
|
case OperatorType::Not: if (operandSimplified->isTrue()) {
|
|
return std::shared_ptr<BaseExpression>(new BooleanLiteralExpression(this->getManager(), false));
|
|
} else if (operandSimplified->isFalse()) {
|
|
return std::shared_ptr<BaseExpression>(new BooleanLiteralExpression(this->getManager(), true));
|
|
}
|
|
}
|
|
|
|
if (operandSimplified.get() == this->getOperand().get()) {
|
|
return this->shared_from_this();
|
|
} else {
|
|
return std::shared_ptr<BaseExpression>(new UnaryBooleanFunctionExpression(this->getManager(), this->getType(), operandSimplified, this->getOperatorType()));
|
|
}
|
|
}
|
|
|
|
boost::any UnaryBooleanFunctionExpression::accept(ExpressionVisitor& visitor) const {
|
|
return visitor.visit(*this);
|
|
}
|
|
|
|
void UnaryBooleanFunctionExpression::printToStream(std::ostream& stream) const {
|
|
stream << "!(" << *this->getOperand() << ")";
|
|
}
|
|
}
|
|
}
|