iff is used to create equivalence constraints between logic cases

```
F = iff(A,B)
```

iff is used to define logic equivalence. As an example, the following code will ensure that a variable **x** satisfies a set of inequalities if and only if a binary variable **d** is true (value 1), and vice versa.

```
d = binvar(1);
F = iff(d,A*x <= b);
```

iff is mainly intended for (BINARY <-> BINARY), although it can be used also for more general constructions as above (bearing in mind that these models typically are numerically sensitive and may require a lot of binary variables to be modeled).

The following code constrains a variable **y** if and only if a set of constraints on **x** hold.

```
F = iff(A*x <= b, A*y <=y);
```

The following code is equivalent

```
d = binvar(1,1);
F = iff(A*x <= b, d);
F = iff(A*y <= b, d);
```

iff is overloaded as == on constraints, hence the following code gives the same model.

```
F = [(A*x <= b) == (A*y <= b)];
```

and so does the following model

```
binvar d
F = [d == (A*x <= b), d == (A*y <= b)];
```

Since iff is implemented using a big-M approach, it is crucial that all involved variables have explicit bound constraints.

iff is very sensitive to modeling choices (is \(10^{-5}\) really a positive number in practice?), so it should be avoided as much as possible. If you can rewrite your model to simple (BINARY-> Linear) using implies, do so! See for instance the logic programming example