This is another application of ASP to educational game content generation. At the same time, it's an example of a classic strategy in developing AI systems. Invent the language you wish to use to implement your system, implement your system in that language, and then write an interpreter for that language in one you already have. Lisp and Prolog are classic back-end languages for supporting this strategy, but it is equally possible in AnsProlog.
Here's one of the "discourse tropes" used in our program: "A warrior slays a monster only
if the monster has some treasures"; expressed in AnsProlog syntax:
discourse( forall(m, w),
premise( p_slays(w, m) ),
conclusion( p_owns(m, t) ),
temporal( p_owns(m, t), p_slays(w, m)) ).
(m/w/t get interpreted as variables referring to a monster/warrior/treasure)
It's just a dead fact -- data. It grounds instantly and doesn't do anything by itself. Giving this statement the proper semantics involves solving a 3QBF problem (previously thought to be out of the range of expressiveness of ASP), but we found a reduction that makes it possible at an acceptable cost in our applied setting.
During development, we massed a library of discourse tropes authored in this way before we figured out how to create an interpreter for them.