defmodule CPSolver.Constraint.Inverse do
@moduledoc """
Constraints two arrays of variables `f` and `inv_f`
to represent an inverse function.
That is, for all i = 1..n, where n is a size of x:
inv_f[f[i]] == i
and:
f[inv_f[i]] == i
MiniZinc definition (fzn_inverse.mzn):
forall(i in index_set(f)) (
f[i] in index_set(invf) /\
(invf[f[i]] == i)
) /\
forall(j in index_set(invf)) (
invf[j] in index_set(f) /\
(f[invf[j]] == j)
);
Note: the current implementation assumes the index set for both `f` and `inv_f` is always 0-based
"""
alias CPSolver.Constraint.Factory
def new(f, inv_f) do
new([f, inv_f])
end
def new([f, inv_f]) do
Factory.inverse(f, inv_f)
end
end