# Complement constraints **Syntax:** - `x` is numeric variable constrained, `y`/`z` are other variables, `N`s are constants - `y|N` means "a variable `y` or a constant" - `X` is a set variable, `Y`/`Z` are other set variables, `s` are constants **Numeric:** - Equal (`x = y|N`) - Less (`x < y|N`) - Less or equal (`x <= y|N`) - Greater (`x > y|N`) - Greater or equal (`x >= y|N`) - (Some range stuff, poss. including offset range) // Range stuff can be emulated as `x > 2 and x < 10` // Yeah, but what about multiple ranges? Using conditional variables and stuff would get annoying when it's such a common thing we'll need - Addition (`x|N + y|N = z|N`) - Subtraction (`x|N - y|N = z|N`) - Multiplication (`x|N * y|N = z|N`) - Division (`x|N / y|N = z|N`) - Integer divison (`x|N // y|N = z|N`) - Modulo (`x|N % y|N = z|N`) - Power (`x|N ** y|N = z|N`) // unknown if we'll want to have this - Constant polynomial (`0 = N * x|N ** N + N * x|N ** (N - 1) + ... + N * x|N + N`) - (Modular ranges, however those will work) **Multitype:** - Number-is-set (`x = X`) **Set:** - Union (`X|s union Y|s = Z|s`) - Intersection (`X|s intr Y|s = Z|s`) - Difference (`X|s diff Y|s = Z|s`) - Symmetric difference (`X|s symd Y|s = Z|s`) - In (`y|Y|N|s in X|s`) - Not in (`¬(y|Y|N|s in X|s)`) - Size (`size(X|s) = y|N`) - Subset (`X|s sub Y|s = Z|s`) - Proper subset (`X|s psub Y|s = Z|s`) - Superset (`X|s sup Y|s = Z|s`) - Proper superset (`X|s psup Y|s = Z|s`) - Complement (`comp(x|s) = Y|s`)