#ifndef __PLASP__PDDL__TRANSLATION__VARIABLES_H #define __PLASP__PDDL__TRANSLATION__VARIABLES_H #include #include #include #include namespace plasp { namespace pddl { //////////////////////////////////////////////////////////////////////////////////////////////////// // // Variables // //////////////////////////////////////////////////////////////////////////////////////////////////// template void translateVariablesForRuleHead(colorlog::ColorStream &outputStream, const T &variables); template void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T &variables); //////////////////////////////////////////////////////////////////////////////////////////////////// template inline void translateVariablesForRuleHead(colorlog::ColorStream &outputStream, const T &variables) { if (variables.empty()) return; for (const auto &variable : variables) outputStream << ", " << *variable; } //////////////////////////////////////////////////////////////////////////////////////////////////// template inline void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T &variables) { if (variables.empty()) return; outputStream << " :- "; for (const auto &variable : variables) { if (variable.get() != variables.begin()->get()) outputStream << ", "; if (variable->type) { if (!variable->type.value().template is<::pddl::ast::PrimitiveTypePointer>()) throw TranslatorException("only primitive types supported currently"); const auto &type = variable->type.value().template get<::pddl::ast::PrimitiveTypePointer>(); outputStream << colorlog::Function("has") << "(" << *variable << ", " << colorlog::Keyword("type") << "(" << *type << "))"; } else { outputStream << colorlog::Function("has") << "(" << *variable << ", " << colorlog::Keyword("type") << "(" << colorlog::String("object") << "))"; } } } //////////////////////////////////////////////////////////////////////////////////////////////////// } } #endif