The general way to do this at the model level is described in the Mosek Cookbook (it’s just about the maths, not specific to the Mosek solver).
The JuMP model would look like
using JuMP
import Gurobi
n = 3 # number of "AND" terms
model = Model(Gurobi.Optimizer)
@variable(model, x[1:n], Bin)
@variable(model, z, Bin) # z is x[1] AND ... AND x[n]
@constraint(model, [i=1:n], x[i] >= z)
@constraint(model, z + (n-1) >= sum(x))
you can then define logical propositions using Boolean algebra (unicode operators supported too)
you can then either call reformulate_model to transform the logical model into a MIP. Alternately, you can leave all the logical constraints and call optimize!(model), the model will be reformulated in the background by transforming the logical constraints into algebraic constraints with binary variables.
Note, the transformation creates binary variables from the logical variables and adds the 3 algebraic constraints @jd-foster gave above. The extra constraint x[1] + x[3] + x[4] - x[5] <= 2 forces the reverse implication on x[5]. Without it, the constraint being added is x5 implies x1 AND x3 AND x4 (instead of x5 iff x1 AND x3 AND x4).