product: Büchi|Büchi=Büchi, CoBüchi&CoBüchi=CoBüchi
Improve the construction of the above constructions, saving colors. * spot/twaalgos/product.cc: Here. * spot/twaalgos/product.hh, NEWS: Mention it. * tests/core/prodchain.test, tests/core/prodor.test, tests/python/_product_weak.ipynb: Adjust.
This commit is contained in:
parent
7cf580a9c5
commit
0f131f2eee
6 changed files with 6449 additions and 2140 deletions
|
|
@ -1,5 +1,5 @@
|
|||
// -*- coding: utf-8 -*-
|
||||
// Copyright (C) 2014-2020 Laboratoire de Recherche et Développement
|
||||
// Copyright (C) 2014-2020, 2022 Laboratoire de Recherche et Développement
|
||||
// de l'Epita (LRDE).
|
||||
//
|
||||
// This file is part of Spot, a model checking library.
|
||||
|
|
@ -122,8 +122,23 @@ namespace spot
|
|||
res->copy_ap_of(left);
|
||||
res->copy_ap_of(right);
|
||||
|
||||
auto& lacc = left->acc();
|
||||
auto& racc = right->acc();
|
||||
|
||||
bool leftweak = left->prop_weak().is_true();
|
||||
bool rightweak = right->prop_weak().is_true();
|
||||
|
||||
// The conjunction of two co-Büchi automata is a co-Büchi automaton.
|
||||
// The disjunction of two Büchi automata is a Büchi automaton.
|
||||
//
|
||||
// The code to handle this case is similar to the weak_weak case,
|
||||
// except we do not set the weak property on the result.
|
||||
if (!leftweak
|
||||
&& !rightweak
|
||||
&& ((aop == and_acc && lacc.is_co_buchi() && racc.is_co_buchi())
|
||||
|| (aop == or_acc && lacc.is_buchi() && racc.is_buchi())))
|
||||
goto and_cobuchi_or_buchi;
|
||||
|
||||
// We have optimization to the standard product in case one
|
||||
// of the arguments is weak.
|
||||
if (leftweak || rightweak)
|
||||
|
|
@ -132,14 +147,13 @@ namespace spot
|
|||
// t, f, Büchi or co-Büchi. We use co-Büchi only when
|
||||
// t and f cannot be used, and both acceptance conditions
|
||||
// are in {t,f,co-Büchi}.
|
||||
if (leftweak && rightweak)
|
||||
if ((leftweak && rightweak))
|
||||
{
|
||||
weak_weak:
|
||||
res->prop_weak(true);
|
||||
and_cobuchi_or_buchi:
|
||||
acc_cond::mark_t accmark = {0};
|
||||
acc_cond::mark_t rejmark = {};
|
||||
auto& lacc = left->acc();
|
||||
auto& racc = right->acc();
|
||||
if ((lacc.is_co_buchi() && (racc.is_co_buchi()
|
||||
|| racc.num_sets() == 0))
|
||||
|| (lacc.num_sets() == 0 && racc.is_co_buchi()))
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// -*- coding: utf-8 -*-
|
||||
// Copyright (C) 2014-2015, 2018-2020 Laboratoire de Recherche et
|
||||
// Copyright (C) 2014-2015, 2018-2020, 2022 Laboratoire de Recherche et
|
||||
// Développement de l'Epita (LRDE).
|
||||
//
|
||||
// This file is part of Spot, a model checking library.
|
||||
|
|
@ -37,10 +37,14 @@ namespace spot
|
|||
/// The resulting automaton will accept the intersection of both
|
||||
/// languages and have an acceptance condition that is the
|
||||
/// conjunction of the acceptance conditions of the two input
|
||||
/// automata. In case one of the left or right automaton is weak,
|
||||
/// the acceptance condition of the result is made simpler: it
|
||||
/// usually is the acceptance condition of the other argument,
|
||||
/// automata.
|
||||
///
|
||||
/// As an optionmization, in case one of the left or right automaton
|
||||
/// is weak, the acceptance condition of the result is made simpler:
|
||||
/// it usually is the acceptance condition of the other argument,
|
||||
/// therefore avoiding the need to introduce new accepting sets.
|
||||
/// Similarly, the product of two co-Büchi automata will be a
|
||||
/// co-Büchi automaton.
|
||||
///
|
||||
/// The algorithm also defines a named property called
|
||||
/// "product-states" with type spot::product_states. This stores
|
||||
|
|
@ -64,10 +68,14 @@ namespace spot
|
|||
/// languages recognized by each input automaton (with its initial
|
||||
/// state changed) and have an acceptance condition that is the
|
||||
/// conjunction of the acceptance conditions of the two input
|
||||
/// automata. In case one of the left or right automaton is weak,
|
||||
/// the acceptance condition of the result is made simpler: it
|
||||
/// usually is the acceptance condition of the other argument,
|
||||
/// automata.
|
||||
///
|
||||
/// As an optionmization, in case one of the left or right automaton
|
||||
/// is weak, the acceptance condition of the result is made simpler:
|
||||
/// it usually is the acceptance condition of the other argument,
|
||||
/// therefore avoiding the need to introduce new accepting sets.
|
||||
/// Similarly, the product of two co-Büchi automata will be a
|
||||
/// co-Büchi automaton.
|
||||
///
|
||||
/// The algorithm also defines a named property called
|
||||
/// "product-states" with type spot::product_states. This stores
|
||||
|
|
@ -89,10 +97,15 @@ namespace spot
|
|||
/// The resulting automaton will accept the union of both
|
||||
/// languages and have an acceptance condition that is the
|
||||
/// disjunction of the acceptance conditions of the two input
|
||||
/// automata. In case one of the left or right automaton is weak,
|
||||
/// the acceptance condition of the result is made simpler: it
|
||||
/// usually is the acceptance condition of the other argument,
|
||||
/// automata.
|
||||
///
|
||||
/// As an optionmization, in case one of the left or right automaton
|
||||
/// is weak, the acceptance condition of the result is made simpler:
|
||||
/// it usually is the acceptance condition of the other argument,
|
||||
/// therefore avoiding the need to introduce new accepting sets.
|
||||
/// Similarly, the product_pr of two Büchi automata will be a
|
||||
/// Büchi automaton.
|
||||
///
|
||||
///
|
||||
/// The algorithm also defines a named property called
|
||||
/// "product-states" with type spot::product_states. This stores
|
||||
|
|
@ -112,10 +125,14 @@ namespace spot
|
|||
/// recognized by each input automaton (with its initial state
|
||||
/// changed) and have an acceptance condition that is the
|
||||
/// disjunction of the acceptance conditions of the two input
|
||||
/// automata. In case one of the left or right automaton is weak,
|
||||
/// the acceptance condition of the result is made simpler: it
|
||||
/// usually is the acceptance condition of the other argument,
|
||||
/// automata.
|
||||
///
|
||||
/// As an optionmization, in case one of the left or right automaton
|
||||
/// is weak, the acceptance condition of the result is made simpler:
|
||||
/// it usually is the acceptance condition of the other argument,
|
||||
/// therefore avoiding the need to introduce new accepting sets.
|
||||
/// Similarly, the product_pr of two Büchi automata will be a
|
||||
/// Büchi automaton.
|
||||
///
|
||||
/// The algorithm also defines a named property called
|
||||
/// "product-states" with type spot::product_states. This stores
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue