  We propose a general framework for solving inverse self-assembly problems,
i.e. designing interactions between elementary units such that they assemble
spontaneously into a predetermined structure. Our approach uses patchy
particles as building blocks, where the different units bind at specific
interaction sites (the patches), and we exploit the possibility of having
mixtures with several components. The interaction rules between the patches is
determined by transforming the combinatorial problem into a Boolean
satisfiability problem (SAT) which searches for solutions where all bonds are
formed in the target structure. Additional conditions, such as the
non-satisfiability of competing structures (e.g. metastable states) can be
imposed, allowing to effectively design the assembly path in order to avoid
kinetic traps. We demonstrate this approach by designing and numerically
simulating a cubic diamond structure from four particle species that assembles
without competition from other polymorphs, including the hexagonal structure.
