Translating derived predicates of problems.

While derived predicates stemming from the domain were already
translated, the ones from the problem were missing. This commit fixes
that, although it duplicates the definition of “contains.”
This commit is contained in:
Patrick Lühne 2017-10-25 18:57:59 +02:00
parent 624ddc38aa
commit feaef5a3fa
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
3 changed files with 21 additions and 28 deletions

View File

@ -29,7 +29,7 @@ class TranslatorASP
void translateUtils() const; void translateUtils() const;
void translateTypes() const; void translateTypes() const;
void translatePredicates() const; void translatePredicates() const;
void translateDerivedPredicates() const; void translateDerivedPredicates(const ::pddl::normalizedAST::DerivedPredicateDeclarations &derivedPredicates) const;
void translateActions() const; void translateActions() const;
void translateProblem() const; void translateProblem() const;

View File

@ -42,7 +42,7 @@ normalizedAST::OrPointer<normalizedAST::Literal> normalizeTopLevel(ast::OrPointe
normalizedAST::DerivedPredicatePointer addDerivedPredicate(const std::vector<normalizedAST::VariableDeclaration *> &parameters, detail::NormalizationContext &normalizationContext) normalizedAST::DerivedPredicatePointer addDerivedPredicate(const std::vector<normalizedAST::VariableDeclaration *> &parameters, detail::NormalizationContext &normalizationContext)
{ {
auto &derivedPredicates = normalizationContext.derivedPredicates; auto &derivedPredicates = normalizationContext.derivedPredicates;
const auto derivedPredicateID = normalizationContext.derivedPredicateIDStart + derivedPredicates.size() + 1; const auto derivedPredicateID = normalizationContext.derivedPredicateIDStart + derivedPredicates.size();
auto name = "derived-predicate-" + std::to_string(derivedPredicateID); auto name = "derived-predicate-" + std::to_string(derivedPredicateID);
normalizedAST::DerivedPredicate::Arguments arguments; normalizedAST::DerivedPredicate::Arguments arguments;

View File

@ -81,7 +81,7 @@ void TranslatorASP::translateDomain() const
if (!domain->derivedPredicates.empty()) if (!domain->derivedPredicates.empty())
{ {
m_outputStream << std::endl; m_outputStream << std::endl;
translateDerivedPredicates(); translateDerivedPredicates(domain->derivedPredicates);
} }
// Actions // Actions
@ -194,12 +194,10 @@ void TranslatorASP::translatePredicates() const
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateDerivedPredicates() const void TranslatorASP::translateDerivedPredicates(const ::pddl::normalizedAST::DerivedPredicateDeclarations &derivedPredicates) const
{ {
m_outputStream << colorlog::Heading2("derived predicates"); m_outputStream << colorlog::Heading2("derived predicates");
const auto &derivedPredicates = m_description.domain->derivedPredicates;
for (const auto &derivedPredicate : derivedPredicates) for (const auto &derivedPredicate : derivedPredicates)
{ {
m_outputStream << std::endl << colorlog::Function("derivedVariable") << "("; m_outputStream << std::endl << colorlog::Function("derivedVariable") << "(";
@ -208,11 +206,10 @@ void TranslatorASP::translateDerivedPredicates() const
m_outputStream << ")"; m_outputStream << ")";
if (!derivedPredicate->parameters.empty() || !derivedPredicate->existentialParameters.empty()) if (!derivedPredicate->parameters.empty())
{
m_outputStream << " :- "; m_outputStream << " :- ";
translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters); translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters);
}
m_outputStream << "."; m_outputStream << ".";
} }
@ -228,27 +225,20 @@ void TranslatorASP::translateDerivedPredicates() const
for (const auto &derivedPredicate : derivedPredicates) for (const auto &derivedPredicate : derivedPredicates)
{ {
// With “and” expressions, the existentially bound parameters are important
// Were they not the same in all arguments, the precondition would be treated like a disjunction
const auto enumerateExistentialParameters
= derivedPredicate->precondition.value().is<::pddl::normalizedAST::AndPointer<::pddl::normalizedAST::Literal>>();
const auto printDerivedPredicateName = const auto printDerivedPredicateName =
[&]() [&]()
{ {
m_outputStream << colorlog::Keyword("derivedPredicate") << "("; m_outputStream << colorlog::Keyword("derivedPredicate") << "(";
if (derivedPredicate->parameters.empty()) if (derivedPredicate->parameters.empty() && derivedPredicate->existentialParameters.empty())
{ {
m_outputStream << *derivedPredicate << ")"; m_outputStream << *derivedPredicate << ")";
return; return;
} }
m_outputStream << "(" << *derivedPredicate; m_outputStream << "(" << *derivedPredicate;
// TODO: add existentially quantified parameters
translateVariablesForRuleHead(m_outputStream, derivedPredicate->parameters);
if (enumerateExistentialParameters && !derivedPredicate->existentialParameters.empty()) translateVariablesForRuleHead(m_outputStream, derivedPredicate->parameters);
translateVariablesForRuleHead(m_outputStream, derivedPredicate->existentialParameters); translateVariablesForRuleHead(m_outputStream, derivedPredicate->existentialParameters);
m_outputStream << ")), " << colorlog::Keyword("type") << "("; m_outputStream << ")), " << colorlog::Keyword("type") << "(";
@ -271,16 +261,12 @@ void TranslatorASP::translateDerivedPredicates() const
if (!derivedPredicate->parameters.empty() || !derivedPredicate->existentialParameters.empty()) if (!derivedPredicate->parameters.empty() || !derivedPredicate->existentialParameters.empty())
m_outputStream << " :- "; m_outputStream << " :- ";
if (!derivedPredicate->parameters.empty())
translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters); translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters);
if (enumerateExistentialParameters && !derivedPredicate->existentialParameters.empty()) if (!derivedPredicate->existentialParameters.empty() && !derivedPredicate->parameters.empty())
{
if (!derivedPredicate->parameters.empty())
m_outputStream << ", "; m_outputStream << ", ";
translateVariablesForRuleBody(m_outputStream, derivedPredicate->existentialParameters); translateVariablesForRuleBody(m_outputStream, derivedPredicate->existentialParameters);
}
m_outputStream << "."; m_outputStream << ".";
@ -425,6 +411,13 @@ void TranslatorASP::translateProblem() const
m_outputStream << std::endl; m_outputStream << std::endl;
translateInitialState(); translateInitialState();
// Derived predicates
if (!problem->derivedPredicates.empty())
{
m_outputStream << std::endl;
translateDerivedPredicates(problem->derivedPredicates);
}
// Goal // Goal
if (problem->goal) if (problem->goal)
{ {