Функции высшего порядка в MiniZinc - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь реализовать функции высшего порядка в MiniZinc.Я не уверен, возможно ли передать функцию непосредственно другой функции, поэтому я использовал перечисление со списком имен функций:

var int : a;

enum functions = {add,sub}; 

function var int:sub(var int:a,var int:b) = 
    a+b;

function var int:add(var int:a,var int:b) = 
    a+b;

function var int:higher_order(var functions:func,var int:a,var int:b) = 
    if func==add then 
        add(a,b) 
    else 
        0
    endif;

constraint a == higher_order(add,3,4);
solve satisfy;
output [show(a)];

Этот метод работает, хотя на самом деле это не более высокий порядокфункция.Есть ли другой способ реализации функций высшего порядка в MiniZinc?

1 Ответ

0 голосов
/ 10 июня 2019

Хотя использование функций более высокого уровня для MiniZinc было предложено в статье (https://www.semanticscholar.org/paper/MiniZinc-with-Functions-Stuckey-Tack/4f7a420b9ddce7fea682768fa35d2cf436683b28). Поддержка функций более высокого уровня еще не достигла самого компилятора MiniZinc.

Хотя я не могу вам это предоставитьс помощью одного идеального обходного пути часто функции более высокого порядка можно заменить с помощью обычных функций, необязательных типов или рекурсивных функций

...