This is great, thanks for posting! I'll definitely take your advice to heart. I've been noticing that finding different data representations of the problem at hand is a big part of finding the "core relations" that describe the problem. My first attempt at the voicing/4 predicate was attempted with a data structure used in a procedural version of the algorithm, and I just couldn't get it to work in Prolog. The second iteration is what you've seen, and I'm working on a third iteration with a simpler data representation that is simplifying the problem even further.