Let's look at the requirements for this problem, uncovering some of the unspoken ones:
1. very general problem
2. fast, or at least not too slow
3. memory-efficient
4. correct
Leaving aside performance issues 2 and 3, is it possible that 1 and 4 alone are enough to deliver plenty of heartburn?
I can think of at least one class of problems: the enumeration and application of choices lead to cyclical states. Hence resulting in a list of solutions pockmarked with bottoms.
I mean your backtrack function is a correct and succinct description of the very notion of backtracking. The devil is in the details of state design, including the enumeration and application issues I've described.
By narrowing the scope of the problem so that you first obtain a library that correctly solves it, you could then focus on performance issues.