(I could remove more punctuation by making the (key, value) pairs implicit.) Move compile_program//2 to just under do//0.
Remove the pass0//2 DCG rule and unfold it in compile_program//2 rule. Move init//0 to be with the rest of the state DCG code.
It turns out that the binary_number relation is used in such a way that it needs to be able to backtrack to preprend leading zeros to the list of bits it constructs to automatically build bitfields of a given width (with the collect//2 DCG.)