lib/solver/constraints/all_different.ex

defmodule CPSolver.Constraint.AllDifferent do
  use CPSolver.Constraint
  alias CPSolver.Propagator.NotEqual

  @impl true
  def propagators(variables) do
    for i <- 0..(length(variables) - 2) do
      for j <- (i + 1)..(length(variables) - 1) do
        NotEqual.new(Enum.at(variables, i), Enum.at(variables, j))
      end
    end
    |> List.flatten()
  end
end