# Using xor with JuMP and MiniZinc

**URL:** <https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519>\
**Category:** Optimization (Mathematical)\
**Created:** [July 2, 2024, 12:47pm UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519 "2024-07-02T12:47:16Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![remi-garcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/remi-garcia/32/7125_2.png) [@remi-garcia](https://discourse.julialang.org/u/remi-garcia)\
**Post date:** [July 2, 2024, 12:47pm UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/1 "2024-07-02T12:47:16Z")

</div>

Hi,

With JuMP, I can create constraints with `&&` and `||`. I am trying to use `xor` and `not`. Is there a way to do this?

> **[Constraints · JuMP](https://jump.dev/JuMP.jl/stable/manual/constraints/#Boolean-constraints)**
>
> Documentation for JuMP.

I can do the following:

```julia
using JuMP
using MiniZinc

model = Model(() -> MiniZinc.Optimizer{Float64}("chuffed"))

@variable(model, x, Bin)
@variable(model, y, Bin)
@constraint(model, x && y := true)

```

I want to also be able to do:

```julia
@constraint(model, not(x) := true)
@constraint(model, xor(x, y) := true)

```

Thank you

---

<div class="post-metadata">

**Author:** ![lrnv](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lrnv/32/19373_2.png) [@lrnv](https://discourse.julialang.org/u/lrnv)\
**Post date:** [July 2, 2024, 3:57pm UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/2 "2024-07-02T15:57:18Z")

</div>

what about :

- `x := false` for the `not` ?
- two constraints `x || y := true` and `x && y := false` for the `xor` ?

I think such tricks would globally cover binary arithmetic

---

<div class="post-metadata">

**Author:** ![remi-garcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/remi-garcia/32/7125_2.png) [@remi-garcia](https://discourse.julialang.org/u/remi-garcia)\
**Post date:** [July 2, 2024, 7:06pm UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/3 "2024-07-02T19:06:17Z")

</div>

My issue is that I want to have constraints a bit more complicated, like

```julia
(x && y && not(z)) || (x && not(y) && z) := true

```

and even if we can detect that it simplifies a bit with `x := true` for example, I don’t want to detect that as the solver can do it.

The other issue is that I actually don’t know that `xor(x, y) := true` but it would be something more like `xor(x, y) == z := true` and then I have constraints on `z`.

Still, I can simplify the `xor` (and I am currently using a workaround), but this does not apply for the `not`

---

<div class="post-metadata">

**Author:** ![lrnv](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lrnv/32/19373_2.png) [@lrnv](https://discourse.julialang.org/u/lrnv)\
**Post date:** [July 2, 2024, 7:16pm UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/4 "2024-07-02T19:16:33Z")

</div>

It should always simplify, but I agree that the solver should do it for you. Interested in what others have to say

---

<div class="post-metadata">

**Author:** ![remi-garcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/remi-garcia/32/7125_2.png) [@remi-garcia](https://discourse.julialang.org/u/remi-garcia)\
**Post date:** [July 3, 2024, 10:05am UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/5 "2024-07-03T10:05:53Z")

</div>

As a workaround, I currently replace expressions like

```julia
(x && y && not(z)) || (x && not(y) && z) := true

```

by

```julia
(x && y && (z == false)) || (x && (y == false) && z) := true

```

So a `xor` constraint like `z == xor(x, y)` becomes

```julia
(x && (y == false)) || (y && (x == false)) == z := true

```

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [July 13, 2024, 2:37am UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/6 "2024-07-13T02:37:23Z")

</div>

This is undocumented, but MiniZinc has support for `⊻`: [MiniZinc.jl/src/MiniZinc.jl at 3bc82dc24feb869a1aa0784cb8dcc0d5b82fa104 · jump-dev/MiniZinc.jl · GitHub](https://github.com/jump-dev/MiniZinc.jl/blob/3bc82dc24feb869a1aa0784cb8dcc0d5b82fa104/src/MiniZinc.jl#L113)  
and `!` [MiniZinc.jl/src/MiniZinc.jl at 3bc82dc24feb869a1aa0784cb8dcc0d5b82fa104 · jump-dev/MiniZinc.jl · GitHub](https://github.com/jump-dev/MiniZinc.jl/blob/3bc82dc24feb869a1aa0784cb8dcc0d5b82fa104/src/MiniZinc.jl#L86)

So you can do something like:

```Julia
using JuMP
using MiniZinc
model = Model(() -> MiniZinc.Optimizer{Float64}("chuffed"))
@variable(model, x, Bin)
@variable(model, y, Bin)
Base.:⊻(x::VariableRef, y::VariableRef) = NonlinearExpr(:⊻, Any[x, y])
Base.:!(x::AbstractJuMPScalar) = NonlinearExpr(:!, Any[x])
@constraint(model, !(x ⊻ y) := true)
optimize!(model)
value(x), value(y)

```

---

<div class="post-metadata">

**Author:** ![remi-garcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/remi-garcia/32/7125_2.png) [@remi-garcia](https://discourse.julialang.org/u/remi-garcia)\
**Post date:** [July 13, 2024, 8:48am UTC](https://discourse.julialang.org/t/using-xor-with-jump-and-minizinc/116519/7 "2024-07-13T08:48:14Z")

</div>

Thank you! I saw that MiniZinc.jl had support for it but I did not know the way to allow using `⊻` and `!` in `@constraint`.
