Implemented De Morgan’s rules for normalization purposes.
This commit is contained in:
@@ -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();
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user