translate, postproc: improve parity output

* spot/twaalgos/translate.cc: When producing Parity output, split LTL
as we do in the Generic case.
* spot/twaalgos/postproc.hh, spot/twaalgos/postproc.cc: Use
acd_transform() and add an "acd" option to disable this.
* bin/spot-x.cc, NEWS: Document this.
* tests/core/genltl.test, tests/core/minusx.test,
tests/core/parity2.test: Adjust test cases for improved outputs.
This commit is contained in:
Alexandre Duret-Lutz 2022-10-05 11:08:19 +02:00
parent e867242cf6
commit 344e01d4e2
8 changed files with 189 additions and 241 deletions

11
NEWS
View file

@ -164,11 +164,20 @@ New in spot 2.10.6.dev (not yet released)
further simplification. This was introduced to help with automata further simplification. This was introduced to help with automata
produced from formulas output by "genltl --eil-gsi" (see above). produced from formulas output by "genltl --eil-gsi" (see above).
- spot::postproc has new configuration variable branch-post that - spot::postprocessor has new configuration variable branch-post that
can be used to control the use of branching-postponement (diabled can be used to control the use of branching-postponement (diabled
by default) or delayed-branching (see above, enabled by default). by default) or delayed-branching (see above, enabled by default).
See the spot-x(7) man page for details. See the spot-x(7) man page for details.
- spot::postprocessor is now using acd_transform() by default when
building parity automata. Setting option "acd=0" will revert
to using "to_parity()" instead.
- When asked to build parity automata, spot::translator is now more
aggressively using LTL decomposition, as done in the Generic
acceptance case before paritizing the result. This results in
much smaller automata in many cases.
- spot::parallel_policy is an object that can be passed to some - spot::parallel_policy is an object that can be passed to some
algorithm to specify how many threads can be used if Spot has been algorithm to specify how many threads can be used if Spot has been
compiled with --enable-pthread. Currently, only compiled with --enable-pthread. Currently, only

View file

@ -80,6 +80,9 @@ only if it is smaller than the original skeleton. This option is only \
used when comp-susp=1 and default to 1 or 2 depending on whether --small \ used when comp-susp=1 and default to 1 or 2 depending on whether --small \
or --deterministic is specified.") }, or --deterministic is specified.") },
{ nullptr, 0, nullptr, 0, "Postprocessing options:", 0 }, { nullptr, 0, nullptr, 0, "Postprocessing options:", 0 },
{ DOC("acd", "Set to 1 (the default) to use paritize automata using \
the alternatinc cycle decomposition. Set to 0 to use paritization based \
on latest appearance record variants.") },
{ DOC("scc-filter", "Set to 1 (the default) to enable \ { DOC("scc-filter", "Set to 1 (the default) to enable \
SCC-pruning and acceptance simplification at the beginning of \ SCC-pruning and acceptance simplification at the beginning of \
post-processing. Transitions that are outside of accepting SCC are \ post-processing. Transitions that are outside of accepting SCC are \

View file

@ -1,5 +1,5 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2012-2021 Laboratoire de Recherche et Développement // Copyright (C) 2012-2022 Laboratoire de Recherche et Développement
// de l'Epita (LRDE). // de l'Epita (LRDE).
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
@ -40,6 +40,7 @@
#include <spot/twaalgos/cobuchi.hh> #include <spot/twaalgos/cobuchi.hh>
#include <spot/twaalgos/cleanacc.hh> #include <spot/twaalgos/cleanacc.hh>
#include <spot/twaalgos/toparity.hh> #include <spot/twaalgos/toparity.hh>
#include <spot/twaalgos/zlktree.hh>
namespace spot namespace spot
{ {
@ -92,6 +93,7 @@ namespace spot
merge_states_min_ = opt->get("merge-states-min", 128); merge_states_min_ = opt->get("merge-states-min", 128);
wdba_det_max_ = opt->get("wdba-det-max", 4096); wdba_det_max_ = opt->get("wdba-det-max", 4096);
simul_trans_pruning_ = opt->get("simul-trans-pruning", 512); simul_trans_pruning_ = opt->get("simul-trans-pruning", 512);
acd_ = opt->get("acd", 1);
if (sat_acc_ && sat_minimize_ == 0) if (sat_acc_ && sat_minimize_ == 0)
sat_minimize_ = 1; // Dicho. sat_minimize_ = 1; // Dicho.
@ -250,7 +252,8 @@ namespace spot
tmp = ensure_ba(tmp); tmp = ensure_ba(tmp);
if (want_parity) if (want_parity)
{ {
reduce_parity_here(tmp, COLORED_); if (!acd_was_used_)
reduce_parity_here(tmp, COLORED_);
parity_kind kind = parity_kind_any; parity_kind kind = parity_kind_any;
parity_style style = parity_style_any; parity_style style = parity_style_any;
if ((type_ & ParityMin) == ParityMin) if ((type_ & ParityMin) == ParityMin)
@ -295,6 +298,8 @@ namespace spot
bool via_gba = bool via_gba =
(type_ == Buchi) || (type_ == GeneralizedBuchi) || (type_ == Monitor); (type_ == Buchi) || (type_ == GeneralizedBuchi) || (type_ == Monitor);
bool want_parity = type_ & Parity; bool want_parity = type_ & Parity;
acd_was_used_ = false;
if (COLORED_ && !want_parity) if (COLORED_ && !want_parity)
throw std::runtime_error("postprocessor: the Colored setting only works " throw std::runtime_error("postprocessor: the Colored setting only works "
"for parity acceptance"); "for parity acceptance");
@ -340,18 +345,26 @@ namespace spot
!(type_ == Generic && PREF_ == Any && level_ == Low)) !(type_ == Generic && PREF_ == Any && level_ == Low))
a = remove_alternation(a); a = remove_alternation(a);
// If we do want a parity automaton, we can use to_parity().
// However (1) degeneralization is faster if the input is
// GBA, and (2) if we want a deterministic parity automaton and the
// input is not deterministic, that is useless here. We need
// to determinize it first, and our deterministization
// function only deal with TGBA as input.
if ((via_gba || (want_parity && !a->acc().is_parity())) if ((via_gba || (want_parity && !a->acc().is_parity()))
&& !a->acc().is_generalized_buchi()) && !a->acc().is_generalized_buchi())
{ {
// If we do want a parity automaton, we can use to_parity().
// However (1) degeneralization is better if the input is
// GBA, and (2) if we want a deterministic parity automaton and the
// input is not deterministic, that is useless here. We need
// to determinize it first, and our deterministization
// function only deal with TGBA as input.
if (want_parity && (PREF_ != Deterministic || is_deterministic(a))) if (want_parity && (PREF_ != Deterministic || is_deterministic(a)))
{ {
a = to_parity(a); if (acd_)
{
a = acd_transform(a, COLORED_);
acd_was_used_ = true;
}
else
{
a = to_parity(a);
}
} }
else else
{ {

View file

@ -270,6 +270,8 @@ namespace spot
int simul_max_ = 4096; int simul_max_ = 4096;
int merge_states_min_ = 128; int merge_states_min_ = 128;
int wdba_det_max_ = 4096; int wdba_det_max_ = 4096;
bool acd_ = false;
bool acd_was_used_;
}; };
/// @} /// @}
} }

View file

@ -137,6 +137,9 @@ namespace spot
twa_graph_ptr aut; twa_graph_ptr aut;
twa_graph_ptr aut2 = nullptr; twa_graph_ptr aut2 = nullptr;
bool split_hard =
type_ == Generic || (type_ & Parity) || type_ == GeneralizedBuchi;
if (ltl_split_ && !r.is_syntactic_obligation()) if (ltl_split_ && !r.is_syntactic_obligation())
{ {
formula r2 = r; formula r2 = r;
@ -146,11 +149,11 @@ namespace spot
r2 = r2[0]; r2 = r2[0];
++leading_x; ++leading_x;
} }
if (type_ == Generic || type_ == GeneralizedBuchi) if (split_hard)
{ {
// F(q|u|f) = q|F(u)|F(f) only for generic acceptance // F(q|u|f) = q|F(u)|F(f) disabled for GeneralizedBuchi
// G(q&e&f) = q&G(e)&G(f) // G(q&e&f) = q&G(e)&G(f)
bool want_u = r2.is({op::F, op::Or}) && (type_ == Generic); bool want_u = r2.is({op::F, op::Or}) && (type_ != GeneralizedBuchi);
if (want_u || r2.is({op::G, op::And})) if (want_u || r2.is({op::G, op::And}))
{ {
std::vector<formula> susp; std::vector<formula> susp;
@ -213,20 +216,19 @@ namespace spot
oblg.erase(i, oblg.end()); oblg.erase(i, oblg.end());
} }
// The only cases where we accept susp and rest to be both
// non-empty is when doing Generic/Parity/TGBA
if (!susp.empty()) if (!susp.empty())
{ {
// The only cases where we accept susp and rest to be both if (!rest.empty() && !split_hard)
// non-empty is when doing Generic acceptance or TGBA.
if (!rest.empty()
&& !(type_ == Generic || type_ == GeneralizedBuchi))
{ {
rest.insert(rest.end(), susp.begin(), susp.end()); rest.insert(rest.end(), susp.begin(), susp.end());
susp.clear(); susp.clear();
} }
// For Parity, we want to translate all suspendable // For Parity, we want to translate all suspendable
// formulas at once. // formulas at once.
if (rest.empty() && type_ & Parity) //if (rest.empty() && type_ & Parity)
susp = { formula::multop(r2.kind(), susp) }; // susp = { formula::multop(r2.kind(), susp) };
} }
// For TGBA and BA, we only split if there is something to // For TGBA and BA, we only split if there is something to
// suspend. // suspend.

View file

@ -190,29 +190,29 @@ cat >exp<<EOF
"ms-example=4,2",10,10 "ms-example=4,2",10,10
"ms-example=4,3",11,11 "ms-example=4,3",11,11
"ms-example=4,4",12,12 "ms-example=4,4",12,12
"ms-phi-r=0",1,2 "ms-phi-r=0",1,1
"ms-phi-r=1",1,12 "ms-phi-r=1",1,2
"ms-phi-r=2",1,28 "ms-phi-r=2",1,5
"ms-phi-s=0",1,3 "ms-phi-s=0",1,1
"ms-phi-s=1",1,7 "ms-phi-s=1",1,2
"ms-phi-s=2",1,484 "ms-phi-s=2",1,5
"ms-phi-h=0",1,1 "ms-phi-h=0",1,1
"ms-phi-h=1",2,3 "ms-phi-h=1",2,3
"ms-phi-h=2",4,7 "ms-phi-h=2",4,7
"ms-phi-h=3",8,15 "ms-phi-h=3",8,15
"ms-phi-h=4",16,31 "ms-phi-h=4",16,31
"gf-equiv=0",1,1 "gf-equiv=0",1,1
"gf-equiv=1",1,3 "gf-equiv=1",1,2
"gf-equiv=2",1,7 "gf-equiv=2",1,5
"gf-equiv=3",1,20 "gf-equiv=3",1,10
"gf-equiv=4",1,80 "gf-equiv=4",1,17
"gf-equiv=5",1,430 "gf-equiv=5",1,26
"gf-implies=0",1,1 "gf-implies=0",1,1
"gf-implies=1",1,4 "gf-implies=1",1,1
"gf-implies=2",1,11 "gf-implies=2",1,2
"gf-implies=3",1,33 "gf-implies=3",1,3
"gf-implies=4",1,131 "gf-implies=4",1,4
"gf-implies=5",1,653 "gf-implies=5",1,5
"gf-equiv-xn=1",2,2 "gf-equiv-xn=1",2,2
"gf-equiv-xn=2",4,4 "gf-equiv-xn=2",4,4
"gf-equiv-xn=3",8,8 "gf-equiv-xn=3",8,8

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2016, 2020, 2021 Laboratoire de Recherche et Développement de # Copyright (C) 2016, 2020-2022 Laboratoire de Recherche et
# l'Epita (LRDE). # Développement de l'Epita (LRDE).
# #
# This file is part of Spot, a model checking library. # This file is part of Spot, a model checking library.
# #
@ -41,9 +41,9 @@ test 4,1 = `ltl2tgba --stats=%s,%d "$f"`
test 6,0 = `ltl2tgba -x wdba-det-max=4 --stats=%s,%d "$f"` test 6,0 = `ltl2tgba -x wdba-det-max=4 --stats=%s,%d "$f"`
# Make sure simul-max has an effect # Make sure simul-max has an effect
f=`genltl --ms-phi-s=2` f=`genltl --ms-phi-h=8`
test 484 -eq `ltl2tgba -P -D --stats=%s "$f"` test 511 -eq `ltl2tgba -P -D --stats=%s "$f"`
test 484 -lt `ltl2tgba -P -D -x simul-max=512 --stats=%s "$f"` test 511 -lt `ltl2tgba -P -D -x simul-max=512 --stats=%s "$f"`
# Illustrate issue #455: the simulation-based reduction applied before # Illustrate issue #455: the simulation-based reduction applied before
# tba-det can cause the creation of a DBA that is harder to reduce. # tba-det can cause the creation of a DBA that is harder to reduce.

View file

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2018-2019, 2021 Laboratoire de Recherche et # Copyright (C) 2018-2019, 2021, 2022 Laboratoire de Recherche et
# Développement de l'Epita (LRDE). # Développement de l'Epita (LRDE).
# #
# This file is part of Spot, a model checking library. # This file is part of Spot, a model checking library.
@ -65,30 +65,24 @@ State: 1
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: Buchi acc-name: Rabin 1
Acceptance: 1 Inf(0) Acceptance: 2 Fin(0) & Inf(1)
properties: trans-labels explicit-labels trans-acc properties: trans-labels explicit-labels trans-acc deterministic
--BODY-- --BODY--
State: 0 State: 0
[0] 0 [0&!1&2] 0
[0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 [!0] 1
[0&1&2] 2
State: 1 State: 1
[t] 3 [t] 2
[1&2] 4
State: 2 State: 2
[!0] 1
[0&!1&2] 2 [0&!1&2] 2
[0&1&2] 2 {0} [0&!2] 2 {0}
State: 3 [0&1&2] 2 {1}
[0] 3
[0&1&2] 4
State: 4
[0&!1&2] 4
[0&1&2] 4 {0}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -124,30 +118,24 @@ State: 1
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: Rabin 1 acc-name: Rabin 1
Acceptance: 2 Fin(0) & Inf(1) Acceptance: 2 Fin(0) & Inf(1)
properties: trans-labels explicit-labels trans-acc properties: trans-labels explicit-labels trans-acc deterministic
--BODY-- --BODY--
State: 0 State: 0
[0] 0 [0&!1&2] 0
[0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 [!0] 1
[0&1&2] 2
State: 1 State: 1
[t] 3 [t] 2
[1&2] 4
State: 2 State: 2
[!0] 1
[0&!1&2] 2 [0&!1&2] 2
[0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0] 3
[0&1&2] 4
State: 4
[0&!1&2] 4
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -183,30 +171,24 @@ State: 1
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: Buchi acc-name: parity max even 2
Acceptance: 1 Inf(0) Acceptance: 2 Fin(1) & Inf(0)
properties: trans-labels explicit-labels trans-acc properties: trans-labels explicit-labels trans-acc deterministic
--BODY-- --BODY--
State: 0 State: 0
[0] 0 [0&!1&2] 0
[0&1&2] 0 {0}
[0&!2] 0 {1}
[!0] 1 [!0] 1
[0&1&2] 2
State: 1 State: 1
[t] 3 [t] 2
[1&2] 4
State: 2 State: 2
[!0] 1
[0&!1&2] 2 [0&!1&2] 2
[0&1&2] 2 {0} [0&1&2] 2 {0}
State: 3 [0&!2] 2 {1}
[0] 3
[0&1&2] 4
State: 4
[0&!1&2] 4
[0&1&2] 4 {0}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -242,30 +224,25 @@ State: 1
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: Streett 1 acc-name: parity min odd 3
Acceptance: 2 Fin(0) | Inf(1) Acceptance: 3 Fin(0) & (Inf(1) | Fin(2))
properties: trans-labels explicit-labels trans-acc colored properties: trans-labels explicit-labels trans-acc colored
properties: deterministic
--BODY-- --BODY--
State: 0 State: 0
[0] 0 {0} [0&!1&2] 0 {2}
[!0] 1 {0} [0&!2] 0 {0}
[0&1&2] 2 {0} [0&1&2] 0 {1}
[!0] 1 {2}
State: 1 State: 1
[t] 3 {0} [t] 2 {2}
[1&2] 4 {0}
State: 2 State: 2
[!0] 1 {0} [0&!1&2] 2 {2}
[0&!1&2] 2 {0} [0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0] 3 {0}
[0&1&2] 4 {0}
State: 4
[0&!1&2] 4 {0}
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -301,30 +278,25 @@ State: 1
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: parity min odd 3 acc-name: parity min odd 3
Acceptance: 3 Fin(0) & (Inf(1) | Fin(2)) Acceptance: 3 Fin(0) & (Inf(1) | Fin(2))
properties: trans-labels explicit-labels trans-acc colored properties: trans-labels explicit-labels trans-acc colored
properties: deterministic
--BODY-- --BODY--
State: 0 State: 0
[0] 0 {2} [0&!1&2] 0 {2}
[0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 {2} [!0] 1 {2}
[0&1&2] 2 {2}
State: 1 State: 1
[t] 3 {2} [t] 2 {2}
[1&2] 4 {2}
State: 2 State: 2
[!0] 1 {2}
[0&!1&2] 2 {2} [0&!1&2] 2 {2}
[0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0] 3 {2}
[0&1&2] 4 {2}
State: 4
[0&!1&2] 4 {2}
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -360,30 +332,25 @@ State: 1
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: parity max even 3 acc-name: parity max even 4
Acceptance: 3 Inf(2) | (Fin(1) & Inf(0)) Acceptance: 4 Fin(3) & (Inf(2) | (Fin(1) & Inf(0)))
properties: trans-labels explicit-labels trans-acc colored properties: trans-labels explicit-labels trans-acc colored
properties: deterministic
--BODY-- --BODY--
State: 0 State: 0
[0] 0 {1} [0&!1&2] 0 {1}
[0&1&2] 0 {2}
[0&!2] 0 {3}
[!0] 1 {1} [!0] 1 {1}
[0&1&2] 2 {1}
State: 1 State: 1
[t] 3 {1} [t] 2 {1}
[1&2] 4 {1}
State: 2 State: 2
[!0] 1 {1}
[0&!1&2] 2 {1} [0&!1&2] 2 {1}
[0&1&2] 2 {2} [0&1&2] 2 {2}
State: 3 [0&!2] 2 {3}
[0] 3 {1}
[0&1&2] 4 {1}
State: 4
[0&!1&2] 4 {1}
[0&1&2] 4 {2}
--END-- --END--
EOF EOF
@ -777,7 +744,7 @@ State: 0
HOA: v1 HOA: v1
name: "G(Fa & Fb)" name: "G(Fa & Fb)"
States: 2 States: 2
Start: 1 Start: 0
AP: 2 "a" "b" AP: 2 "a" "b"
acc-name: Buchi acc-name: Buchi
Acceptance: 1 Inf(0) Acceptance: 1 Inf(0)
@ -786,15 +753,15 @@ properties: deterministic stutter-invariant
--BODY-- --BODY--
State: 0 State: 0
[!1] 0 [!1] 0
[1] 1 {0} [0&1] 0 {0}
[!0&1] 1
State: 1 State: 1
[0&!1] 0 [0] 0 {0}
[!0] 1 [!0] 1
[0&1] 1 {0}
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: Rabin 1 acc-name: Rabin 1
@ -802,24 +769,16 @@ Acceptance: 2 Fin(0) & Inf(1)
properties: trans-labels explicit-labels trans-acc deterministic properties: trans-labels explicit-labels trans-acc deterministic
--BODY-- --BODY--
State: 0 State: 0
[0&!1 | 0&!2] 0 [0&!1&2] 0
[!0] 1
[0&1&2] 2
State: 1
[!1 | !2] 3
[1&2] 4
State: 2
[0&!2] 0 {0} [0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 [!0] 1
State: 1
[t] 2
State: 2
[0&!1&2] 2 [0&!1&2] 2
[0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0&!1 | 0&!2] 3
[0&1&2] 4
State: 4
[0&!2] 3 {0}
[0&!1&2] 4
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -838,7 +797,7 @@ State: 0
HOA: v1 HOA: v1
name: "G(Fa & Fb)" name: "G(Fa & Fb)"
States: 2 States: 2
Start: 1 Start: 0
AP: 2 "a" "b" AP: 2 "a" "b"
acc-name: Rabin 1 acc-name: Rabin 1
Acceptance: 2 Fin(0) & Inf(1) Acceptance: 2 Fin(0) & Inf(1)
@ -847,15 +806,15 @@ properties: deterministic stutter-invariant
--BODY-- --BODY--
State: 0 State: 0
[!1] 0 [!1] 0
[1] 1 {1} [0&1] 0 {1}
[!0&1] 1
State: 1 State: 1
[0&!1] 0 [0] 0 {1}
[!0] 1 [!0] 1
[0&1] 1 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: Rabin 1 acc-name: Rabin 1
@ -863,24 +822,16 @@ Acceptance: 2 Fin(0) & Inf(1)
properties: trans-labels explicit-labels trans-acc deterministic properties: trans-labels explicit-labels trans-acc deterministic
--BODY-- --BODY--
State: 0 State: 0
[0&!1 | 0&!2] 0 [0&!1&2] 0
[!0] 1
[0&1&2] 2
State: 1
[!1 | !2] 3
[1&2] 4
State: 2
[0&!2] 0 {0} [0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 [!0] 1
State: 1
[t] 2
State: 2
[0&!1&2] 2 [0&!1&2] 2
[0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0&!1 | 0&!2] 3
[0&1&2] 4
State: 4
[0&!2] 3 {0}
[0&!1&2] 4
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -899,7 +850,7 @@ State: 0
HOA: v1 HOA: v1
name: "G(Fa & Fb)" name: "G(Fa & Fb)"
States: 2 States: 2
Start: 1 Start: 0
AP: 2 "a" "b" AP: 2 "a" "b"
acc-name: Buchi acc-name: Buchi
Acceptance: 1 Inf(0) Acceptance: 1 Inf(0)
@ -908,15 +859,15 @@ properties: deterministic stutter-invariant
--BODY-- --BODY--
State: 0 State: 0
[!1] 0 [!1] 0
[1] 1 {0} [0&1] 0 {0}
[!0&1] 1
State: 1 State: 1
[0&!1] 0 [0] 0 {0}
[!0] 1 [!0] 1
[0&1] 1 {0}
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: parity max even 2 acc-name: parity max even 2
@ -924,24 +875,16 @@ Acceptance: 2 Fin(1) & Inf(0)
properties: trans-labels explicit-labels trans-acc deterministic properties: trans-labels explicit-labels trans-acc deterministic
--BODY-- --BODY--
State: 0 State: 0
[0&!1 | 0&!2] 0 [0&!1&2] 0
[!0] 1 [0&1&2] 0 {0}
[0&1&2] 2
State: 1
[!1 | !2] 3
[1&2] 4
State: 2
[0&!2] 0 {1} [0&!2] 0 {1}
[!0] 1 [!0] 1
State: 1
[t] 2
State: 2
[0&!1&2] 2 [0&!1&2] 2
[0&1&2] 2 {0} [0&1&2] 2 {0}
State: 3 [0&!2] 2 {1}
[0&!1 | 0&!2] 3
[0&1&2] 4
State: 4
[0&!2] 3 {1}
[0&!1&2] 4
[0&1&2] 4 {0}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -960,7 +903,7 @@ State: 0
HOA: v1 HOA: v1
name: "G(Fa & Fb)" name: "G(Fa & Fb)"
States: 2 States: 2
Start: 1 Start: 0
AP: 2 "a" "b" AP: 2 "a" "b"
acc-name: Streett 1 acc-name: Streett 1
Acceptance: 2 Fin(0) | Inf(1) Acceptance: 2 Fin(0) | Inf(1)
@ -969,15 +912,15 @@ properties: deterministic stutter-invariant
--BODY-- --BODY--
State: 0 State: 0
[!1] 0 {0} [!1] 0 {0}
[1] 1 {1} [0&1] 0 {1}
[!0&1] 1 {0}
State: 1 State: 1
[0&!1] 0 {0} [0] 0 {1}
[!0] 1 {0} [!0] 1 {0}
[0&1] 1 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: parity min odd 3 acc-name: parity min odd 3
@ -986,24 +929,16 @@ properties: trans-labels explicit-labels trans-acc colored
properties: deterministic properties: deterministic
--BODY-- --BODY--
State: 0 State: 0
[0&!1 | 0&!2] 0 {2} [0&!1&2] 0 {2}
[!0] 1 {2}
[0&1&2] 2 {2}
State: 1
[!1 | !2] 3 {2}
[1&2] 4 {2}
State: 2
[0&!2] 0 {0} [0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 {2} [!0] 1 {2}
State: 1
[t] 2 {2}
State: 2
[0&!1&2] 2 {2} [0&!1&2] 2 {2}
[0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0&!1 | 0&!2] 3 {2}
[0&1&2] 4 {2}
State: 4
[0&!2] 3 {0}
[0&!1&2] 4 {2}
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -1022,7 +957,7 @@ State: 0
HOA: v1 HOA: v1
name: "G(Fa & Fb)" name: "G(Fa & Fb)"
States: 2 States: 2
Start: 1 Start: 0
AP: 2 "a" "b" AP: 2 "a" "b"
acc-name: parity min odd 3 acc-name: parity min odd 3
Acceptance: 3 Fin(0) & (Inf(1) | Fin(2)) Acceptance: 3 Fin(0) & (Inf(1) | Fin(2))
@ -1031,15 +966,15 @@ properties: deterministic stutter-invariant
--BODY-- --BODY--
State: 0 State: 0
[!1] 0 {2} [!1] 0 {2}
[1] 1 {1} [0&1] 0 {1}
[!0&1] 1 {2}
State: 1 State: 1
[0&!1] 0 {2} [0] 0 {1}
[!0] 1 {2} [!0] 1 {2}
[0&1] 1 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: parity min odd 3 acc-name: parity min odd 3
@ -1048,24 +983,16 @@ properties: trans-labels explicit-labels trans-acc colored
properties: deterministic properties: deterministic
--BODY-- --BODY--
State: 0 State: 0
[0&!1 | 0&!2] 0 {2} [0&!1&2] 0 {2}
[!0] 1 {2}
[0&1&2] 2 {2}
State: 1
[!1 | !2] 3 {2}
[1&2] 4 {2}
State: 2
[0&!2] 0 {0} [0&!2] 0 {0}
[0&1&2] 0 {1}
[!0] 1 {2} [!0] 1 {2}
State: 1
[t] 2 {2}
State: 2
[0&!1&2] 2 {2} [0&!1&2] 2 {2}
[0&!2] 2 {0}
[0&1&2] 2 {1} [0&1&2] 2 {1}
State: 3
[0&!1 | 0&!2] 3 {2}
[0&1&2] 4 {2}
State: 4
[0&!2] 3 {0}
[0&!1&2] 4 {2}
[0&1&2] 4 {1}
--END-- --END--
HOA: v1 HOA: v1
name: "FGa" name: "FGa"
@ -1084,7 +1011,7 @@ State: 0
HOA: v1 HOA: v1
name: "G(Fa & Fb)" name: "G(Fa & Fb)"
States: 2 States: 2
Start: 1 Start: 0
AP: 2 "a" "b" AP: 2 "a" "b"
acc-name: parity max even 3 acc-name: parity max even 3
Acceptance: 3 Inf(2) | (Fin(1) & Inf(0)) Acceptance: 3 Inf(2) | (Fin(1) & Inf(0))
@ -1093,15 +1020,15 @@ properties: deterministic stutter-invariant
--BODY-- --BODY--
State: 0 State: 0
[!1] 0 {1} [!1] 0 {1}
[1] 1 {2} [0&1] 0 {2}
[!0&1] 1 {1}
State: 1 State: 1
[0&!1] 0 {1} [0] 0 {2}
[!0] 1 {1} [!0] 1 {1}
[0&1] 1 {2}
--END-- --END--
HOA: v1 HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)" name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 5 States: 3
Start: 0 Start: 0
AP: 3 "p0" "p1" "p2" AP: 3 "p0" "p1" "p2"
acc-name: parity max even 4 acc-name: parity max even 4
@ -1110,24 +1037,16 @@ properties: trans-labels explicit-labels trans-acc colored
properties: deterministic properties: deterministic
--BODY-- --BODY--
State: 0 State: 0
[0&!1 | 0&!2] 0 {1} [0&!1&2] 0 {1}
[!0] 1 {1} [0&1&2] 0 {2}
[0&1&2] 2 {1}
State: 1
[!1 | !2] 3 {1}
[1&2] 4 {1}
State: 2
[0&!2] 0 {3} [0&!2] 0 {3}
[!0] 1 {1} [!0] 1 {1}
State: 1
[t] 2 {1}
State: 2
[0&!1&2] 2 {1} [0&!1&2] 2 {1}
[0&1&2] 2 {2} [0&1&2] 2 {2}
State: 3 [0&!2] 2 {3}
[0&!1 | 0&!2] 3 {1}
[0&1&2] 4 {1}
State: 4
[0&!2] 3 {3}
[0&!1&2] 4 {1}
[0&1&2] 4 {2}
--END-- --END--
EOF EOF
diff expected3 res3 diff expected3 res3