You got your array dimensions mixed up. It helps if you give your variables more meaningful names to make it more obvious what ranges over what.
include "globals.mzn";
int: n = 3; % number of speakers
int: s = 6; % number of slots
array[1..n] of set of 1..s: available; % the available slots
array[1..n] of var 1..s: speaks_at; % the allotted speaker slot
solve :: int_search(speaks_at, first_fail, indomain_min, complete)
minimize max(speaks_at);
constraint
all_different(speaks_at)
/\
forall(i in 1..n) (
speaks_at[i] in available[i]
)
;
% at which slot is each speaker available to speak
available = [
{1,4,5},
{4,5},
{1,3,4,6}
];
output
[
show(speaks_at)
];
This gives the expected answer:
% Starting search
Found a solution with cost 4
speaks_at = array1d(1..3, [1,4,3]);
% Minimum objective value = 4
% Total time 0.016s cpu (0.000 setup + 0.000 search)
----------