Multiple (all) accessing runs

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, I have implemented a simple LTL model checker in c++ using SPOT. For a failing property, I can get a counterexample using the method accepting_run() on the emptiness_check_result. Now I am interested in all accepting runs, or, more precisely in all the states that are part of the prefix of some accepting run. What would be the best SPOTish way to obtain these? I would be fine with the runs and find the relevant states myself. Thanks for any suggestion. Regards, Ulrich -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAEBAgAGBQJVjAUTAAoJEM0dHSf/6N1YGtEH/R5szUBeK0WfWKCULAiv3Q2P MKD+AaEsZM0g6ujWLNRzVUnh5DA5WmlzmbFTPPDKEKNtaPO6sKv7ydLfsfh2GWJX I+tsM7Uzf94hTIuwY9uTAdtSpQIWGflhr3Q6ncV77KEYgaHGFPB0Zg2BaUYtgVZ+ zgglBCowJHoEbj13tX9LlPOLGyzD95TZ8LCG1CBtLwtoy1h/x4jFjB4vEIlXGeyw q2uEUjF9oz9thA4x/NW8X39s9E/UIi62wZb2nuLK+a8QO5FX3cJQWe4PBZ7fl42m L8kNEeLEvZ5sH7eznkk/XiHtf/fdB+85DDq/dB8lF335lgt2ES66rvxXk6TRFRM= =d4aZ -----END PGP SIGNATURE-----

Hi Ulrich On Thu, Jun 25, 2015 at 3:41 PM, Ulrich Kühne <ulrichk@informatik.uni-bremen.de> wrote:
I have implemented a simple LTL model checker in c++ using SPOT. For a failing property, I can get a counterexample using the method accepting_run() on the emptiness_check_result. Now I am interested in all accepting runs,
A few of the emptiness checks, like CVW90 or SE05 (prefer this one) can be called multiple times: once the emptinesscheck::check() method has returned a first counterexample, you can call it again and it will continue the DFS from where it stopped. This won't enumerate *all* accepting runs (since you may have an infinite number of them), but it should at least give a set of runs that (together) covers all accepting cycles. These two emptiness checks are restricted to Büchi acceptance, so that could be a problem if you have generalized Büchi as input.
or, more precisely in all the states that are part of the prefix of some accepting run.
I don't think you can easily do that with the emptiness_check interface. If your automaton is not too big, you could use scc_map (or scc_info in version 1.99.1) to construct a map of all the SCCs. Then you can construct the set of SCCs that are accepting or that can lead to an accepting SCC, and from this gather all the states. This is essentially what the function scc_filter_states() has to do in order to remove all states that cannot contribute to an accepting run (but usually scc_filter_states() is run only to simplify the property automaton, not on the whole product). -- Alexandre Duret-Lutz
participants (2)
-
Alexandre Duret-Lutz
-
Ulrich Kühne