From 09ef64a0e1d6d3b1eedde5d6843446ef280f4ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Thu, 19 Apr 2018 16:11:05 +0200 Subject: [PATCH] Support declaring functions as integer This adds a new syntax for declaring functions integer: #external integer((().” supported"); + throw LogicException(statement.location, "only #external declarations of the form “#external ().” or “#external integer(()).” supported"); }; if (!external.body.empty()) @@ -204,6 +204,47 @@ struct StatementVisitor if (predicate.arguments.size() != 1) fail(); + const auto handleIntegerDeclaration = + [&]() + { + // Integer function declarations are treated separately if applicable + if (strcmp(predicate.name, "integer") != 0) + return false; + + if (predicate.arguments.size() != 1) + return false; + + const auto &functionArgument = predicate.arguments.front(); + + if (!functionArgument.data.is()) + return false; + + const auto &function = functionArgument.data.get(); + + if (function.arguments.size() != 1) + return false; + + const auto &arityArgument = function.arguments.front(); + + if (!arityArgument.data.is()) + return false; + + const auto &aritySymbol = arityArgument.data.get(); + + if (aritySymbol.type() != Clingo::SymbolType::Number) + return false; + + const size_t arity = aritySymbol.number(); + + auto functionDeclaration = context.findOrCreateFunctionDeclaration(function.name, arity); + functionDeclaration->domain = Domain::Integer; + + return true; + }; + + if (handleIntegerDeclaration()) + return; + const auto &arityArgument = predicate.arguments.front(); if (!arityArgument.data.is())