add enviroment variables for FORQ algorithm
* AUTHORS: added Jonah Romero
* bin/man/spot-x.x: Added the enviroment variables,
SPOT_EXCLUSIVE_WORD and SPOT_CONTAINMENT_CHECK
* doc/spot.bib: Added paper citation for FORQ inclusion algorithm
* spot/twa/twa.cc: Modified exclusive_word to also use FORQ
* spot/twaalgos/contains.cc: Modified contains to also use FORQ
This commit is contained in:
parent
d1c5b2efdf
commit
ad22eb3e65
5 changed files with 123 additions and 6 deletions
1
AUTHORS
1
AUTHORS
|
|
@ -18,6 +18,7 @@ Guillaume Sadegh
|
||||||
Heikki Tauriainen
|
Heikki Tauriainen
|
||||||
Henrich Lauko
|
Henrich Lauko
|
||||||
Jérôme Dubois
|
Jérôme Dubois
|
||||||
|
Jonah Romero
|
||||||
Laurent Xu
|
Laurent Xu
|
||||||
Maximilien Colange
|
Maximilien Colange
|
||||||
Philipp Schlehuber
|
Philipp Schlehuber
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,14 @@ time. Note that it restarts all the encoding each time.
|
||||||
If this variable is set to any value, statistics about BDD garbage
|
If this variable is set to any value, statistics about BDD garbage
|
||||||
collection and resizing will be output on standard error.
|
collection and resizing will be output on standard error.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fSPOT_CONTAINMENT_CHECK\fR
|
||||||
|
Specifies which inclusion algorithm spot should use. This can currently
|
||||||
|
take on 1 of 2 values: 0 for the legacy implementation, and 1 for the
|
||||||
|
forq implementation [6] (See bibliography below). Forq uses buchi
|
||||||
|
automata in order to determine inclusion, and will default to the legacy
|
||||||
|
version if these constraints are not satisfied.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fBSPOT_DEFAULT_FORMAT\fR
|
\fBSPOT_DEFAULT_FORMAT\fR
|
||||||
Set to a value of \fBdot\fR or \fBhoa\fR to override the default
|
Set to a value of \fBdot\fR or \fBhoa\fR to override the default
|
||||||
|
|
@ -95,6 +103,14 @@ The contents of this variable is added to any dot output, immediately
|
||||||
before the first state is output. This makes it easy to override
|
before the first state is output. This makes it easy to override
|
||||||
global attributes of the graph.
|
global attributes of the graph.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fSPOT_EXCLUSIVE_WORD\fR
|
||||||
|
Specifies which algorithm spot should use for exclusive_word. This can
|
||||||
|
currently take on 1 of 2 values: 0 for the legacy implementation, and 1
|
||||||
|
for the forq implementation [6] (See bibliography below). Forq assumes buchi
|
||||||
|
automata in order to find an exclusive word, and will default to the legacy
|
||||||
|
version if these constraints are not satisfied with the automata passed.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fBSPOT_HOA_TOLERANT\fR
|
\fBSPOT_HOA_TOLERANT\fR
|
||||||
If this variable is set, a few sanity checks performed by the HOA
|
If this variable is set, a few sanity checks performed by the HOA
|
||||||
|
|
@ -317,6 +333,26 @@ Describes (among other things) the constructions used for translating
|
||||||
formulas of the form GF(guarantee) or FG(safety), that can be
|
formulas of the form GF(guarantee) or FG(safety), that can be
|
||||||
disabled with \fB-x gf-guarantee=0\fR.
|
disabled with \fB-x gf-guarantee=0\fR.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
6.
|
||||||
|
Doveri, Kyveli and Ganty, Pierre and Mazzocchi, Nicolas:
|
||||||
|
FORQ-Based Language Inclusion Formal Testing.
|
||||||
|
Proceedings of CAV'22. LNCS 13372.
|
||||||
|
|
||||||
|
We propose a novel algorithm to decide the language inclusion between
|
||||||
|
(nondeterministic) Büchi automata, a PSpace-complete problem. Our approach,
|
||||||
|
like others before, leverage a notion of quasiorder to prune the search for a
|
||||||
|
counterexample by discarding candidates which are subsumed by others for the
|
||||||
|
quasiorder.Discarded candidates are guaranteed to not compromise the
|
||||||
|
completeness of the algorithm. The novelty of our work lies in the quasiorder k
|
||||||
|
used to discard candidates. We introduce FORQs (family of right quasiorders)
|
||||||
|
that we obtain by adapting the notion of family of right congruences put forward
|
||||||
|
by Maler and Staiger in 1993. We define a FORQ-based inclusion algorithm which
|
||||||
|
we prove correct and instantiate it for a specific FORQ, called the structural
|
||||||
|
FORQ, induced by the B\"uchi automaton to the right of the inclusion sign. The
|
||||||
|
resulting implementation, called Forklift, scales up better than the
|
||||||
|
state-of-the-art on a variety of benchmarks including benchmarks from program
|
||||||
|
verification and theorem proving for word combinatorics.
|
||||||
|
|
||||||
[SEE ALSO]
|
[SEE ALSO]
|
||||||
.BR ltl2tgba (1)
|
.BR ltl2tgba (1)
|
||||||
|
|
|
||||||
13
doc/spot.bib
13
doc/spot.bib
|
|
@ -336,6 +336,19 @@
|
||||||
month = aug
|
month = aug
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@inproceedings{doveriFORQBasedLanguageInclusion2022,
|
||||||
|
title = {{{FORQ-Based Language Inclusion Formal Testing}}},
|
||||||
|
booktitle = {{{CAV}}'22: {{Proc}}. 32nd {{Int}}. {{Conf}}. on {{Computer Aided Verification}}},
|
||||||
|
author = {Doveri, Kyveli and Ganty, Pierre and Mazzocchi, Nicolas},
|
||||||
|
year = {2022},
|
||||||
|
volume = {13372},
|
||||||
|
pages = {109--129},
|
||||||
|
publisher = {{Springer International Publishing}},
|
||||||
|
doi = {10.1007/978-3-031-13188-2_6},
|
||||||
|
urldate = {2022-09-15},
|
||||||
|
isbn = {978-3-031-13187-5 978-3-031-13188-2}
|
||||||
|
}
|
||||||
|
|
||||||
@InProceedings{ duret.11.vecos,
|
@InProceedings{ duret.11.vecos,
|
||||||
author = {Alexandre Duret-Lutz},
|
author = {Alexandre Duret-Lutz},
|
||||||
title = {{LTL} Translation Improvements in {Spot}},
|
title = {{LTL} Translation Improvements in {Spot}},
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
#include <spot/twaalgos/remfin.hh>
|
#include <spot/twaalgos/remfin.hh>
|
||||||
#include <spot/twaalgos/alternation.hh>
|
#include <spot/twaalgos/alternation.hh>
|
||||||
#include <spot/twa/twaproduct.hh>
|
#include <spot/twa/twaproduct.hh>
|
||||||
|
#include <spot/twaalgos/forq_contains.hh>
|
||||||
#include <spot/twaalgos/complement.hh>
|
#include <spot/twaalgos/complement.hh>
|
||||||
#include <spot/twaalgos/isdet.hh>
|
#include <spot/twaalgos/isdet.hh>
|
||||||
#include <spot/twaalgos/product.hh>
|
#include <spot/twaalgos/product.hh>
|
||||||
|
|
@ -228,21 +229,58 @@ namespace spot
|
||||||
return b->intersecting_run(complement(ensure_graph(a)));
|
return b->intersecting_run(complement(ensure_graph(a)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_buchi_automata(const_twa_graph_ptr const& aut)
|
||||||
|
{
|
||||||
|
return spot::acc_cond::acc_code::buchi() == aut->get_acceptance();
|
||||||
|
}
|
||||||
|
|
||||||
twa_word_ptr
|
twa_word_ptr
|
||||||
twa::exclusive_word(const_twa_ptr other) const
|
twa::exclusive_word(const_twa_ptr other) const
|
||||||
{
|
{
|
||||||
const_twa_ptr a = shared_from_this();
|
const_twa_ptr a = shared_from_this();
|
||||||
const_twa_ptr b = other;
|
const_twa_ptr b = other;
|
||||||
|
|
||||||
|
enum class containment_type : unsigned { LEGACY = 0, FORQ };
|
||||||
|
static containment_type containment = [&]()
|
||||||
|
{
|
||||||
|
char* s = getenv("SPOT_EXCLUSIVE_WORD");
|
||||||
|
// We expect a single digit that represents a valid enumeration value
|
||||||
|
if (!s)
|
||||||
|
return containment_type::LEGACY;
|
||||||
|
else if (*s == '\0' || *(s + 1) != '\0' || *s < '0' || *s > '1')
|
||||||
|
throw std::runtime_error("Invalid value for enviroment variable: "
|
||||||
|
"SPOT_EXCLUSIVE_WORD");
|
||||||
|
else
|
||||||
|
return static_cast<containment_type>(*s - '0');
|
||||||
|
}();
|
||||||
|
|
||||||
// We have to find a word in A\B or in B\A. When possible, let's
|
// We have to find a word in A\B or in B\A. When possible, let's
|
||||||
// make sure the first automaton we complement is deterministic.
|
// make sure the first automaton we complement is deterministic.
|
||||||
if (auto aa = std::dynamic_pointer_cast<const twa_graph>(a))
|
auto a_twa_as_graph = std::dynamic_pointer_cast<const twa_graph>(a);
|
||||||
if (is_deterministic(aa))
|
auto b_twa_as_graph = std::dynamic_pointer_cast<const twa_graph>(a);
|
||||||
|
if (a_twa_as_graph)
|
||||||
|
if (is_deterministic(a_twa_as_graph))
|
||||||
std::swap(a, b);
|
std::swap(a, b);
|
||||||
|
|
||||||
|
bool uses_buchi = is_buchi_automata(a_twa_as_graph)
|
||||||
|
&& is_buchi_automata(b_twa_as_graph);
|
||||||
|
if (containment == containment_type::FORQ
|
||||||
|
&& uses_buchi
|
||||||
|
&& a_twa_as_graph
|
||||||
|
&& b_twa_as_graph)
|
||||||
|
{
|
||||||
|
if (auto word = difference_word_forq(a_twa_as_graph, b_twa_as_graph))
|
||||||
|
return word;
|
||||||
|
return difference_word_forq(b_twa_as_graph, a_twa_as_graph);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (auto word = a->intersecting_word(complement(ensure_graph(b))))
|
if (auto word = a->intersecting_word(complement(ensure_graph(b))))
|
||||||
return word;
|
return word;
|
||||||
return b->intersecting_word(complement(ensure_graph(a)));
|
return b->intersecting_word(complement(ensure_graph(a)));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
twa::set_named_prop(std::string s, std::nullptr_t)
|
twa::set_named_prop(std::string s, std::nullptr_t)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <spot/twaalgos/contains.hh>
|
#include <spot/twaalgos/contains.hh>
|
||||||
|
#include <spot/twaalgos/forq_contains.hh>
|
||||||
#include <spot/twaalgos/complement.hh>
|
#include <spot/twaalgos/complement.hh>
|
||||||
#include <spot/twaalgos/ltl2tgba_fm.hh>
|
#include <spot/twaalgos/ltl2tgba_fm.hh>
|
||||||
#include <spot/twaalgos/isdet.hh>
|
#include <spot/twaalgos/isdet.hh>
|
||||||
|
|
@ -34,10 +35,38 @@ namespace spot
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_buchi_automata(const_twa_graph_ptr const& aut)
|
||||||
|
{
|
||||||
|
return spot::acc_cond::acc_code::buchi() == aut->get_acceptance();
|
||||||
|
}
|
||||||
|
|
||||||
bool contains(const_twa_graph_ptr left, const_twa_ptr right)
|
bool contains(const_twa_graph_ptr left, const_twa_ptr right)
|
||||||
|
{
|
||||||
|
enum class containment_type : unsigned { LEGACY = 0, FORQ };
|
||||||
|
static containment_type containment = [&]()
|
||||||
|
{
|
||||||
|
char* s = getenv("SPOT_CONTAINMENT_CHECK");
|
||||||
|
// We expect a single digit that represents a valid enumeration value
|
||||||
|
if (!s)
|
||||||
|
return containment_type::LEGACY;
|
||||||
|
else if (*s == '\0' || *(s + 1) != '\0' || *s < '0' || *s > '1')
|
||||||
|
throw std::runtime_error("Invalid value for enviroment variable: "
|
||||||
|
"SPOT_CONTAINMENT_CHECK");
|
||||||
|
else
|
||||||
|
return static_cast<containment_type>(*s - '0');
|
||||||
|
}();
|
||||||
|
|
||||||
|
auto as_graph = std::dynamic_pointer_cast<const twa_graph>(right);
|
||||||
|
bool uses_buchi = is_buchi_automata(left) && is_buchi_automata(as_graph);
|
||||||
|
if (containment == containment_type::FORQ && uses_buchi && as_graph)
|
||||||
|
{
|
||||||
|
return contains_forq(left, as_graph);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
return !complement(left)->intersects(right);
|
return !complement(left)->intersects(right);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool contains(const_twa_graph_ptr left, formula right)
|
bool contains(const_twa_graph_ptr left, formula right)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue