deprecate spot::acc_cond::format()
* NEWS: Mention it. * spot/twa/acc.hh (spot::acc_cond::format): Deprecate. (spot::acc_cond::mark_t::as_string): New function. * spot/taalgos/dot.cc: Use mark_t::as_string(). * spot/priv/satcommon.cc, spot/priv/satcommon.hh, spot/twaalgos/dtwasat.cc, spot/twaalgos/emptiness.cc, tests/core/acc.cc, tests/core/acc.test: Adjust to use << directly.
This commit is contained in:
parent
822fe77891
commit
bfe0ada634
9 changed files with 70 additions and 67 deletions
7
NEWS
7
NEWS
|
|
@ -140,7 +140,7 @@ New in spot 2.7.5.dev (not yet released)
|
||||||
properties. This can be altered with the SPOT_PR_CHECK
|
properties. This can be altered with the SPOT_PR_CHECK
|
||||||
environment variable.
|
environment variable.
|
||||||
|
|
||||||
Backward incompatibilities:
|
Deprecation notices:
|
||||||
|
|
||||||
- The virtual function twa::intersecting_run() no longuer takes a
|
- The virtual function twa::intersecting_run() no longuer takes a
|
||||||
second "from_other" Boolean argument. This is a backward
|
second "from_other" Boolean argument. This is a backward
|
||||||
|
|
@ -149,6 +149,11 @@ New in spot 2.7.5.dev (not yet released)
|
||||||
call this function with two argument, a non-virtual version of the
|
call this function with two argument, a non-virtual version of the
|
||||||
function has been introduced and marked as deprecated.
|
function has been introduced and marked as deprecated.
|
||||||
|
|
||||||
|
- The spot::acc_cond::format() methods have been deprecated. These
|
||||||
|
were used to display acceptance marks, but acceptance marks are
|
||||||
|
unrelated to acceptance conditions, so it's better to simply print
|
||||||
|
marks with operator<< without this extra step.
|
||||||
|
|
||||||
Bugs fixed:
|
Bugs fixed:
|
||||||
|
|
||||||
- The gf_guarantee_to_ba() is relying on an inplace algorithm that
|
- The gf_guarantee_to_ba() is relying on an inplace algorithm that
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2013-2018 Laboratoire de Recherche et Développement
|
// Copyright (C) 2013-2019 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.
|
||||||
|
|
@ -97,7 +97,7 @@ namespace spot
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
vars_helper::format_t(bdd_dict_ptr& debug_dict, unsigned src, bdd& cond,
|
vars_helper::format_t(bdd_dict_ptr& debug_dict, unsigned src, bdd& cond,
|
||||||
unsigned dst)
|
unsigned dst)
|
||||||
{
|
{
|
||||||
std::ostringstream buffer;
|
std::ostringstream buffer;
|
||||||
buffer << '<' << src << ',' << bdd_format_formula(debug_dict, cond)
|
buffer << '<' << src << ',' << bdd_format_formula(debug_dict, cond)
|
||||||
|
|
@ -107,31 +107,30 @@ namespace spot
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
vars_helper::format_ta(bdd_dict_ptr& debug_dict,
|
vars_helper::format_ta(bdd_dict_ptr& debug_dict,
|
||||||
const acc_cond* debug_cand_acc, unsigned src, bdd& cond, unsigned dst,
|
unsigned src, bdd& cond, unsigned dst,
|
||||||
const acc_cond::mark_t& acc)
|
const acc_cond::mark_t& acc)
|
||||||
{
|
{
|
||||||
std::ostringstream buffer;
|
std::ostringstream buffer;
|
||||||
buffer << '<' << src << ',' << bdd_format_formula(debug_dict, cond)
|
buffer << '<' << src << ',' << bdd_format_formula(debug_dict, cond)
|
||||||
<< ',' << debug_cand_acc->format(acc) << ',' << dst << '>';
|
<< ',' << acc << ',' << dst << '>';
|
||||||
return buffer.str();
|
return buffer.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
vars_helper::format_p(const acc_cond* debug_cand_acc,
|
vars_helper::format_p(unsigned src_cand, unsigned src_ref,
|
||||||
const acc_cond* debug_ref_acc, unsigned src_cand, unsigned src_ref,
|
unsigned dst_cand, unsigned dst_ref,
|
||||||
unsigned dst_cand, unsigned dst_ref, acc_cond::mark_t acc_cand,
|
acc_cond::mark_t acc_cand, acc_cond::mark_t acc_ref)
|
||||||
acc_cond::mark_t acc_ref)
|
|
||||||
{
|
{
|
||||||
std::ostringstream buffer;
|
std::ostringstream buffer;
|
||||||
buffer << '<' << src_cand << ',' << src_ref << ',' << dst_cand << ','
|
buffer << '<' << src_cand << ',' << src_ref << ',' << dst_cand << ','
|
||||||
<< dst_ref << ", " << debug_cand_acc->format(acc_cand) << ", "
|
<< dst_ref << ", " << acc_cand << ", "
|
||||||
<< debug_ref_acc->format(acc_ref) << '>';
|
<< acc_ref << '>';
|
||||||
return buffer.str();
|
return buffer.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
vars_helper::format_p(unsigned src_cand, unsigned src_ref, unsigned dst_cand,
|
vars_helper::format_p(unsigned src_cand, unsigned src_ref, unsigned dst_cand,
|
||||||
unsigned dst_ref)
|
unsigned dst_ref)
|
||||||
{
|
{
|
||||||
std::ostringstream buffer;
|
std::ostringstream buffer;
|
||||||
buffer << '<' << src_cand << ',' << src_ref;
|
buffer << '<' << src_cand << ',' << src_ref;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2013-2016, 2018 Laboratoire de Recherche et
|
// Copyright (C) 2013-2016, 2018, 2019 Laboratoire de Recherche et
|
||||||
// Développement de l'Epita.
|
// Développement de l'Epita.
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
|
|
@ -207,24 +207,24 @@ public:
|
||||||
/// \brief Use this function to get a string representation of a transition.
|
/// \brief Use this function to get a string representation of a transition.
|
||||||
std::string
|
std::string
|
||||||
format_t(bdd_dict_ptr& debug_dict, unsigned src, bdd& cond,
|
format_t(bdd_dict_ptr& debug_dict, unsigned src, bdd& cond,
|
||||||
unsigned dst);
|
unsigned dst);
|
||||||
|
|
||||||
/// \brief Use this function to get a string representation of a transition
|
/// \brief Use this function to get a string representation of a transition
|
||||||
/// acc.
|
/// acc.
|
||||||
std::string
|
std::string
|
||||||
format_ta(bdd_dict_ptr& debug_dict, const acc_cond* debug_cand_acc,
|
format_ta(bdd_dict_ptr& debug_dict, unsigned src, bdd& cond, unsigned dst,
|
||||||
unsigned src, bdd& cond, unsigned dst, const acc_cond::mark_t& acc);
|
const acc_cond::mark_t& acc);
|
||||||
|
|
||||||
/// \brief Use this function to get a string representation of a path var.
|
/// \brief Use this function to get a string representation of a path var.
|
||||||
std::string
|
std::string
|
||||||
format_p(const acc_cond* debug_cand_acc, const acc_cond* debug_ref_acc,
|
format_p(unsigned src_cand, unsigned src_ref,
|
||||||
unsigned src_cand, unsigned src_ref, unsigned dst_cand,
|
unsigned dst_cand, unsigned dst_ref,
|
||||||
unsigned dst_ref, acc_cond::mark_t acc_cand, acc_cond::mark_t acc_ref);
|
acc_cond::mark_t acc_cand, acc_cond::mark_t acc_ref);
|
||||||
|
|
||||||
/// \brief Use this function to get a string representation of a path var.
|
/// \brief Use this function to get a string representation of a path var.
|
||||||
std::string
|
std::string
|
||||||
format_p(unsigned src_cand, unsigned src_ref, unsigned dst_cand,
|
format_p(unsigned src_cand, unsigned src_ref,
|
||||||
unsigned dst_ref);
|
unsigned dst_cand, unsigned dst_ref);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Give a filename to save the log of the SAT minimization.
|
/// \brief Give a filename to save the log of the SAT minimization.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2010, 2012, 2014-2016, 2018 Laboratoire de Recherche
|
|
||||||
// et Developpement de l Epita (LRDE).
|
// Copyright (C) 2010, 2012, 2014-2016, 2018-2019 Laboratoire de
|
||||||
|
// Recherche et Developpement de l Epita (LRDE).
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
//
|
//
|
||||||
|
|
@ -239,8 +240,7 @@ namespace spot
|
||||||
if (!opt_hide_sets_)
|
if (!opt_hide_sets_)
|
||||||
{
|
{
|
||||||
label += "\n";
|
label += "\n";
|
||||||
label += t_automata_->acc().
|
label += si->acc().as_string();
|
||||||
format(si->acc());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os_ << " " << in << " -> " << out << " [label=\"";
|
os_ << " " << in << " -> " << out << " [label=\"";
|
||||||
|
|
|
||||||
|
|
@ -406,6 +406,13 @@ namespace spot
|
||||||
|
|
||||||
SPOT_API
|
SPOT_API
|
||||||
friend std::ostream& operator<<(std::ostream& os, mark_t m);
|
friend std::ostream& operator<<(std::ostream& os, mark_t m);
|
||||||
|
|
||||||
|
std::string as_string() const
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
os << *this;
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Operators for acceptance formulas.
|
/// \brief Operators for acceptance formulas.
|
||||||
|
|
@ -1842,20 +1849,22 @@ namespace spot
|
||||||
/// that the condition is satisfied.
|
/// that the condition is satisfied.
|
||||||
mark_t accepting_sets(mark_t inf) const;
|
mark_t accepting_sets(mark_t inf) const;
|
||||||
|
|
||||||
// FIXME: deprecate?
|
// Deprecated since Spot 2.8
|
||||||
|
SPOT_DEPRECATED("Use operator<< instead.")
|
||||||
std::ostream& format(std::ostream& os, mark_t m) const
|
std::ostream& format(std::ostream& os, mark_t m) const
|
||||||
{
|
{
|
||||||
auto a = m; // ???
|
if (!m)
|
||||||
if (!a)
|
|
||||||
return os;
|
return os;
|
||||||
return os << m;
|
return os << m;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: deprecate?
|
// Deprecated since Spot 2.8
|
||||||
|
SPOT_DEPRECATED("Use operator<< or mark_t::as_string() instead.")
|
||||||
std::string format(mark_t m) const
|
std::string format(mark_t m) const
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
format(os, m);
|
if (m)
|
||||||
|
os << m;
|
||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2013-2018 Laboratoire de Recherche
|
// Copyright (C) 2013-2019 Laboratoire de Recherche
|
||||||
// et Développement de l'Epita.
|
// et Développement de l'Epita.
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
|
|
@ -63,8 +63,6 @@ namespace spot
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
static bdd_dict_ptr debug_dict = nullptr;
|
static bdd_dict_ptr debug_dict = nullptr;
|
||||||
static const acc_cond* debug_ref_acc = nullptr;
|
|
||||||
static const acc_cond* debug_cand_acc = nullptr;
|
|
||||||
|
|
||||||
struct path
|
struct path
|
||||||
{
|
{
|
||||||
|
|
@ -333,15 +331,14 @@ namespace spot
|
||||||
std::string
|
std::string
|
||||||
fmt_ta(unsigned src, bdd& cond, unsigned dst, unsigned nacc)
|
fmt_ta(unsigned src, bdd& cond, unsigned dst, unsigned nacc)
|
||||||
{
|
{
|
||||||
return helper.format_ta(debug_dict, debug_cand_acc, src, cond,
|
return helper.format_ta(debug_dict, src, cond, dst, cacc.mark(nacc));
|
||||||
dst, cacc.mark(nacc));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
fmt_ta(unsigned src, unsigned cond, unsigned dst, unsigned nacc)
|
fmt_ta(unsigned src, unsigned cond, unsigned dst, unsigned nacc)
|
||||||
{
|
{
|
||||||
return helper.format_ta(debug_dict, debug_cand_acc, src,
|
return helper.format_ta(debug_dict, src,
|
||||||
alpha_vect[cond], dst, cacc.mark(nacc));
|
alpha_vect[cond], dst, cacc.mark(nacc));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
|
|
@ -349,8 +346,8 @@ namespace spot
|
||||||
unsigned dst_ref, acc_cond::mark_t acc_cand = {},
|
unsigned dst_ref, acc_cond::mark_t acc_cand = {},
|
||||||
acc_cond::mark_t acc_ref = {})
|
acc_cond::mark_t acc_ref = {})
|
||||||
{
|
{
|
||||||
return helper.format_p(debug_cand_acc, debug_ref_acc, src_cand,
|
return helper.format_p(src_cand, src_ref, dst_cand, dst_ref,
|
||||||
src_ref, dst_cand, dst_ref, acc_cand, acc_ref);
|
acc_cand, acc_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
acc_cond::mark_t
|
acc_cond::mark_t
|
||||||
|
|
@ -568,8 +565,6 @@ namespace spot
|
||||||
assert(d.cand_size > 0);
|
assert(d.cand_size > 0);
|
||||||
|
|
||||||
#if TRACE
|
#if TRACE
|
||||||
debug_ref_acc = &ref->acc();
|
|
||||||
debug_cand_acc = &d.cacc;
|
|
||||||
solver.comment("d.ref_size:", d.ref_size, '\n');
|
solver.comment("d.ref_size:", d.ref_size, '\n');
|
||||||
solver.comment("d.cand_size:", d.cand_size, '\n');
|
solver.comment("d.cand_size:", d.cand_size, '\n');
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2009, 2011-2018 Laboratoire de Recherche et
|
// Copyright (C) 2009, 2011-2019 Laboratoire de Recherche et
|
||||||
// Développement de l'Epita (LRDE).
|
// Développement de l'Epita (LRDE).
|
||||||
// Copyright (C) 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
|
|
@ -632,7 +632,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
os << "ERROR: no transition with label="
|
os << "ERROR: no transition with label="
|
||||||
<< bdd_format_formula(aut->get_dict(), label)
|
<< bdd_format_formula(aut->get_dict(), label)
|
||||||
<< " and acc=" << aut->acc().format(acc)
|
<< " and acc=" << acc
|
||||||
<< " leaving state " << serial
|
<< " leaving state " << serial
|
||||||
<< " for state " << aut->format_state(next) << '\n'
|
<< " for state " << aut->format_state(next) << '\n'
|
||||||
<< "The following transitions leave state " << serial
|
<< "The following transitions leave state " << serial
|
||||||
|
|
@ -644,9 +644,7 @@ namespace spot
|
||||||
os << " * label="
|
os << " * label="
|
||||||
<< bdd_format_formula(aut->get_dict(),
|
<< bdd_format_formula(aut->get_dict(),
|
||||||
j->cond())
|
j->cond())
|
||||||
<< " and acc="
|
<< " and acc=" << j->acc()
|
||||||
<< (aut->acc().format
|
|
||||||
(j->acc()))
|
|
||||||
<< " going to " << aut->format_state(s2) << '\n';
|
<< " going to " << aut->format_state(s2) << '\n';
|
||||||
s2->destroy();
|
s2->destroy();
|
||||||
}
|
}
|
||||||
|
|
@ -660,20 +658,19 @@ namespace spot
|
||||||
{
|
{
|
||||||
os << "transition with label="
|
os << "transition with label="
|
||||||
<< bdd_format_formula(aut->get_dict(), label)
|
<< bdd_format_formula(aut->get_dict(), label)
|
||||||
<< " and acc=" << aut->acc().format(acc)
|
<< " and acc=" << acc << std::endl;
|
||||||
<< std::endl;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
os << " | ";
|
os << " | ";
|
||||||
bdd_print_formula(os, aut->get_dict(), label);
|
bdd_print_formula(os, aut->get_dict(), label);
|
||||||
os << '\t';
|
if (acc)
|
||||||
aut->acc().format(acc);
|
os << '\t' << acc;
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
}
|
}
|
||||||
aut->release_iter(j);
|
aut->release_iter(j);
|
||||||
|
|
||||||
// Sum acceptance conditions.
|
// Sum acceptance marks.
|
||||||
//
|
//
|
||||||
// (Beware l and i designate the next step to consider.
|
// (Beware l and i designate the next step to consider.
|
||||||
// Therefore if i is at the beginning of the cycle, `acc'
|
// Therefore if i is at the beginning of the cycle, `acc'
|
||||||
|
|
@ -686,8 +683,8 @@ namespace spot
|
||||||
{
|
{
|
||||||
all_acc_seen = true;
|
all_acc_seen = true;
|
||||||
if (debug)
|
if (debug)
|
||||||
os << "all acceptance conditions ("
|
os << "all acceptance marks ("
|
||||||
<< aut->acc().format(all_acc)
|
<< all_acc
|
||||||
<< ") have been seen\n";
|
<< ") have been seen\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -696,10 +693,10 @@ namespace spot
|
||||||
if (!aut->acc().accepting(all_acc))
|
if (!aut->acc().accepting(all_acc))
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
os << "ERROR: The cycle's acceptance conditions ("
|
os << "ERROR: The cycle's acceptance marks ("
|
||||||
<< aut->acc().format(all_acc)
|
<< all_acc
|
||||||
<< ") do not\nmatch those of the automaton ("
|
<< ") do not satisfy the acceptance condition ("
|
||||||
<< aut->acc().format(aut->acc().all_sets())
|
<< aut->get_acceptance()
|
||||||
<< ")\n";
|
<< ")\n";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-x
|
// -*- coding: utf-8 -*-x
|
||||||
// Copyright (C) 2014, 2015, 2017, 2018 Laboratoire de Recherche et
|
// Copyright (C) 2014, 2015, 2017, 2018, 2019 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.
|
||||||
|
|
@ -28,9 +28,7 @@
|
||||||
|
|
||||||
static void check(spot::acc_cond& ac, spot::acc_cond::mark_t m)
|
static void check(spot::acc_cond& ac, spot::acc_cond::mark_t m)
|
||||||
{
|
{
|
||||||
std::cout << '#' << m.count() << ": " << ac.format(m);
|
std::cout << '#' << m.count() << ": " << m;
|
||||||
if (!m)
|
|
||||||
std::cout << "empty";
|
|
||||||
if (ac.accepting(m))
|
if (ac.accepting(m))
|
||||||
std::cout << " accepting";
|
std::cout << " accepting";
|
||||||
std::cout << '\n';
|
std::cout << '\n';
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Copyright (C) 2014, 2015, 2017 Laboratoire de Recherche et
|
# Copyright (C) 2014, 2015, 2017, 2019 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.
|
||||||
|
|
@ -39,7 +39,7 @@ Inf(0)&Inf(1)&Inf(2)&Inf(3)
|
||||||
#3: {0,2,3}
|
#3: {0,2,3}
|
||||||
#1: {0}
|
#1: {0}
|
||||||
#4: {0,1,2,3}
|
#4: {0,1,2,3}
|
||||||
#0: empty
|
#0: {}
|
||||||
#5: {0,1,2,3,4} accepting
|
#5: {0,1,2,3,4} accepting
|
||||||
#2: {1,2}
|
#2: {1,2}
|
||||||
5 + 5 = 10
|
5 + 5 = 10
|
||||||
|
|
@ -48,14 +48,14 @@ Inf(0)&Inf(1)&Inf(2)&Inf(3)
|
||||||
#7: {0,1,2,3,4,6,7}
|
#7: {0,1,2,3,4,6,7}
|
||||||
#10: {0,1,2,3,4,5,6,7,8,9} accepting
|
#10: {0,1,2,3,4,5,6,7,8,9} accepting
|
||||||
0,1,2,3,4,5,6,7,8,9
|
0,1,2,3,4,5,6,7,8,9
|
||||||
#0: empty accepting
|
#0: {} accepting
|
||||||
#0: empty accepting
|
#0: {} accepting
|
||||||
#1: {3}
|
#1: {3}
|
||||||
#4: {0,1,2,3}
|
#4: {0,1,2,3}
|
||||||
#2: {0,2}
|
#2: {0,2}
|
||||||
stripping
|
stripping
|
||||||
#2: {0,2}
|
#2: {0,2}
|
||||||
#0: empty
|
#0: {}
|
||||||
#2: {0,3}
|
#2: {0,3}
|
||||||
#1: {1}
|
#1: {1}
|
||||||
#2: {1,2}
|
#2: {1,2}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue