如何在 Minizinc 中为函数创建等价物以简化谓词

How to create an equivalent for a function in Minizinc to simplify a predicate

我对约束编程还很陌生,我正在学习 MiniZinc。 我有很大的谓词,我想创建一个等效的函数(用经典编程语言)来简化谓词

比如我有:

% INPUTS
int: nodes;
float: T;
%OUTPUT
array [1..nodes, 1..nodes] of var 0..1000: rates_matrix;

predicate column_summ(int: to_dc) =
sum(from_dc in 1..nodes) (rates_matrix[from_dc, to_dc]) * sum(from_dc in 1..nodes) (rates_matrix[from_dc, to_dc]) * 2 < T; 

constraint forall(n in 1..nodes) (column_summ(n));
solve satisfy;

column_summ 谓词简单地计算函数 f(x) 2x^2 < T 的等价物,但在其当前形式下它需要很多 space 并且很难遵循代码。我希望能够按以下方式重写代码:

function f_polynomial(x) = 2*x*x;
function f_sum(y, m) = sum(from_dc in 1..nodes) (m[from_dc, y])

predicate column_summ(int: to_dc) =
    f_polynomial(f_sum(to_dc, rates_matrix)) < T;

MiniZinc 中表达上述代码的正确语法是什么? 谢谢!

这是一种使用函数的变体。我添加了一些初始值("nodes" 和 "T")以便能够使用该模型。

% INPUTS
int: nodes = 5; 
float: T = 100.0;
%OUTPUT
array [1..nodes, 1..nodes] of var 0..1000: rates_matrix;

function var int: f_polynomial(var int: x) = 2*x*x;
function var int: f_sum(var int: y, array[int,int] of var int: m) = sum(from_dc in 1..nodes) (m[from_dc, y]);

predicate column_summ(int: to_dc) = f_polynomial(f_sum(to_dc, rates_matrix)) < T;

constraint forall(n in 1..nodes) (column_summ(n));
solve satisfy;

我建议您阅读 MiniZinc Tutorial,尤其是关于谓词和函数的第 4.3 节。