Я новичок в программировании с ограничениями и изучаю 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, но в его текущей форме он занимает много места, и его сложно отслеживать по коду. Я бы хотел переписать код следующим образом:
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 для выражения вышеуказанного кода? Спасибо!