Refactoring of TranslatorASP class.

This commit is contained in:
Patrick Lühne 2016-05-26 12:59:18 +02:00
parent 47f269782e
commit 8eb0a4847f
2 changed files with 88 additions and 36 deletions

View File

@ -24,6 +24,14 @@ class TranslatorASP
void translate(std::ostream &ostream) const; void translate(std::ostream &ostream) const;
private: private:
void translateRequirements(std::ostream &ostream) const;
void translateInitialState(std::ostream &ostream) const;
void translateGoal(std::ostream &ostream) const;
void translateVariables(std::ostream &ostream) const;
void translateActions(std::ostream &ostream) const;
void translateMutexes(std::ostream &ostream) const;
void translateAxiomRules(std::ostream &ostream) const;
const Description &m_description; const Description &m_description;
}; };

View File

@ -23,22 +23,37 @@ TranslatorASP::TranslatorASP(const Description &description)
void TranslatorASP::translate(std::ostream &ostream) const void TranslatorASP::translate(std::ostream &ostream) const
{ {
const auto usesActionCosts = m_description.usesActionCosts(); translateRequirements(ostream);
const auto usesAxiomRules = m_description.usesAxiomRules(); translateInitialState(ostream);
const auto usesConditionalEffects = m_description.usesConditionalEffects(); translateGoal(ostream);
translateVariables(ostream);
translateActions(ostream);
translateMutexes(ostream);
translateAxiomRules(ostream);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateRequirements(std::ostream &ostream) const
{
ostream << "% feature requirements" << std::endl; ostream << "% feature requirements" << std::endl;
if (usesActionCosts) if (m_description.usesActionCosts())
ostream << "requiresFeature(actionCosts)." << std::endl; ostream << "requiresFeature(actionCosts)." << std::endl;
if (usesAxiomRules) if (m_description.usesAxiomRules())
ostream << "requiresFeature(axiomRules)." << std::endl; ostream << "requiresFeature(axiomRules)." << std::endl;
if (usesConditionalEffects) if (m_description.usesConditionalEffects())
ostream << "requiresFeature(conditionalEffects)." << std::endl; ostream << "requiresFeature(conditionalEffects)." << std::endl;
ostream << std::endl; ostream << std::endl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateInitialState(std::ostream &ostream) const
{
ostream << "% initial state" << std::endl; ostream << "% initial state" << std::endl;
const auto &initialStateFacts = m_description.initialState().facts(); const auto &initialStateFacts = m_description.initialState().facts();
@ -54,6 +69,12 @@ void TranslatorASP::translate(std::ostream &ostream) const
}); });
ostream << std::endl; ostream << std::endl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateGoal(std::ostream &ostream) const
{
ostream << "% goal" << std::endl; ostream << "% goal" << std::endl;
const auto &goalFacts = m_description.goal().facts(); const auto &goalFacts = m_description.goal().facts();
@ -69,6 +90,12 @@ void TranslatorASP::translate(std::ostream &ostream) const
}); });
ostream << std::endl; ostream << std::endl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateVariables(std::ostream &ostream) const
{
ostream << "% variables"; ostream << "% variables";
const auto &variables = m_description.variables(); const auto &variables = m_description.variables();
@ -96,6 +123,12 @@ void TranslatorASP::translate(std::ostream &ostream) const
}); });
ostream << std::endl; ostream << std::endl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateActions(std::ostream &ostream) const
{
ostream << "% actions"; ostream << "% actions";
const auto &operators = m_description.operators(); const auto &operators = m_description.operators();
@ -159,6 +192,12 @@ void TranslatorASP::translate(std::ostream &ostream) const
}); });
ostream << std::endl; ostream << std::endl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void TranslatorASP::translateMutexes(std::ostream &ostream) const
{
ostream << "% mutex groups"; ostream << "% mutex groups";
const auto &mutexGroups = m_description.mutexGroups(); const auto &mutexGroups = m_description.mutexGroups();
@ -185,45 +224,50 @@ void TranslatorASP::translate(std::ostream &ostream) const
ostream << ")." << std::endl; ostream << ")." << std::endl;
}); });
}); });
}
if (usesAxiomRules) ////////////////////////////////////////////////////////////////////////////////////////////////////
{
ostream << std::endl;
ostream << "% axiom rules";
const auto &axiomRules = m_description.axiomRules(); void TranslatorASP::translateAxiomRules(std::ostream &ostream) const
{
if (!m_description.usesActionCosts())
return;
size_t currentAxiomRuleID = 0; ostream << std::endl;
ostream << "% axiom rules";
std::for_each(axiomRules.cbegin(), axiomRules.cend(), const auto &axiomRules = m_description.axiomRules();
[&](const auto &axiomRule)
{
const auto axiomRuleID = std::to_string(currentAxiomRuleID);
currentAxiomRuleID++;
ostream << std::endl << "axiomRule(" << axiomRuleID << ")." << std::endl; size_t currentAxiomRuleID = 0;
const auto &conditions = axiomRule.conditions(); std::for_each(axiomRules.cbegin(), axiomRules.cend(),
[&](const auto &axiomRule)
{
const auto axiomRuleID = std::to_string(currentAxiomRuleID);
currentAxiomRuleID++;
std::for_each(conditions.cbegin(), conditions.cend(), ostream << std::endl << "axiomRule(" << axiomRuleID << ")." << std::endl;
[&](const auto &condition)
{
ostream << "condition(axiomRule(" << axiomRuleID << "), ";
condition.variable().printNameAsASPPredicate(ostream);
ostream << ", ";
condition.value().printAsASPPredicate(ostream);
ostream << ")." << std::endl;
});
const auto &postcondition = axiomRule.postcondition(); const auto &conditions = axiomRule.conditions();
ostream << "postcondition(axiomRule(axiomRule" << axiomRuleID << "), "; std::for_each(conditions.cbegin(), conditions.cend(),
postcondition.variable().printNameAsASPPredicate(ostream); [&](const auto &condition)
ostream << ", "; {
postcondition.value().printAsASPPredicate(ostream); ostream << "condition(axiomRule(" << axiomRuleID << "), ";
ostream << ")." << std::endl; condition.variable().printNameAsASPPredicate(ostream);
}); ostream << ", ";
} condition.value().printAsASPPredicate(ostream);
ostream << ")." << std::endl;
});
const auto &postcondition = axiomRule.postcondition();
ostream << "postcondition(axiomRule(axiomRule" << axiomRuleID << "), ";
postcondition.variable().printNameAsASPPredicate(ostream);
ostream << ", ";
postcondition.value().printAsASPPredicate(ostream);
ostream << ")." << std::endl;
});
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////