From 5bda14342ba7d5fea3723f8e1f1688be5e145489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Fri, 20 Apr 2018 16:23:02 +0200 Subject: [PATCH] Print rules for integer parameters For every integer parameter of the predicates visible in the output, this prints a short fact to the output to make this explicit. --- src/anthem/Translation.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/anthem/Translation.cpp b/src/anthem/Translation.cpp index 955fcca..e20c10a 100644 --- a/src/anthem/Translation.cpp +++ b/src/anthem/Translation.cpp @@ -125,6 +125,38 @@ void translate(const char *fileName, std::istream &stream, Context &context) ast::print(context.logger.outputStream(), completedFormula, printContext); context.logger.outputStream() << std::endl; } + + // Print specifiers for integer predicate parameters + for (auto &predicateDeclaration : context.predicateDeclarations) + { + // Check that the predicate is used and not declared #external + if (!predicateDeclaration->isUsed || predicateDeclaration->isExternal) + continue; + + const auto isPredicateVisible = + (predicateDeclaration->visibility == ast::PredicateDeclaration::Visibility::Visible) + || (predicateDeclaration->visibility == ast::PredicateDeclaration::Visibility::Default + && context.defaultPredicateVisibility == ast::PredicateDeclaration::Visibility::Visible); + + // If the predicate ought to be visible, don’t eliminate it + if (!isPredicateVisible) + continue; + + for (size_t i = 0; i < predicateDeclaration->parameters.size(); i++) + { + auto ¶meter = predicateDeclaration->parameters[i]; + + if (parameter.domain != ast::Domain::Integer) + continue; + + context.logger.outputStream() + << output::Keyword("int") + << "(" << predicateDeclaration->name + << "/" << output::Number(predicateDeclaration->arity()) + << "@" << output::Number(i) + << ")." << std::endl; + } + } } ////////////////////////////////////////////////////////////////////////////////////////////////////