Fixes lost signs with negated 0-ary predicates.

This commit is contained in:
2017-05-04 15:44:37 +02:00
parent a1793e2dff
commit d056fabb8b
3 changed files with 22 additions and 3 deletions

View File

@@ -58,7 +58,14 @@ struct BodyTermTranslateVisitor
throwErrorAtLocation(literal.location, "double-negated literals currently unsupported", context);
if (function.arguments.empty())
return ast::Formula::make<ast::Predicate>(std::string(function.name));
{
auto predicate = ast::Formula::make<ast::Predicate>(std::string(function.name));
if (literal.sign == Clingo::AST::Sign::None)
return std::move(predicate);
else if (literal.sign == Clingo::AST::Sign::Negation)
return ast::Formula::make<ast::Not>(std::move(predicate));
}
std::vector<ast::Variable> variables;
variables.reserve(function.arguments.size());
@@ -82,7 +89,7 @@ struct BodyTermTranslateVisitor
if (literal.sign == Clingo::AST::Sign::None)
conjunction.arguments.emplace_back(std::move(predicate));
else
else if (literal.sign == Clingo::AST::Sign::Negation)
conjunction.arguments.emplace_back(ast::Formula::make<ast::Not>(std::move(predicate)));
context.auxiliaryBodyVariableID += function.arguments.size();