I've also switched to ASP, largely because of choice rules plus filtering. You can write things like:
{ active(A) } :- thing(A).
Which says that for all things A, active(A) is a free choice of true or false, constrained by the requirement to be consistent with all other clauses in the program. That lets you do abductive reasoning, e.g. find an explanation, plan, or cause from a possibility space, consistent with the other asserted facts.
You an also write pure constraints, like:
:- active(duck), active(cat).
Which says to reject all answers in which both
duck and
cat are simultaneously asserted
active. This allows an overgenerate-and-filter style of programming, where you use choice rules to generate everything in a possibility space, and then constraints to filter out the ones you don't want. Prolog doesn't really naturally support that style of programming, though certain kinds can be hacked in with Prolog+CHR, or with one of the CSP extensions.
The main downside in my experience is that ASP doesn't do well on large programs, even large-but-simple ones that Prolog handles well, due to the fact that ASP is grounding everything to the moral equivalent of giant SAT problems. Particularly if you use numerical reasoning over non-tiny ranges. Say, you have some sprites on a grid, and at each time, each sprite has exactly one X/Y position:
canvas_x(0..799).
canvas_y(0..599).
timestep(0..99).
sprite(mario;luigi;babomb).
1 { pos(S,X,Y,T) : sprite(S) : canvas_x(X) : canvas_y(Y) } 1 :- timestep(T).
A program like that totally blows up due to the 800 x 600 x 100 x 3 ground instantiations of
pos, particularly if
pos is then referenced in a lot of other rules. Since Prolog doesn't ahead-of-time compute all the ground instantiations, it can avoid that in certain classes of programs (in this case, you'd memoize the one
pos per sprite/timestep once you find it, then use the cut operator to fail-fast on any other queries). There are papers on avoiding this via a new generation of "first-order ASP" not based on propositional grounding, but afaik no implementations exist.