2016-09-02 18:27:00 +02:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
2016-09-04 20:49:22 +02:00
|
|
|
#include <plasp/pddl/expressions/And.h>
|
2016-09-02 18:32:13 +02:00
|
|
|
#include <plasp/pddl/expressions/Dummy.h>
|
2016-09-02 18:45:00 +02:00
|
|
|
#include <plasp/pddl/expressions/Imply.h>
|
2016-09-02 18:27:00 +02:00
|
|
|
#include <plasp/pddl/expressions/Not.h>
|
2016-09-02 18:45:00 +02:00
|
|
|
#include <plasp/pddl/expressions/Or.h>
|
2016-09-02 18:27:00 +02:00
|
|
|
|
|
|
|
using namespace plasp::pddl;
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-09-05 00:06:09 +02:00
|
|
|
TEST(PDDLNormalizationTests, Reduced)
|
2016-09-04 23:30:08 +02:00
|
|
|
{
|
|
|
|
auto n1 = expressions::NotPointer(new expressions::Not);
|
|
|
|
auto n2 = expressions::NotPointer(new expressions::Not);
|
|
|
|
auto a = expressions::AndPointer(new expressions::And);
|
|
|
|
auto o = expressions::OrPointer(new expressions::Or);
|
|
|
|
auto i = expressions::ImplyPointer(new expressions::Imply);
|
|
|
|
|
|
|
|
i->setArgument(0, new expressions::Dummy("a"));
|
|
|
|
i->setArgument(1, new expressions::Dummy("b"));
|
|
|
|
|
|
|
|
o->addArgument(i);
|
|
|
|
o->addArgument(new expressions::Dummy("c"));
|
|
|
|
|
|
|
|
a->addArgument(o);
|
|
|
|
a->addArgument(new expressions::Dummy("d"));
|
|
|
|
|
|
|
|
n2->setArgument(a);
|
|
|
|
n1->setArgument(n2);
|
|
|
|
|
|
|
|
std::stringstream output;
|
2016-09-05 00:06:09 +02:00
|
|
|
n1->reduced()->print(output);
|
2016-09-04 23:30:08 +02:00
|
|
|
|
|
|
|
ASSERT_EQ(output.str(), "(not (not (and (or (or (not (a)) (b)) (c)) (d))))");
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-09-02 18:45:00 +02:00
|
|
|
TEST(PDDLNormalizationTests, Implication)
|
|
|
|
{
|
2016-09-04 18:26:02 +02:00
|
|
|
auto i = expressions::ImplyPointer(new expressions::Imply);
|
2016-09-02 18:45:00 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
i->setArgument(0, new expressions::Dummy("a"));
|
|
|
|
i->setArgument(1, new expressions::Dummy("b"));
|
2016-09-02 18:45:00 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
std::stringstream output;
|
|
|
|
i->normalized()->print(output);
|
2016-09-02 18:45:00 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
ASSERT_EQ(output.str(), "(or (not (a)) (b))");
|
2016-09-02 18:45:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-09-02 18:27:00 +02:00
|
|
|
TEST(PDDLNormalizationTests, DoubleNegation)
|
|
|
|
{
|
2016-09-04 18:26:02 +02:00
|
|
|
auto n1 = expressions::NotPointer(new expressions::Not);
|
|
|
|
auto n2 = expressions::NotPointer(new expressions::Not);
|
2016-09-02 18:27:00 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
n2->setArgument(new expressions::Dummy("a"));
|
|
|
|
n1->setArgument(n2);
|
2016-09-02 18:27:00 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
std::stringstream output;
|
|
|
|
n1->normalized()->print(output);
|
2016-09-02 18:27:00 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
ASSERT_EQ(output.str(), "(a)");
|
2016-09-02 18:27:00 +02:00
|
|
|
}
|
2016-09-04 20:49:22 +02:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
TEST(PDDLNormalizationTests, DeMorganNegativeConjunction)
|
|
|
|
{
|
|
|
|
auto a = expressions::AndPointer(new expressions::And);
|
2016-09-04 22:26:17 +02:00
|
|
|
a->addArgument(new expressions::Dummy("a"));
|
|
|
|
a->addArgument(new expressions::Dummy("b"));
|
|
|
|
a->addArgument(new expressions::Dummy("c"));
|
2016-09-04 20:49:22 +02:00
|
|
|
|
|
|
|
auto n = expressions::NotPointer(new expressions::Not);
|
|
|
|
n->setArgument(a);
|
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
std::stringstream output;
|
|
|
|
n->normalized()->print(output);
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
ASSERT_EQ(output.str(), "(or (not (a)) (not (b)) (not (c)))");
|
2016-09-04 20:49:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
TEST(PDDLNormalizationTests, DeMorganNegativeDisjunction)
|
|
|
|
{
|
2016-09-04 22:26:17 +02:00
|
|
|
auto a = expressions::OrPointer(new expressions::Or);
|
|
|
|
a->addArgument(new expressions::Dummy("a"));
|
|
|
|
a->addArgument(new expressions::Dummy("b"));
|
|
|
|
a->addArgument(new expressions::Dummy("c"));
|
2016-09-04 20:49:22 +02:00
|
|
|
|
|
|
|
auto n = expressions::NotPointer(new expressions::Not);
|
2016-09-04 22:26:17 +02:00
|
|
|
n->setArgument(a);
|
|
|
|
|
|
|
|
std::stringstream output;
|
|
|
|
n->normalized()->print(output);
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
ASSERT_EQ(output.str(), "(and (not (a)) (not (b)) (not (c)))");
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
TEST(PDDLNormalizationTests, DoubleNegationInner)
|
|
|
|
{
|
|
|
|
auto n1 = expressions::NotPointer(new expressions::Not);
|
|
|
|
auto n2 = expressions::NotPointer(new expressions::Not);
|
|
|
|
auto n3 = expressions::NotPointer(new expressions::Not);
|
|
|
|
auto a = expressions::AndPointer(new expressions::And);
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
a->addArgument(new expressions::Dummy("a"));
|
|
|
|
a->addArgument(new expressions::Dummy("b"));
|
|
|
|
a->addArgument(new expressions::Dummy("c"));
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
n3->setArgument(a);
|
|
|
|
n2->setArgument(n3);
|
|
|
|
n1->setArgument(n2);
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
std::stringstream output;
|
|
|
|
n1->normalized()->print(output);
|
2016-09-04 20:49:22 +02:00
|
|
|
|
2016-09-04 22:26:17 +02:00
|
|
|
ASSERT_EQ(output.str(), "(or (not (a)) (not (b)) (not (c)))");
|
2016-09-04 20:49:22 +02:00
|
|
|
}
|