Ensuring that goal is variable-free.
Even though the parser shouldn’t be able to put variables into the goal description, the AST theoretically allows for this case. This commit adds a defensive check that goal descriptions are variable-free.
This commit is contained in:
parent
27f773e091
commit
1631a70a0b
@ -24,11 +24,20 @@ namespace pddl
|
|||||||
|
|
||||||
inline void translateGoal(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Goal &goal)
|
inline void translateGoal(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Goal &goal)
|
||||||
{
|
{
|
||||||
|
const auto ensureNoVariables =
|
||||||
|
[](const auto &predicate)
|
||||||
|
{
|
||||||
|
for (const auto &argument : predicate->arguments)
|
||||||
|
if (argument.template is<::pddl::normalizedAST::VariablePointer>())
|
||||||
|
throw TranslatorException("goal descriptions must be variable-free");
|
||||||
|
};
|
||||||
|
|
||||||
const auto handlePredicate =
|
const auto handlePredicate =
|
||||||
[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
|
[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
|
||||||
{
|
{
|
||||||
|
ensureNoVariables(predicate);
|
||||||
|
|
||||||
outputStream << std::endl << colorlog::Function("goal") << "(";
|
outputStream << std::endl << colorlog::Function("goal") << "(";
|
||||||
// TODO: assert that goal is variable-free
|
|
||||||
translatePredicateToVariable(outputStream, *predicate, isPositive);
|
translatePredicateToVariable(outputStream, *predicate, isPositive);
|
||||||
outputStream << ").";
|
outputStream << ").";
|
||||||
};
|
};
|
||||||
@ -42,8 +51,9 @@ inline void translateGoal(colorlog::ColorStream &outputStream, const ::pddl::nor
|
|||||||
const auto handleDerivedPredicate =
|
const auto handleDerivedPredicate =
|
||||||
[&](const ::pddl::normalizedAST::DerivedPredicatePointer &derivedPredicate, bool isPositive = true)
|
[&](const ::pddl::normalizedAST::DerivedPredicatePointer &derivedPredicate, bool isPositive = true)
|
||||||
{
|
{
|
||||||
|
ensureNoVariables(derivedPredicate);
|
||||||
|
|
||||||
outputStream << std::endl << colorlog::Function("goal") << "(";
|
outputStream << std::endl << colorlog::Function("goal") << "(";
|
||||||
// TODO: assert that goal is variable-free
|
|
||||||
translateDerivedPredicateToVariable(outputStream, *derivedPredicate, isPositive);
|
translateDerivedPredicateToVariable(outputStream, *derivedPredicate, isPositive);
|
||||||
outputStream << ").";
|
outputStream << ").";
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user