Code looks good. If I understand correctly, the classes AbstractState and
CartesianSet behave differently (it is not just a renaming), in which case a
small experiment might make sense.
Thomas suggested we use CartesianSet instead of AbstractState for temporary
Cartesian sets such as the Cartesian set of goal states. I think this makes a
lot of sense and should make the code easier to understand.