From 7d6bfe545f613bac01c2d236795c8462988247a9 Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Sun, 2 Jun 2019 09:00:08 +0200 Subject: [PATCH] remprop: reset no-terminal property Reported by Yong Li. * spot/twaalgos/remprop.cc: Here. * tests/python/removeap.py: New test case. * tests/Makefile.am: Add it. * NEWS: Document the issue. * THANKS: Add Yong Li. --- NEWS | 4 ++++ THANKS | 1 + spot/twaalgos/remprop.cc | 6 +++++- tests/Makefile.am | 1 + tests/python/removeap.py | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/python/removeap.py diff --git a/NEWS b/NEWS index 147e5e3f5..5ff93fec0 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,10 @@ New in spot 2.7.4.dev (not yet released) C++ code for translating certains formulas to be noticeably slower than the equivalent call to the ltl2tgba binary. + - The remove_ap algorithm was preserving the "terminal property" of + automata, but it is possible that a non-terminal input produces a + terminal output after some propositions are removed. + New in spot 2.7.4 (2019-04-27) Bugs fixed: diff --git a/THANKS b/THANKS index e5c564715..c2a5b2bd9 100644 --- a/THANKS +++ b/THANKS @@ -50,4 +50,5 @@ Victor Khomenko Vitus Lam Yann Thierry-Mieg Yannick Molinghen +Yong Li Yuri Victorovich diff --git a/spot/twaalgos/remprop.cc b/spot/twaalgos/remprop.cc index bdd5a842c..bf721835a 100644 --- a/spot/twaalgos/remprop.cc +++ b/spot/twaalgos/remprop.cc @@ -1,5 +1,5 @@ // -*- coding: utf-8 -*- -// Copyright (C) 2015-2018 Laboratoire de Recherche et Développement +// Copyright (C) 2015-2019 Laboratoire de Recherche et Développement // de l'Epita (LRDE). // // This file is part of Spot, a model checking library. @@ -162,6 +162,10 @@ namespace spot } } + if (res->prop_terminal().is_false()) + // Non-terminal automata could become terminal. + res->prop_terminal(trival::maybe()); + transform_accessible(aut, res, [&](unsigned, bdd& cond, acc_cond::mark_t&, unsigned) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 4b332e243..9befe34dc 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -398,6 +398,7 @@ TESTS_python = \ python/randgen.py \ python/relabel.py \ python/remfin.py \ + python/removeap.py \ python/satmin.py \ python/sbacc.py \ python/sccfilter.py \ diff --git a/tests/python/removeap.py b/tests/python/removeap.py new file mode 100644 index 000000000..7a9268c85 --- /dev/null +++ b/tests/python/removeap.py @@ -0,0 +1,33 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright (C) 2019 Laboratoire de Recherche et Développement +# de l'Epita +# +# This file is part of Spot, a model checking library. +# +# Spot is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Spot is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import spot + + +aut = spot.translate('a U (c & Gb)') +assert not spot.is_terminal_automaton(aut) +assert aut.prop_terminal().is_false() +rem = spot.remove_ap() +rem.add_ap("b") +aut = rem.strip(aut) +assert not aut.prop_terminal().is_false() +assert spot.is_terminal_automaton(aut) +assert aut.prop_terminal().is_true() +aut = rem.strip(aut) +assert aut.prop_terminal().is_true()