我正在尝试在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中实现高阶功能吗?
答案 0 :(得分:0)
尽管在论文(https://www.semanticscholar.org/paper/MiniZinc-with-Functions-Stuckey-Tack/4f7a420b9ddce7fea682768fa35d2cf436683b28)中已建议对MiniZinc使用更高级别的功能。 MiniZinc编译器本身尚未支持更高级别的功能。
尽管我无法为您提供一种完美的解决方法,但通常可以使用常规函数,可选类型或递归函数来替换高阶函数