MiniZinc中的高阶函数

时间:2019-06-09 19:46:07

标签: minizinc

我正在尝试在MiniZinc中实现higher-order functions。我不确定是否可以将一个函数直接传递给另一个函数,所以我使用了带有函数名列表的枚举:

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 :(得分:0)

尽管在论文(https://www.semanticscholar.org/paper/MiniZinc-with-Functions-Stuckey-Tack/4f7a420b9ddce7fea682768fa35d2cf436683b28)中已建议对MiniZinc使用更高级别的功能。 MiniZinc编译器本身尚未支持更高级别的功能。

尽管我无法为您提供一种完美的解决方法,但通常可以使用常规函数,可选类型或递归函数来替换高阶函数