“函数返回类型重载歧义”报错原因是什么?如何解决该类代码问题?
错误触发原因
这个错误是MiniZinc编译器的函数重载歧义导致的:
- MiniZinc内置的
min函数存在两个匹配的重载版本:一个接收固定参数类型(par int)的集合/数组,返回固定值;另一个接收决策变量类型(var int)的集合/数组,返回决策变量。 - 你代码中数组推导
[p | p in people where status[p]]生成的是固定par int类型的数组,但你将min的返回值赋值给了声明为var int的objective变量,编译器无法判定应该调用哪个重载版本,因此抛出类型歧义错误。
可行解决方法
- 方法1:将目标变量声明为固定参数类型
如果你的objective不需要作为决策变量参与后续约束求解,直接把它声明为par int即可,编译器会自动匹配参数版本的min函数:
par int: objective= min([p | p in people where status[p]]);
- 方法2:显式指定输入的类型为决策变量类型
如果确实需要objective为var int类型,可以把数组推导的结果显式转为决策变量数组,让编译器匹配对应重载:
var int: objective= min(array1d(var int, [p | p in people where status[p]]));
- 方法3:直接实现找首个
true元素的逻辑,避开min重载问题
用约束的方式直接定义首个满足条件的下标,逻辑更直观也不会触发类型歧义:
var int: objective; constraint exists(p in people)( status[p] /\ objective = p /\ forall(q in 1..p-1)(not status[q]) );
内容的提问来源于stack exchange,提问作者Adel
相关产品推荐
相关产品推荐

