language Essence 1.5
$ prob002.essence: Template Design
$ Problem details available at

given n_templates:  int(1..),            $ Number of printing templates
      n_slots:      int(1..),            $ Number of slots per template
      n_variations: int(1..)             $ Number of variations to be printed

$ these are the templates
letting templates be new type of size n_templates

$ Name the variations 1..n.
$ Alternatively, variations could be named
$   by a "given" enumerated type
letting variations be domain int(1..n_variations)

$ Specifies the minimum number of copies of each variation that MUST be printed
given demand: function (total) variations --> int

$ This tells us how many times each variation appears on each template
find design: function (total) (templates, variations) --> int(0..n_slots)

$ This tells us how many times each  template is to be printed
find printings: function (total) templates --> int(0..max(range(demand)))

$ demand must be met
such that forAll v : variations. (sum t : templates. printings(t) * design((t,v))) >= demand(v)

$ minimise the total number of printings
minimising sum t : templates. printings(t)