diff --git a/lib/pddl/include/pddl/AST.h b/lib/pddl/include/pddl/AST.h index 704c17c..1804e18 100644 --- a/lib/pddl/include/pddl/AST.h +++ b/lib/pddl/include/pddl/AST.h @@ -292,6 +292,19 @@ struct Either: public NAry, Argument> //////////////////////////////////////////////////////////////////////////////////////////////////// +template +struct Equals: public Binary, ArgumentLeft, ArgumentRight> +{ + static constexpr const auto Identifier = "="; + + explicit Equals(ArgumentLeft &&argumentLeft, ArgumentRight &&argumentRight) + : Binary, ArgumentLeft, ArgumentRight>(std::move(argumentLeft), std::move(argumentRight)) + { + } +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + template struct Exists: public Quantified, Argument> { diff --git a/lib/pddl/include/pddl/ASTForward.h b/lib/pddl/include/pddl/ASTForward.h index 8ea4e16..69203bc 100644 --- a/lib/pddl/include/pddl/ASTForward.h +++ b/lib/pddl/include/pddl/ASTForward.h @@ -70,6 +70,10 @@ template struct Either; template using EitherPointer = std::unique_ptr>; +template +struct Equals; +template +using EqualsPointer = std::unique_ptr>; template struct Exists; template @@ -136,8 +140,8 @@ using Terms = std::vector; namespace detail { -// TODO: add missing types using AtomicFormulaT = Variant< + EqualsPointer, PredicatePointer>; } diff --git a/lib/pddl/include/pddl/ASTOutput.h b/lib/pddl/include/pddl/ASTOutput.h index 0e03a3a..e529738 100644 --- a/lib/pddl/include/pddl/ASTOutput.h +++ b/lib/pddl/include/pddl/ASTOutput.h @@ -267,6 +267,14 @@ inline colorlog::ColorStream &print(colorlog::ColorStream &stream, const Either< //////////////////////////////////////////////////////////////////////////////////////////////////// +template +inline colorlog::ColorStream &print(colorlog::ColorStream &stream, const Equals &equals, pddl::detail::PrintContext &printContext) +{ + return print(stream, static_cast, ArgumentLeft, ArgumentRight> &>(equals), printContext); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + template inline colorlog::ColorStream &print(colorlog::ColorStream &stream, const Exists &exists, pddl::detail::PrintContext &printContext) { diff --git a/lib/pddl/include/pddl/detail/normalization/CollectFreeVariables.h b/lib/pddl/include/pddl/detail/normalization/CollectFreeVariables.h index bbb4951..3234347 100644 --- a/lib/pddl/include/pddl/detail/normalization/CollectFreeVariables.h +++ b/lib/pddl/include/pddl/detail/normalization/CollectFreeVariables.h @@ -65,6 +65,15 @@ void collectFreeVariables(const ast::AndPointer &and_, std::vector +void collectFreeVariables(const ast::EqualsPointer &equals, std::vector &freeVariables, VariableStack &variableStack) +{ + collectFreeVariables(equals->argumentLeft, freeVariables, variableStack); + collectFreeVariables(equals->argumentRight, freeVariables, variableStack); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + template void collectFreeVariables(const ast::ExistsPointer &exists, std::vector &freeVariables, VariableStack &variableStack) { diff --git a/lib/pddl/src/pddl/detail/normalization/AtomicFormula.cpp b/lib/pddl/src/pddl/detail/normalization/AtomicFormula.cpp index 91e6c84..6ec1b39 100644 --- a/lib/pddl/src/pddl/detail/normalization/AtomicFormula.cpp +++ b/lib/pddl/src/pddl/detail/normalization/AtomicFormula.cpp @@ -17,13 +17,20 @@ namespace detail normalizedAST::AtomicFormula normalize(ast::AtomicFormula &&atomicFormula) { + const auto handleEquals = + [&](ast::EqualsPointer &) -> normalizedAST::AtomicFormula + { + // TODO: implement + throw NormalizationException("“=” expressions currently unsupported by normalization"); + }; + const auto handlePredicate = [&](ast::PredicatePointer &predicate) -> normalizedAST::AtomicFormula { return std::move(predicate); }; - return atomicFormula.match(handlePredicate); + return atomicFormula.match(handleEquals, handlePredicate); } ////////////////////////////////////////////////////////////////////////////////////////////////////