$ The Balanced Imcomplete Block Design(BIBD) problem $ $ Assign v objects to b blocks such that such that each block $ contains k different objects, each object occurrs in exactly $ r different blocks and every 2 distinct objects occurr in $ exactly l blocks. $ $ We represent the problem by a vxb matrix of booleans, where $ matrix[i,j] equals 1(true) iff object i has been assign to $ block j. The matrix 'columns' has the same elements as the $ problem matrix 'bibd', just with the columns switched to rows $ in order to apply the lex constraint on each column of 'bibd'. $ ESSENCE' 1.0 given v, b, r, k, l : int find bibd: matrix indexed by [int(1..v), int(1..b)] of bool such that $ each block contains k different objects forall block : int(1..b) . (sum object : int(1..v). bibd[object, block]) = k, $ each object occurs in r blocks forall object : int(1..v) . (sum block : int(1..b). bibd[object, block]) = r , $ two different objects occurr in a block exactly l times forall object1 : int(1..v) . forall object2 : int(1..v) . (object1 < object2) => ((sum block : int(1..b). bibd[object1,block] * bibd[object2, block]) = l), $ Some symmetry breaking constraints forall row: int(1..v-1) . bibd[row,..] <=lex bibd[row+1,..], forall col: int(1..b-1) . bibd[..,col] <=lex bibd[..,col+1]