Skip to main content

pumpkin_constraints/constraints/
all_different.rs

1use pumpkin_core::constraints::Constraint;
2use pumpkin_core::proof::ConstraintTag;
3use pumpkin_core::variables::IntegerVariable;
4
5use super::binary_not_equals;
6
7/// Creates the [`Constraint`] that enforces that all the given `variables` are distinct.
8pub fn all_different<Var: IntegerVariable + 'static>(
9    variables: impl Into<Box<[Var]>>,
10    constraint_tag: ConstraintTag,
11) -> impl Constraint {
12    let variables: Box<[Var]> = variables.into();
13    let mut constraints = Vec::new();
14
15    for i in 0..variables.len() {
16        for j in i + 1..variables.len() {
17            constraints.push(binary_not_equals(
18                variables[i].clone(),
19                variables[j].clone(),
20                constraint_tag,
21            ));
22        }
23    }
24
25    constraints
26}