predicate pareto_optimal(var int: obj1, var int: obj2) = let { int: ms = 1000; % max solutions var 0..ms: nsol; % number of solutions set of int: SOL = 1..ms; array[SOL] of var lb(obj1)..ub(obj1): s1; array[SOL] of var lb(obj2)..ub(obj2): s2; } in if status() = START then nsol = 0 elseif status() = UNSAT then complete() % we are finished! elseif nsol = sol(nsol) + 1 /\ s1[nsol] = sol(obj1) /\ s2[nsol] = sol(obj2) endif /\ for(i in 1..nsol) ( obj1 < lastval(s1[i]) \/ obj2 < lastval(s2[i]) );