Implemented De Morgan’s rules for normalization purposes.

This commit is contained in:
2016-09-04 20:49:22 +02:00
parent 6aaf7c039d
commit c9ecd0c020
4 changed files with 127 additions and 3 deletions

View File

@@ -30,11 +30,11 @@ ExpressionPointer Imply::normalized()
m_arguments[1] = m_arguments[1]->normalized();
auto notArgument0 = NotPointer(new Not);
notArgument0->setArgument(m_arguments[0]);
notArgument0->setArgument(std::move(m_arguments[0]));
auto orExpression = OrPointer(new Or);
orExpression->addArgument(notArgument0);
orExpression->addArgument(m_arguments[1]);
orExpression->addArgument(std::move(notArgument0));
orExpression->addArgument(std::move(m_arguments[1]));
auto normalizedOrExpression = orExpression->normalized();

View File

@@ -1,5 +1,8 @@
#include <plasp/pddl/expressions/Not.h>
#include <plasp/pddl/expressions/And.h>
#include <plasp/pddl/expressions/Or.h>
namespace plasp
{
namespace pddl
@@ -48,6 +51,34 @@ ExpressionPointer Not::normalized()
m_argument = m_argument->normalized();
// De Morgan for negative conjunctions
if (m_argument->expressionType() == Expression::Type::And)
{
auto &andExpression = dynamic_cast<And &>(*m_argument);
auto orExpression = OrPointer(new Or);
orExpression->arguments().reserve(andExpression.arguments().size());
for (size_t i = 0; i < andExpression.arguments().size(); i++)
orExpression->addArgument(andExpression.arguments()[i]->negated());
return orExpression->normalized();
}
// De Morgan for negative disjunctions
if (m_argument->expressionType() == Expression::Type::Or)
{
auto &orExpression = dynamic_cast<Or &>(*m_argument);
auto andExpression = AndPointer(new And);
andExpression->arguments().reserve(orExpression.arguments().size());
for (size_t i = 0; i < orExpression.arguments().size(); i++)
andExpression->addArgument(orExpression.arguments()[i]->negated());
return andExpression->normalized();
}
return this;
}