有没有办法在 minizinc 谓词中提供搜索注释?

is there a way to provide search annotation in minizinc predicate?

我想知道我是否可以在 minizinc 谓词中提供搜索顺序。例如我有这样的代码

predicate numbers_falling_within_range (var int:a, var int:b)=
      let {
         var 213233..4535553: num;
       } in 
       (a+b<num*64+64) /\ (a+b>num*64);  %% pick a and b such that their sum fall within a range

这里我更喜欢当它执行谓词时,它首先解决 num,然后再 ab。有办法吗?我正在寻找类似于解决我们在模型末尾提供的订单注释的东西。

你唯一可以设计搜索策略的地方是你解决项目,但你也可能会问:"Can I devise a search strategy over (to a predicate) local variables?"

由于 MiniZinc 是一种作用域语言,您无法在谓词之外真正访问这些变量,但您可以将它们提升到全局作用域:

int num_num = ???;
array[1..num_num] of var 213233..4535553: nums;
predicate numbers_falling_within_range (var int: a, var int: b, var int: num) =
  (a+b<num*64+64) /\ (a+b>num*64);

% a call to the predicate
constraint numbers_falling_within_range(x, y, nums[1]);

solve ::int_search(nums, input_order, indomain_min) minimize cost;

请注意,只有在可以(过度)估计对谓词的调用次数并为每个调用提供不同的(现在是全局的)变量的情况下,这种方法才有可能。除非您的谓词是递归的,否则这应该相对简单。