The problem is that the result is not simply a "valid" solution. I'm looking for a "best" solution. I know enough Prolog to code the search space for a valid solution, even using AI::Prolog (thanks Ovid!). What I need is for a way to move from a valid solution to a "better" solution, based on soft things like attendee preference, natural ordering of materials, and room size, after first matching hard things like a single-purpose room and a single-location instructor.
Interestingly, I was just using AI::Prolog to try and solve this. Unfortunately, my attempted solution required math and I haven't built that in yet. Then I tried to build math logically for just the small problem set, but I hadn't yet defined the "is" primitive. Sigh. Unfortunately, the solutions at hand started getting difficult even when I used SWI-Prolog due to how exhaustive the search space is.