Binpacking

setup

Setup

use Exhort.SAT.Builder

model

Model

builder =
  Builder.new()
  |> Builder.def_int_var(:x, {0, 10})
  |> Builder.def_int_var(:y, {0, 10})
  |> Builder.def_bool_var(:b)
  |> Builder.constrain(:x >= 5, if: :b)
  |> Builder.constrain(:x < 5, unless: :b)
  |> Builder.constrain(:x + :y == 10, if: :b)
  |> Builder.constrain(:y == 0, unless: :b)

solution

Solution

{response, acc} =
  builder
  |> Builder.build()
  |> Model.solve(fn
    _response, nil -> 1
    _response, acc -> acc + 1
  end)