#ifndef __PDDL_PARSE__NORMALIZED_AST_FORWARD_H #define __PDDL_PARSE__NORMALIZED_AST_FORWARD_H #include namespace pddl { //////////////////////////////////////////////////////////////////////////////////////////////////// // // Normalized AST Forward Declarations // //////////////////////////////////////////////////////////////////////////////////////////////////// namespace normalizedAST { //////////////////////////////////////////////////////////////////////////////////////////////////// // Primitives //////////////////////////////////////////////////////////////////////////////////////////////////// using ast::Constant; using ast::ConstantPointer; using ast::ConstantDeclaration; using ast::ConstantDeclarationPointer; using ast::ConstantDeclarations; using ast::PrimitiveTypePointer; using ast::PrimitiveType; using ast::PrimitiveTypePointer; using ast::PrimitiveTypes; using ast::PrimitiveTypeDeclaration; using ast::PrimitiveTypeDeclarationPointer; using ast::PrimitiveTypeDeclarations; using ast::Variable; using ast::VariablePointer; using ast::Variables; using ast::VariableDeclaration; using ast::VariableDeclarationPointer; using ast::VariableDeclarations; //////////////////////////////////////////////////////////////////////////////////////////////////// // Compounds //////////////////////////////////////////////////////////////////////////////////////////////////// struct DerivedPredicate; using DerivedPredicatePointer = std::unique_ptr; using DerivedPredicates = std::vector; struct DerivedPredicateDeclaration; using DerivedPredicateDeclarationPointer = std::unique_ptr; using DerivedPredicateDeclarations = std::vector; using ast::Predicate; using ast::PredicatePointer; using ast::Predicates; using ast::PredicateDeclaration; using ast::PredicateDeclarationPointer; using ast::PredicateDeclarations; //////////////////////////////////////////////////////////////////////////////////////////////////// // Expressions //////////////////////////////////////////////////////////////////////////////////////////////////// using ast::And; using ast::AndPointer; using ast::At; using ast::AtPointer; using ast::Either; using ast::EitherPointer; using ast::Exists; using ast::ExistsPointer; using ast::ForAll; using ast::ForAllPointer; using ast::Not; using ast::NotPointer; using ast::Or; using ast::OrPointer; using ast::When; using ast::WhenPointer; //////////////////////////////////////////////////////////////////////////////////////////////////// // PDDL Structure //////////////////////////////////////////////////////////////////////////////////////////////////// struct Action; using ActionPointer = std::unique_ptr; using Actions = std::vector; struct Description; using DescriptionPointer = std::unique_ptr; struct Domain; using DomainPointer = std::unique_ptr; struct InitialState; struct Problem; using ProblemPointer = std::unique_ptr; enum class Requirement; using Requirements = std::vector; //////////////////////////////////////////////////////////////////////////////////////////////////// // Variants //////////////////////////////////////////////////////////////////////////////////////////////////// using ast::Term; using ast::Terms; //////////////////////////////////////////////////////////////////////////////////////////////////// namespace detail { using AtomicFormulaT = Variant< DerivedPredicatePointer, PredicatePointer>; } class AtomicFormula : public detail::AtomicFormulaT { AtomicFormula() = delete; using detail::AtomicFormulaT::AtomicFormulaT; }; //////////////////////////////////////////////////////////////////////////////////////////////////// namespace detail { using LiteralT = Variant< AtomicFormula, NotPointer>; } class Literal : public detail::LiteralT { Literal() = delete; using detail::LiteralT::LiteralT; }; using Literals = std::vector; //////////////////////////////////////////////////////////////////////////////////////////////////// class Precondition; namespace detail { using PreconditionT = Variant< Literal, AndPointer>; } class Precondition : public detail::PreconditionT { Precondition() = delete; using detail::PreconditionT::PreconditionT; }; using Preconditions = std::vector; //////////////////////////////////////////////////////////////////////////////////////////////////// class DerivedPredicatePrecondition; namespace detail { using DerivedPredicatePreconditionT = Variant< Literal, AndPointer, OrPointer>; } class DerivedPredicatePrecondition : public detail::DerivedPredicatePreconditionT { DerivedPredicatePrecondition() = delete; using detail::DerivedPredicatePreconditionT::DerivedPredicatePreconditionT; }; using DerivedPredicatePreconditions = std::vector; //////////////////////////////////////////////////////////////////////////////////////////////////// class ConditionalEffect; namespace detail { using ConditionalEffectT = Variant< Literal, AndPointer, NotPointer>; } class ConditionalEffect : public detail::ConditionalEffectT { ConditionalEffect() = delete; using detail::ConditionalEffectT::ConditionalEffectT; }; //////////////////////////////////////////////////////////////////////////////////////////////////// // TODO: support effects appropriately class Effect; namespace detail { using EffectT = Variant< AtomicFormula, AndPointer, ForAllPointer, NotPointer, WhenPointer>; } class Effect : public detail::EffectT { Effect() = delete; using detail::EffectT::EffectT; }; //////////////////////////////////////////////////////////////////////////////////////////////////// using Fact = Literal; using Facts = std::vector; //////////////////////////////////////////////////////////////////////////////////////////////////// using Goal = Precondition; //////////////////////////////////////////////////////////////////////////////////////////////////// } } #endif