Compare commits
	
		
			4 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						af325e3991
	
				 | 
					
					
						|||
| 
						
						
							
						
						31542c6adc
	
				 | 
					
					
						|||
| 
						
						
							
						
						2d0e4b09fa
	
				 | 
					
					
						|||
| 
						
						
							
						
						2288fa891e
	
				 | 
					
					
						
@@ -2,6 +2,12 @@
 | 
			
		||||
 | 
			
		||||
## (unreleased)
 | 
			
		||||
 | 
			
		||||
## 3.1.1 (2017-11-25)
 | 
			
		||||
 | 
			
		||||
### Bug Fixes
 | 
			
		||||
 | 
			
		||||
* fixes ASP syntax issues caused by hyphens in variable names by replacing all user-defined variables with `X1`, `X2`, etc.
 | 
			
		||||
 | 
			
		||||
## 3.1.0 (2017-11-17)
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,6 @@
 | 
			
		||||
//
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
static constexpr const auto Version = "plasp version 3.1.0-git";
 | 
			
		||||
static constexpr const auto Version = "plasp version 3.1.1-git";
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ template<typename PrintObjectName>
 | 
			
		||||
inline void translateConditionalEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
	const ::pddl::normalizedAST::ConditionalEffect &conditionalEffect,
 | 
			
		||||
	PrintObjectName printObjectName, VariableStack &variableStack,
 | 
			
		||||
	size_t &numberOfConditionalEffects)
 | 
			
		||||
	size_t &numberOfConditionalEffects, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
 | 
			
		||||
@@ -38,7 +38,7 @@ inline void translateConditionalEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
				<< ", " << colorlog::Keyword("effect") << "("
 | 
			
		||||
				<< colorlog::Number<size_t>(numberOfConditionalEffects) << ")"
 | 
			
		||||
				<< ", ";
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, isPositive);
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ") :- " << colorlog::Function("action") << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ")";
 | 
			
		||||
@@ -49,7 +49,7 @@ inline void translateConditionalEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
					if (!layer->empty())
 | 
			
		||||
						outputStream << ", ";
 | 
			
		||||
 | 
			
		||||
					translateVariablesForRuleBody(outputStream, *layer);
 | 
			
		||||
					translateVariablesForRuleBody(outputStream, *layer, variableIDs);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			outputStream << ".";
 | 
			
		||||
 
 | 
			
		||||
@@ -20,13 +20,13 @@ namespace pddl
 | 
			
		||||
//
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void translateDerivedPredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicate &derivedPredicate);
 | 
			
		||||
void translateDerivedPredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicateDeclaration &derivedPredicateDeclaration);
 | 
			
		||||
void translateDerivedPredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicate &derivedPredicate, VariableIDMap &variableIDs);
 | 
			
		||||
void translateDerivedPredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicateDeclaration &derivedPredicateDeclaration, VariableIDMap &variableIDs);
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
// TODO: avoid code duplication with translatePredicate
 | 
			
		||||
inline void translateDerivedPredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicate &derivedPredicate)
 | 
			
		||||
inline void translateDerivedPredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicate &derivedPredicate, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	const auto &arguments = derivedPredicate.arguments;
 | 
			
		||||
 | 
			
		||||
@@ -51,7 +51,7 @@ inline void translateDerivedPredicate(colorlog::ColorStream &outputStream, const
 | 
			
		||||
		const auto handleVariable =
 | 
			
		||||
			[&](const ::pddl::normalizedAST::VariablePointer &variable)
 | 
			
		||||
			{
 | 
			
		||||
				outputStream << *variable;
 | 
			
		||||
				translateVariable(outputStream, *variable, variableIDs);
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
		argument.match(handleConstant, handleVariable);
 | 
			
		||||
@@ -62,7 +62,7 @@ inline void translateDerivedPredicate(colorlog::ColorStream &outputStream, const
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translateDerivedPredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicateDeclaration &derivedPredicateDeclaration)
 | 
			
		||||
inline void translateDerivedPredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicateDeclaration &derivedPredicateDeclaration, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	outputStream << colorlog::Keyword("derivedVariable") << "(";
 | 
			
		||||
 | 
			
		||||
@@ -73,24 +73,24 @@ inline void translateDerivedPredicateDeclaration(colorlog::ColorStream &outputSt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	outputStream << "(" << derivedPredicateDeclaration;
 | 
			
		||||
	translateVariablesForRuleHead(outputStream, derivedPredicateDeclaration.parameters);
 | 
			
		||||
	translateVariablesForRuleHead(outputStream, derivedPredicateDeclaration.parameters, variableIDs);
 | 
			
		||||
	outputStream << "))";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translateDerivedPredicateToVariable(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicate &derivedPredicate, bool isPositive = true)
 | 
			
		||||
inline void translateDerivedPredicateToVariable(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicate &derivedPredicate, VariableIDMap &variableIDs, bool isPositive = true)
 | 
			
		||||
{
 | 
			
		||||
	outputStream << colorlog::Keyword("derivedVariable") << "(";
 | 
			
		||||
 | 
			
		||||
	translateDerivedPredicate(outputStream, derivedPredicate);
 | 
			
		||||
	translateDerivedPredicate(outputStream, derivedPredicate, variableIDs);
 | 
			
		||||
 | 
			
		||||
	outputStream
 | 
			
		||||
		<< "), "
 | 
			
		||||
		<< colorlog::Keyword("value") << "("
 | 
			
		||||
		<< colorlog::Keyword("derivedVariable") << "(";
 | 
			
		||||
 | 
			
		||||
	translateDerivedPredicate(outputStream, derivedPredicate);
 | 
			
		||||
	translateDerivedPredicate(outputStream, derivedPredicate, variableIDs);
 | 
			
		||||
 | 
			
		||||
	outputStream << "), ";
 | 
			
		||||
 | 
			
		||||
@@ -104,11 +104,11 @@ inline void translateDerivedPredicateToVariable(colorlog::ColorStream &outputStr
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translateDerivedPredicateDeclarationToVariable(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicateDeclaration &derivedPredicateDeclaration, bool isPositive = true)
 | 
			
		||||
inline void translateDerivedPredicateDeclarationToVariable(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicateDeclaration &derivedPredicateDeclaration, VariableIDMap &variableIDs, bool isPositive = true)
 | 
			
		||||
{
 | 
			
		||||
	translateDerivedPredicateDeclaration(outputStream, derivedPredicateDeclaration);
 | 
			
		||||
	translateDerivedPredicateDeclaration(outputStream, derivedPredicateDeclaration, variableIDs);
 | 
			
		||||
	outputStream << ", " << colorlog::Keyword("value") << "(";
 | 
			
		||||
	translateDerivedPredicateDeclaration(outputStream, derivedPredicateDeclaration);
 | 
			
		||||
	translateDerivedPredicateDeclaration(outputStream, derivedPredicateDeclaration, variableIDs);
 | 
			
		||||
	outputStream << ", ";
 | 
			
		||||
 | 
			
		||||
	if (isPositive)
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,9 @@ namespace pddl
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template<typename PrintObjectName>
 | 
			
		||||
inline void translateDerivedPredicatePrecondition(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::DerivedPredicatePrecondition &derivedPredicatePrecondition, const std::string &objectType, PrintObjectName printObjectName)
 | 
			
		||||
inline void translateDerivedPredicatePrecondition(colorlog::ColorStream &outputStream,
 | 
			
		||||
	const ::pddl::normalizedAST::DerivedPredicatePrecondition &derivedPredicatePrecondition,
 | 
			
		||||
	const std::string &objectType, PrintObjectName printObjectName, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
 | 
			
		||||
@@ -31,7 +33,7 @@ inline void translateDerivedPredicatePrecondition(colorlog::ColorStream &outputS
 | 
			
		||||
			outputStream << std::endl << colorlog::Function("precondition") << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ", ";
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, isPositive);
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ") :- " << colorlog::Function(objectType.c_str()) << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ").";
 | 
			
		||||
@@ -49,7 +51,7 @@ inline void translateDerivedPredicatePrecondition(colorlog::ColorStream &outputS
 | 
			
		||||
			outputStream << std::endl << colorlog::Function("precondition") << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ", ";
 | 
			
		||||
			translateDerivedPredicateToVariable(outputStream, *derivedPredicate, isPositive);
 | 
			
		||||
			translateDerivedPredicateToVariable(outputStream, *derivedPredicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ") :- " << colorlog::Function(objectType.c_str()) << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ").";
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace pddl
 | 
			
		||||
template<typename PrintObjectName>
 | 
			
		||||
inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
	const ::pddl::normalizedAST::Effect &effect, PrintObjectName printObjectName,
 | 
			
		||||
	VariableStack &variableStack, size_t &numberOfConditionalEffects)
 | 
			
		||||
	VariableStack &variableStack, size_t &numberOfConditionalEffects, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
 | 
			
		||||
@@ -39,7 +39,7 @@ inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
				<< ", " << colorlog::Keyword("effect") << "("
 | 
			
		||||
				<< colorlog::Reserved("unconditional") << ")"
 | 
			
		||||
				<< ", ";
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, isPositive);
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ") :- " << colorlog::Function("action") << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ")";
 | 
			
		||||
@@ -50,7 +50,7 @@ inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
					if (!layer->empty())
 | 
			
		||||
						outputStream << ", ";
 | 
			
		||||
 | 
			
		||||
					translateVariablesForRuleBody(outputStream, *layer);
 | 
			
		||||
					translateVariablesForRuleBody(outputStream, *layer, variableIDs);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			outputStream << ".";
 | 
			
		||||
@@ -98,7 +98,7 @@ inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
		{
 | 
			
		||||
			for (const auto &argument : and_->arguments)
 | 
			
		||||
				translateEffect(outputStream, argument, printObjectName, variableStack,
 | 
			
		||||
					numberOfConditionalEffects);
 | 
			
		||||
					numberOfConditionalEffects, variableIDs);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleForAll =
 | 
			
		||||
@@ -107,7 +107,7 @@ inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
			variableStack.push(&forAll->parameters);
 | 
			
		||||
 | 
			
		||||
			translateEffect(outputStream, forAll->argument, printObjectName,
 | 
			
		||||
				variableStack, numberOfConditionalEffects);
 | 
			
		||||
				variableStack, numberOfConditionalEffects, variableIDs);
 | 
			
		||||
 | 
			
		||||
			variableStack.pop();
 | 
			
		||||
		};
 | 
			
		||||
@@ -137,15 +137,15 @@ inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
						if (!layer->empty())
 | 
			
		||||
							outputStream << ", ";
 | 
			
		||||
 | 
			
		||||
						translateVariablesForRuleBody(outputStream, *layer);
 | 
			
		||||
						translateVariablesForRuleBody(outputStream, *layer, variableIDs);
 | 
			
		||||
					}
 | 
			
		||||
				};
 | 
			
		||||
 | 
			
		||||
			translatePrecondition(outputStream, when->argumentLeft,
 | 
			
		||||
				printConditionalEffectIdentifier, printPreconditionRuleBody);
 | 
			
		||||
				printConditionalEffectIdentifier, printPreconditionRuleBody, variableIDs);
 | 
			
		||||
 | 
			
		||||
			translateConditionalEffect(outputStream, when->argumentRight, printObjectName,
 | 
			
		||||
				variableStack, numberOfConditionalEffects);
 | 
			
		||||
				variableStack, numberOfConditionalEffects, variableIDs);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	effect.match(handleAnd, handleForAll, handleLiteral, handleWhen);
 | 
			
		||||
@@ -156,12 +156,12 @@ inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
template<typename PrintObjectName>
 | 
			
		||||
inline void translateEffect(colorlog::ColorStream &outputStream,
 | 
			
		||||
	const ::pddl::normalizedAST::Effect &effect, PrintObjectName printObjectName,
 | 
			
		||||
	size_t &numberOfConditionalEffects)
 | 
			
		||||
	size_t &numberOfConditionalEffects, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	VariableStack variableStack;
 | 
			
		||||
 | 
			
		||||
	translateEffect(outputStream, effect, printObjectName, variableStack,
 | 
			
		||||
		numberOfConditionalEffects);
 | 
			
		||||
		numberOfConditionalEffects, variableIDs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,12 @@ inline void translateFact(colorlog::ColorStream &outputStream, const ::pddl::nor
 | 
			
		||||
{
 | 
			
		||||
	outputStream << std::endl << colorlog::Function("initialState") << "(";
 | 
			
		||||
 | 
			
		||||
	VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
 | 
			
		||||
		{
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, isPositive);
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, variableIDs, isPositive);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleNegatedPredicate =
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,8 @@ namespace pddl
 | 
			
		||||
 | 
			
		||||
inline void translateGoal(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Goal &goal)
 | 
			
		||||
{
 | 
			
		||||
	VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
	const auto ensureNoVariables =
 | 
			
		||||
		[](const auto &predicate)
 | 
			
		||||
		{
 | 
			
		||||
@@ -38,7 +40,7 @@ inline void translateGoal(colorlog::ColorStream &outputStream, const ::pddl::nor
 | 
			
		||||
			ensureNoVariables(predicate);
 | 
			
		||||
 | 
			
		||||
			outputStream << std::endl << colorlog::Function("goal") << "(";
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, isPositive);
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ").";
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +56,7 @@ inline void translateGoal(colorlog::ColorStream &outputStream, const ::pddl::nor
 | 
			
		||||
			ensureNoVariables(derivedPredicate);
 | 
			
		||||
 | 
			
		||||
			outputStream << std::endl << colorlog::Function("goal") << "(";
 | 
			
		||||
			translateDerivedPredicateToVariable(outputStream, *derivedPredicate, isPositive);
 | 
			
		||||
			translateDerivedPredicateToVariable(outputStream, *derivedPredicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ").";
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ namespace pddl
 | 
			
		||||
template<typename PrintObjectName, typename PrintRuleBody>
 | 
			
		||||
inline void translatePrecondition(colorlog::ColorStream &outputStream,
 | 
			
		||||
	const ::pddl::normalizedAST::Precondition &precondition, PrintObjectName printObjectName,
 | 
			
		||||
	PrintRuleBody printRuleBody)
 | 
			
		||||
	PrintRuleBody printRuleBody, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
 | 
			
		||||
@@ -33,7 +33,7 @@ inline void translatePrecondition(colorlog::ColorStream &outputStream,
 | 
			
		||||
			outputStream << std::endl << colorlog::Function("precondition") << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ", ";
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, isPositive);
 | 
			
		||||
			translatePredicateToVariable(outputStream, *predicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ")";
 | 
			
		||||
			printRuleBody();
 | 
			
		||||
			outputStream << ".";
 | 
			
		||||
@@ -51,7 +51,7 @@ inline void translatePrecondition(colorlog::ColorStream &outputStream,
 | 
			
		||||
			outputStream << std::endl << colorlog::Function("precondition") << "(";
 | 
			
		||||
			printObjectName();
 | 
			
		||||
			outputStream << ", ";
 | 
			
		||||
			translateDerivedPredicateToVariable(outputStream, *derivedPredicate, isPositive);
 | 
			
		||||
			translateDerivedPredicateToVariable(outputStream, *derivedPredicate, variableIDs, isPositive);
 | 
			
		||||
			outputStream << ")";
 | 
			
		||||
			printRuleBody();
 | 
			
		||||
			outputStream << ".";
 | 
			
		||||
 
 | 
			
		||||
@@ -20,12 +20,12 @@ namespace pddl
 | 
			
		||||
//
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Predicate &predicate);
 | 
			
		||||
void translatePredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::PredicateDeclaration &predicateDeclaration);
 | 
			
		||||
void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Predicate &predicate, VariableIDMap &variableIDs);
 | 
			
		||||
void translatePredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::PredicateDeclaration &predicateDeclaration, VariableIDMap &variableIDs);
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Predicate &predicate)
 | 
			
		||||
inline void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Predicate &predicate, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	const auto &arguments = predicate.arguments;
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +50,7 @@ inline void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl
 | 
			
		||||
		const auto handleVariable =
 | 
			
		||||
			[&](const ::pddl::normalizedAST::VariablePointer &variable)
 | 
			
		||||
			{
 | 
			
		||||
				outputStream << *variable;
 | 
			
		||||
				translateVariable(outputStream, *variable, variableIDs);
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
		argument.match(handleConstant, handleVariable);
 | 
			
		||||
@@ -61,7 +61,7 @@ inline void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translatePredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::PredicateDeclaration &predicateDeclaration)
 | 
			
		||||
inline void translatePredicateDeclaration(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::PredicateDeclaration &predicateDeclaration, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	outputStream << colorlog::Keyword("variable") << "(";
 | 
			
		||||
 | 
			
		||||
@@ -72,24 +72,24 @@ inline void translatePredicateDeclaration(colorlog::ColorStream &outputStream, c
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	outputStream << "(" << predicateDeclaration;
 | 
			
		||||
	translateVariablesForRuleHead(outputStream, predicateDeclaration.parameters);
 | 
			
		||||
	translateVariablesForRuleHead(outputStream, predicateDeclaration.parameters, variableIDs);
 | 
			
		||||
	outputStream << "))";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void translatePredicateToVariable(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Predicate &predicate, bool isPositive = true)
 | 
			
		||||
void translatePredicateToVariable(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Predicate &predicate, VariableIDMap &variableIDs, bool isPositive = true)
 | 
			
		||||
{
 | 
			
		||||
	outputStream << colorlog::Keyword("variable") << "(";
 | 
			
		||||
 | 
			
		||||
	translatePredicate(outputStream, predicate);
 | 
			
		||||
	translatePredicate(outputStream, predicate, variableIDs);
 | 
			
		||||
 | 
			
		||||
	outputStream
 | 
			
		||||
		<< "), "
 | 
			
		||||
		<< colorlog::Keyword("value") << "("
 | 
			
		||||
		<< colorlog::Keyword("variable") << "(";
 | 
			
		||||
 | 
			
		||||
	translatePredicate(outputStream, predicate);
 | 
			
		||||
	translatePredicate(outputStream, predicate, variableIDs);
 | 
			
		||||
 | 
			
		||||
	outputStream << "), ";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -54,31 +54,6 @@ inline colorlog::ColorStream &operator<<(colorlog::ColorStream &stream, const ::
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline colorlog::ColorStream &operator<<(colorlog::ColorStream &stream, ::pddl::normalizedAST::VariableDeclaration &variableDeclaration)
 | 
			
		||||
{
 | 
			
		||||
	assert(!variableDeclaration.name.empty());
 | 
			
		||||
	assert(std::isalpha(variableDeclaration.name[0]));
 | 
			
		||||
 | 
			
		||||
	if (!std::isupper(variableDeclaration.name[0]))
 | 
			
		||||
		variableDeclaration.name[0] = std::toupper(variableDeclaration.name[0]);
 | 
			
		||||
 | 
			
		||||
	return (stream
 | 
			
		||||
		<< colorlog::Format({colorlog::Color::Green, colorlog::FontWeight::Bold})
 | 
			
		||||
		<< variableDeclaration.name
 | 
			
		||||
		<< colorlog::ResetFormat());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline colorlog::ColorStream &operator<<(colorlog::ColorStream &stream, ::pddl::normalizedAST::Variable &variable)
 | 
			
		||||
{
 | 
			
		||||
	assert(variable.declaration != nullptr);
 | 
			
		||||
 | 
			
		||||
	return (stream << *variable.declaration);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
// TODO: move to appropriate header
 | 
			
		||||
inline colorlog::ColorStream &operator<<(colorlog::ColorStream &stream, const ::pddl::normalizedAST::Action &action)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								include/plasp/pddl/translation/Variable.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								include/plasp/pddl/translation/Variable.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
#ifndef __PLASP__PDDL__TRANSLATION__VARIABLE_H
 | 
			
		||||
#define __PLASP__PDDL__TRANSLATION__VARIABLE_H
 | 
			
		||||
 | 
			
		||||
#include <map>
 | 
			
		||||
 | 
			
		||||
#include <colorlog/Formatting.h>
 | 
			
		||||
 | 
			
		||||
#include <pddl/NormalizedAST.h>
 | 
			
		||||
 | 
			
		||||
namespace plasp
 | 
			
		||||
{
 | 
			
		||||
namespace pddl
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Variable
 | 
			
		||||
//
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
using VariableIDMap = std::map<const ::pddl::normalizedAST::VariableDeclaration *, size_t>;
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translateVariableDeclaration(colorlog::ColorStream &stream, ::pddl::normalizedAST::VariableDeclaration &variableDeclaration, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	assert(!variableDeclaration.name.empty());
 | 
			
		||||
 | 
			
		||||
	const auto variableID =
 | 
			
		||||
		[&]()
 | 
			
		||||
		{
 | 
			
		||||
			const auto matchingVariableID = variableIDs.find(&variableDeclaration);
 | 
			
		||||
 | 
			
		||||
			if (matchingVariableID != variableIDs.cend())
 | 
			
		||||
				return matchingVariableID->second;
 | 
			
		||||
 | 
			
		||||
			const auto variableID = variableIDs.size() + 1;
 | 
			
		||||
 | 
			
		||||
			variableIDs.insert({&variableDeclaration, variableID});
 | 
			
		||||
 | 
			
		||||
			return variableID;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	stream
 | 
			
		||||
		<< colorlog::Format({colorlog::Color::Green, colorlog::FontWeight::Bold})
 | 
			
		||||
		<< "X" << variableID()
 | 
			
		||||
		<< colorlog::ResetFormat();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void translateVariable(colorlog::ColorStream &stream, ::pddl::normalizedAST::Variable &variable, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	assert(variable.declaration != nullptr);
 | 
			
		||||
 | 
			
		||||
	translateVariableDeclaration(stream, *variable.declaration, variableIDs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
#include <pddl/Parse.h>
 | 
			
		||||
 | 
			
		||||
#include <plasp/TranslatorException.h>
 | 
			
		||||
#include <plasp/pddl/translation/Variable.h>
 | 
			
		||||
 | 
			
		||||
namespace plasp
 | 
			
		||||
{
 | 
			
		||||
@@ -20,23 +21,26 @@ namespace pddl
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
void translateVariablesForRuleHead(colorlog::ColorStream &outputStream, const T &variables);
 | 
			
		||||
void translateVariablesForRuleHead(colorlog::ColorStream &outputStream, const T &variables, VariableIDMap &variableIDs);
 | 
			
		||||
template<class T>
 | 
			
		||||
void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T &variables);
 | 
			
		||||
void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T &variables, VariableIDMap &variableIDs);
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline void translateVariablesForRuleHead(colorlog::ColorStream &outputStream, const T &variables)
 | 
			
		||||
inline void translateVariablesForRuleHead(colorlog::ColorStream &outputStream, const T &variables, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	for (const auto &variable : variables)
 | 
			
		||||
		outputStream << ", " << *variable;
 | 
			
		||||
	{
 | 
			
		||||
		outputStream << ", ";
 | 
			
		||||
		translateVariableDeclaration(outputStream, *variable, variableIDs);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T &variables)
 | 
			
		||||
void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T &variables, VariableIDMap &variableIDs)
 | 
			
		||||
{
 | 
			
		||||
	for (const auto &variable : variables)
 | 
			
		||||
	{
 | 
			
		||||
@@ -50,14 +54,15 @@ void translateVariablesForRuleBody(colorlog::ColorStream &outputStream, const T
 | 
			
		||||
 | 
			
		||||
			const auto &type = variable->type.value().template get<::pddl::normalizedAST::PrimitiveTypePointer>();
 | 
			
		||||
 | 
			
		||||
			outputStream << colorlog::Function("has") << "("
 | 
			
		||||
				<< *variable << ", " << colorlog::Keyword("type") << "(" << *type << "))";
 | 
			
		||||
			outputStream << colorlog::Function("has") << "(";
 | 
			
		||||
			translateVariableDeclaration(outputStream, *variable, variableIDs);
 | 
			
		||||
			outputStream << ", " << colorlog::Keyword("type") << "(" << *type << "))";
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			outputStream << colorlog::Function("has") << "("
 | 
			
		||||
				<< *variable << ", "
 | 
			
		||||
				<< colorlog::Keyword("type") << "(" << colorlog::String("object") << "))";
 | 
			
		||||
			outputStream << colorlog::Function("has") << "(";
 | 
			
		||||
			translateVariableDeclaration(outputStream, *variable, variableIDs);
 | 
			
		||||
			outputStream << ", " << colorlog::Keyword("type") << "(" << colorlog::String("object") << "))";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -168,16 +168,21 @@ void TranslatorASP::translatePredicates() const
 | 
			
		||||
 | 
			
		||||
	for (const auto &predicate : predicates)
 | 
			
		||||
	{
 | 
			
		||||
		VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
		m_outputStream << std::endl << colorlog::Function("variable") << "(";
 | 
			
		||||
 | 
			
		||||
		translatePredicateDeclaration(m_outputStream, *predicate);
 | 
			
		||||
		translatePredicateDeclaration(m_outputStream, *predicate, variableIDs);
 | 
			
		||||
 | 
			
		||||
		m_outputStream << ")";
 | 
			
		||||
 | 
			
		||||
		if (!predicate->parameters.empty())
 | 
			
		||||
		{
 | 
			
		||||
			m_outputStream << " :- ";
 | 
			
		||||
			translateVariablesForRuleBody(m_outputStream, predicate->parameters);
 | 
			
		||||
 | 
			
		||||
			VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
			translateVariablesForRuleBody(m_outputStream, predicate->parameters, variableIDs);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m_outputStream << ".";
 | 
			
		||||
@@ -201,16 +206,18 @@ void TranslatorASP::translateDerivedPredicates(const ::pddl::normalizedAST::Deri
 | 
			
		||||
 | 
			
		||||
	for (const auto &derivedPredicate : derivedPredicates)
 | 
			
		||||
	{
 | 
			
		||||
		VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
		m_outputStream << std::endl << colorlog::Function("derivedVariable") << "(";
 | 
			
		||||
 | 
			
		||||
		translateDerivedPredicateDeclaration(m_outputStream, *derivedPredicate);
 | 
			
		||||
		translateDerivedPredicateDeclaration(m_outputStream, *derivedPredicate, variableIDs);
 | 
			
		||||
 | 
			
		||||
		m_outputStream << ")";
 | 
			
		||||
 | 
			
		||||
		if (!derivedPredicate->parameters.empty())
 | 
			
		||||
			m_outputStream << " :- ";
 | 
			
		||||
 | 
			
		||||
		translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters);
 | 
			
		||||
		translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters, variableIDs);
 | 
			
		||||
 | 
			
		||||
		m_outputStream << ".";
 | 
			
		||||
	}
 | 
			
		||||
@@ -226,6 +233,8 @@ void TranslatorASP::translateDerivedPredicates(const ::pddl::normalizedAST::Deri
 | 
			
		||||
 | 
			
		||||
	for (const auto &derivedPredicate : derivedPredicates)
 | 
			
		||||
	{
 | 
			
		||||
		VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
		const auto printDerivedPredicateName =
 | 
			
		||||
			[&]()
 | 
			
		||||
			{
 | 
			
		||||
@@ -239,8 +248,8 @@ void TranslatorASP::translateDerivedPredicates(const ::pddl::normalizedAST::Deri
 | 
			
		||||
 | 
			
		||||
				m_outputStream << "(" << *derivedPredicate;
 | 
			
		||||
 | 
			
		||||
				translateVariablesForRuleHead(m_outputStream, derivedPredicate->parameters);
 | 
			
		||||
				translateVariablesForRuleHead(m_outputStream, derivedPredicate->existentialParameters);
 | 
			
		||||
				translateVariablesForRuleHead(m_outputStream, derivedPredicate->parameters, variableIDs);
 | 
			
		||||
				translateVariablesForRuleHead(m_outputStream, derivedPredicate->existentialParameters, variableIDs);
 | 
			
		||||
 | 
			
		||||
				m_outputStream << ")), " << colorlog::Keyword("type") << "(";
 | 
			
		||||
 | 
			
		||||
@@ -262,18 +271,18 @@ void TranslatorASP::translateDerivedPredicates(const ::pddl::normalizedAST::Deri
 | 
			
		||||
		if (!derivedPredicate->parameters.empty() || !derivedPredicate->existentialParameters.empty())
 | 
			
		||||
			m_outputStream << " :- ";
 | 
			
		||||
 | 
			
		||||
		translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters);
 | 
			
		||||
		translateVariablesForRuleBody(m_outputStream, derivedPredicate->parameters, variableIDs);
 | 
			
		||||
 | 
			
		||||
		if (!derivedPredicate->existentialParameters.empty() && !derivedPredicate->parameters.empty())
 | 
			
		||||
			m_outputStream << ", ";
 | 
			
		||||
 | 
			
		||||
		translateVariablesForRuleBody(m_outputStream, derivedPredicate->existentialParameters);
 | 
			
		||||
		translateVariablesForRuleBody(m_outputStream, derivedPredicate->existentialParameters, variableIDs);
 | 
			
		||||
 | 
			
		||||
		m_outputStream << ".";
 | 
			
		||||
 | 
			
		||||
		// Precondition
 | 
			
		||||
		if (derivedPredicate->precondition)
 | 
			
		||||
			translateDerivedPredicatePrecondition(m_outputStream, derivedPredicate->precondition.value(), "derivedPredicate", printDerivedPredicateName);
 | 
			
		||||
			translateDerivedPredicatePrecondition(m_outputStream, derivedPredicate->precondition.value(), "derivedPredicate", printDerivedPredicateName, variableIDs);
 | 
			
		||||
 | 
			
		||||
		m_outputStream << std::endl << colorlog::Function("postcondition") << "(";
 | 
			
		||||
		printDerivedPredicateName();
 | 
			
		||||
@@ -281,7 +290,7 @@ void TranslatorASP::translateDerivedPredicates(const ::pddl::normalizedAST::Deri
 | 
			
		||||
			<< ", " << colorlog::Keyword("effect") << "("
 | 
			
		||||
			<< colorlog::Reserved("unconditional") << ")"
 | 
			
		||||
			<< ", ";
 | 
			
		||||
		translateDerivedPredicateDeclarationToVariable(m_outputStream, *derivedPredicate, true);
 | 
			
		||||
		translateDerivedPredicateDeclarationToVariable(m_outputStream, *derivedPredicate, variableIDs, true);
 | 
			
		||||
		m_outputStream << ") :- " << colorlog::Function("derivedPredicate") << "(";
 | 
			
		||||
		printDerivedPredicateName();
 | 
			
		||||
		m_outputStream << ").";
 | 
			
		||||
@@ -302,6 +311,8 @@ void TranslatorASP::translateActions() const
 | 
			
		||||
 | 
			
		||||
	for (const auto &action : actions)
 | 
			
		||||
	{
 | 
			
		||||
		VariableIDMap variableIDs;
 | 
			
		||||
 | 
			
		||||
		const auto printActionName =
 | 
			
		||||
			[&]()
 | 
			
		||||
			{
 | 
			
		||||
@@ -314,7 +325,7 @@ void TranslatorASP::translateActions() const
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				m_outputStream << "(" << *action;
 | 
			
		||||
				translateVariablesForRuleHead(m_outputStream, action->parameters);
 | 
			
		||||
				translateVariablesForRuleHead(m_outputStream, action->parameters, variableIDs);
 | 
			
		||||
				m_outputStream << "))";
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
@@ -336,7 +347,7 @@ void TranslatorASP::translateActions() const
 | 
			
		||||
		if (!action->parameters.empty())
 | 
			
		||||
		{
 | 
			
		||||
			m_outputStream << " :- ";
 | 
			
		||||
			translateVariablesForRuleBody(m_outputStream, action->parameters);
 | 
			
		||||
			translateVariablesForRuleBody(m_outputStream, action->parameters, variableIDs);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m_outputStream << ".";
 | 
			
		||||
@@ -344,12 +355,12 @@ void TranslatorASP::translateActions() const
 | 
			
		||||
		// Precondition
 | 
			
		||||
		if (action->precondition)
 | 
			
		||||
			translatePrecondition(m_outputStream, action->precondition.value(), printActionName,
 | 
			
		||||
				printPreconditionRuleBody);
 | 
			
		||||
				printPreconditionRuleBody, variableIDs);
 | 
			
		||||
 | 
			
		||||
		// Effect
 | 
			
		||||
		if (action->effect)
 | 
			
		||||
			translateEffect(m_outputStream, action->effect.value(), printActionName,
 | 
			
		||||
				numberOfConditionalEffects);
 | 
			
		||||
				numberOfConditionalEffects, variableIDs);
 | 
			
		||||
 | 
			
		||||
		m_outputStream << std::endl;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user