formula: replace nth() by operator[]()
* src/ltlast/formula.hh (formula::nth): Replace by ... (formula::operator[]): ... this. * src/ltlvisit/mark.cc, src/ltlvisit/mutation.cc, src/ltlvisit/print.cc, src/ltlvisit/relabel.cc, src/ltlvisit/remove_x.cc, src/ltlvisit/simpfg.cc, src/ltlvisit/simplify.cc, src/ltlvisit/snf.cc, src/ltlvisit/unabbrev.cc, src/twa/formula2bdd.cc, src/twaalgos/compsusp.cc, src/twaalgos/ltl2taa.cc, src/twaalgos/ltl2tgba_fm.cc, wrap/python/spot_impl.i: Adjust.
This commit is contained in:
parent
533268000d
commit
2369389850
15 changed files with 373 additions and 373 deletions
|
|
@ -1076,12 +1076,12 @@ namespace spot
|
||||||
{
|
{
|
||||||
return ptr_->end();
|
return ptr_->end();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
formula nth(unsigned i) const
|
formula operator[](unsigned i) const
|
||||||
{
|
{
|
||||||
return formula(ptr_->nth(i)->clone());
|
return formula(ptr_->nth(i)->clone());
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static formula ff()
|
static formula ff()
|
||||||
{
|
{
|
||||||
|
|
@ -1206,7 +1206,7 @@ namespace spot
|
||||||
case op::Closure:
|
case op::Closure:
|
||||||
case op::NegClosure:
|
case op::NegClosure:
|
||||||
case op::NegClosureMarked:
|
case op::NegClosureMarked:
|
||||||
return unop(o, trans(nth(0)));
|
return unop(o, trans((*this)[0]));
|
||||||
case op::Xor:
|
case op::Xor:
|
||||||
case op::Implies:
|
case op::Implies:
|
||||||
case op::Equiv:
|
case op::Equiv:
|
||||||
|
|
@ -1218,8 +1218,8 @@ namespace spot
|
||||||
case op::EConcatMarked:
|
case op::EConcatMarked:
|
||||||
case op::UConcat:
|
case op::UConcat:
|
||||||
{
|
{
|
||||||
formula tmp = trans(nth(0));
|
formula tmp = trans((*this)[0]);
|
||||||
return binop(o, tmp, trans(nth(1)));
|
return binop(o, tmp, trans((*this)[1]));
|
||||||
}
|
}
|
||||||
case op::Or:
|
case op::Or:
|
||||||
case op::OrRat:
|
case op::OrRat:
|
||||||
|
|
@ -1237,7 +1237,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
case op::Star:
|
case op::Star:
|
||||||
case op::FStar:
|
case op::FStar:
|
||||||
return bunop(o, trans(nth(0)), min(), max());
|
return bunop(o, trans((*this)[0]), min(), max());
|
||||||
}
|
}
|
||||||
SPOT_UNREACHABLE();
|
SPOT_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,10 +63,10 @@ namespace spot
|
||||||
res = f;
|
res = f;
|
||||||
break;
|
break;
|
||||||
case op::NegClosure:
|
case op::NegClosure:
|
||||||
res = ltl::formula::NegClosureMarked(f.nth(0));
|
res = ltl::formula::NegClosureMarked(f[0]);
|
||||||
break;
|
break;
|
||||||
case op::EConcat:
|
case op::EConcat:
|
||||||
res = ltl::formula::EConcatMarked(f.nth(0), f.nth(1));
|
res = ltl::formula::EConcatMarked(f[0], f[1]);
|
||||||
break;
|
break;
|
||||||
case op::Or:
|
case op::Or:
|
||||||
case op::And:
|
case op::And:
|
||||||
|
|
@ -138,7 +138,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
if (c.is(op::EConcatMarked))
|
if (c.is(op::EConcatMarked))
|
||||||
{
|
{
|
||||||
empairs.emplace(c.nth(0), c.nth(1));
|
empairs.emplace(c[0], c[1]);
|
||||||
v.push_back(c.map(recurse));
|
v.push_back(c.map(recurse));
|
||||||
}
|
}
|
||||||
else if (c.is(op::EConcat))
|
else if (c.is(op::EConcat))
|
||||||
|
|
@ -147,7 +147,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
else if (c.is(op::NegClosureMarked))
|
else if (c.is(op::NegClosureMarked))
|
||||||
{
|
{
|
||||||
nmset.insert(c.nth(0));
|
nmset.insert(c[0]);
|
||||||
v.push_back(c.map(recurse));
|
v.push_back(c.map(recurse));
|
||||||
}
|
}
|
||||||
else if (c.is(op::NegClosure))
|
else if (c.is(op::NegClosure))
|
||||||
|
|
@ -162,13 +162,13 @@ namespace spot
|
||||||
// Keep only the non-marked EConcat for which we
|
// Keep only the non-marked EConcat for which we
|
||||||
// have not seen a similar EConcatMarked.
|
// have not seen a similar EConcatMarked.
|
||||||
for (auto e: elist)
|
for (auto e: elist)
|
||||||
if (empairs.find(std::make_pair(e.nth(0), e.nth(1)))
|
if (empairs.find(std::make_pair(e[0], e[1]))
|
||||||
== empairs.end())
|
== empairs.end())
|
||||||
v.push_back(e);
|
v.push_back(e);
|
||||||
// Keep only the non-marked NegClosure for which we
|
// Keep only the non-marked NegClosure for which we
|
||||||
// have not seen a similar NegClosureMarked.
|
// have not seen a similar NegClosureMarked.
|
||||||
for (auto n: nlist)
|
for (auto n: nlist)
|
||||||
if (nmset.find(n.nth(0)) == nmset.end())
|
if (nmset.find(n[0]) == nmset.end())
|
||||||
v.push_back(n);
|
v.push_back(n);
|
||||||
res = ltl::formula::And(v);
|
res = ltl::formula::And(v);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ namespace spot
|
||||||
case op::G:
|
case op::G:
|
||||||
if ((opts_ & Mut_Remove_Ops)
|
if ((opts_ & Mut_Remove_Ops)
|
||||||
&& mutation_counter_-- == 0)
|
&& mutation_counter_-- == 0)
|
||||||
return f.nth(0);
|
return f[0];
|
||||||
// fall through
|
// fall through
|
||||||
case op::Closure:
|
case op::Closure:
|
||||||
case op::NegClosure:
|
case op::NegClosure:
|
||||||
|
|
@ -118,7 +118,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
vec v1;
|
vec v1;
|
||||||
vec v2;
|
vec v2;
|
||||||
v1.push_back(f.nth(0));
|
v1.push_back(f[0]);
|
||||||
bool reverse = false;
|
bool reverse = false;
|
||||||
int i = 1;
|
int i = 1;
|
||||||
while (i < mos)
|
while (i < mos)
|
||||||
|
|
@ -130,10 +130,10 @@ namespace spot
|
||||||
reverse = true;
|
reverse = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
v1.push_back(f.nth(i++));
|
v1.push_back(f[i++]);
|
||||||
}
|
}
|
||||||
for (; i < mos; ++i)
|
for (; i < mos; ++i)
|
||||||
v2.push_back(f.nth(i));
|
v2.push_back(f[i]);
|
||||||
formula first = AndNLM_(v1);
|
formula first = AndNLM_(v1);
|
||||||
formula second = AndNLM_(v2);
|
formula second = AndNLM_(v2);
|
||||||
formula ost = formula::one_star();
|
formula ost = formula::one_star();
|
||||||
|
|
@ -164,8 +164,8 @@ namespace spot
|
||||||
case op::EConcatMarked:
|
case op::EConcatMarked:
|
||||||
case op::UConcat:
|
case op::UConcat:
|
||||||
{
|
{
|
||||||
formula first = f.nth(0);
|
formula first = f[0];
|
||||||
formula second = f.nth(1);
|
formula second = f[1];
|
||||||
op o = f.kind();
|
op o = f.kind();
|
||||||
bool left_is_sere = o == op::EConcat
|
bool left_is_sere = o == op::EConcat
|
||||||
|| o == op::EConcatMarked
|
|| o == op::EConcatMarked
|
||||||
|
|
@ -242,7 +242,7 @@ namespace spot
|
||||||
case op::Star:
|
case op::Star:
|
||||||
case op::FStar:
|
case op::FStar:
|
||||||
{
|
{
|
||||||
formula c = f.nth(0);
|
formula c = f[0];
|
||||||
op o = f.kind();
|
op o = f.kind();
|
||||||
if (opts_ & Mut_Remove_Ops && mutation_counter_-- == 0)
|
if (opts_ & Mut_Remove_Ops && mutation_counter_-- == 0)
|
||||||
return c;
|
return c;
|
||||||
|
|
|
||||||
|
|
@ -348,10 +348,10 @@ namespace spot
|
||||||
match_goto(formula mo, unsigned i)
|
match_goto(formula mo, unsigned i)
|
||||||
{
|
{
|
||||||
assert(i + 1 < mo.size());
|
assert(i + 1 < mo.size());
|
||||||
formula b = strip_star_not(mo.nth(i));
|
formula b = strip_star_not(mo[i]);
|
||||||
if (b == nullptr || !b.is_boolean())
|
if (b == nullptr || !b.is_boolean())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (mo.nth(i + 1) == b)
|
if (mo[i + 1] == b)
|
||||||
return b;
|
return b;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
@ -482,7 +482,7 @@ namespace spot
|
||||||
break;
|
break;
|
||||||
case op::Not:
|
case op::Not:
|
||||||
{
|
{
|
||||||
formula c = f.nth(0);
|
formula c = f[0];
|
||||||
if (c.is(op::AP))
|
if (c.is(op::AP))
|
||||||
{
|
{
|
||||||
// If we negate a single letter in UTF-8, use a
|
// If we negate a single letter in UTF-8, use a
|
||||||
|
|
@ -514,15 +514,15 @@ namespace spot
|
||||||
}
|
}
|
||||||
case op::X:
|
case op::X:
|
||||||
emit(KX);
|
emit(KX);
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
break;
|
break;
|
||||||
case op::F:
|
case op::F:
|
||||||
emit(KF);
|
emit(KF);
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
break;
|
break;
|
||||||
case op::G:
|
case op::G:
|
||||||
emit(KG);
|
emit(KG);
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
break;
|
break;
|
||||||
case op::NegClosure:
|
case op::NegClosure:
|
||||||
case op::NegClosureMarked:
|
case op::NegClosureMarked:
|
||||||
|
|
@ -534,45 +534,45 @@ namespace spot
|
||||||
os_ << '{';
|
os_ << '{';
|
||||||
in_ratexp_ = true;
|
in_ratexp_ = true;
|
||||||
top_level_ = true;
|
top_level_ = true;
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
os_ << '}';
|
os_ << '}';
|
||||||
in_ratexp_ = false;
|
in_ratexp_ = false;
|
||||||
top_level_ = false;
|
top_level_ = false;
|
||||||
break;
|
break;
|
||||||
case op::Xor:
|
case op::Xor:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KXor);
|
emit(KXor);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::Implies:
|
case op::Implies:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KImplies);
|
emit(KImplies);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::Equiv:
|
case op::Equiv:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KEquiv);
|
emit(KEquiv);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::U:
|
case op::U:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KU);
|
emit(KU);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::R:
|
case op::R:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KR);
|
emit(KR);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::W:
|
case op::W:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KW);
|
emit(KW);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::M:
|
case op::M:
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
emit(KM);
|
emit(KM);
|
||||||
visit(f.nth(1));
|
visit(f[1]);
|
||||||
break;
|
break;
|
||||||
case op::EConcat:
|
case op::EConcat:
|
||||||
case op::EConcatMarked:
|
case op::EConcatMarked:
|
||||||
|
|
@ -581,11 +581,11 @@ namespace spot
|
||||||
in_ratexp_ = true;
|
in_ratexp_ = true;
|
||||||
openp();
|
openp();
|
||||||
top_level_ = true;
|
top_level_ = true;
|
||||||
formula left = f.nth(0);
|
formula left = f[0];
|
||||||
formula right = f.nth(1);
|
formula right = f[1];
|
||||||
unsigned last = left.size() - 1;
|
unsigned last = left.size() - 1;
|
||||||
bool onelast = false;
|
bool onelast = false;
|
||||||
if (left.is(op::Concat) && left.nth(last).is(op::True))
|
if (left.is(op::Concat) && left[last].is_true())
|
||||||
{
|
{
|
||||||
visit(left.all_but(last));
|
visit(left.all_but(last));
|
||||||
onelast = true;
|
onelast = true;
|
||||||
|
|
@ -609,7 +609,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
else if (o == op::EConcat)
|
else if (o == op::EConcat)
|
||||||
{
|
{
|
||||||
if (f.nth(1).is(op::True))
|
if (f[1].is(op::True))
|
||||||
{
|
{
|
||||||
os_ << '!';
|
os_ << '!';
|
||||||
// No recursion on right.
|
// No recursion on right.
|
||||||
|
|
@ -633,7 +633,7 @@ namespace spot
|
||||||
case op::AndNLM:
|
case op::AndNLM:
|
||||||
case op::Fusion:
|
case op::Fusion:
|
||||||
{
|
{
|
||||||
visit(f.nth(0));
|
visit(f[0]);
|
||||||
keyword k = KFalse; // Initialize to something to please GCC.
|
keyword k = KFalse; // Initialize to something to please GCC.
|
||||||
switch (o)
|
switch (o)
|
||||||
{
|
{
|
||||||
|
|
@ -664,7 +664,7 @@ namespace spot
|
||||||
for (unsigned n = 1; n < max; ++n)
|
for (unsigned n = 1; n < max; ++n)
|
||||||
{
|
{
|
||||||
emit(k);
|
emit(k);
|
||||||
visit(f.nth(n));
|
visit(f[n]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -686,7 +686,7 @@ namespace spot
|
||||||
|
|
||||||
// Wait... maybe we are looking at (!b)[*];b;(!b)[*]
|
// Wait... maybe we are looking at (!b)[*];b;(!b)[*]
|
||||||
// in which case it's b[=1].
|
// in which case it's b[=1].
|
||||||
if (i + 2 < max && f.nth(i) == f.nth(i + 2))
|
if (i + 2 < max && f[i] == f[i + 2])
|
||||||
{
|
{
|
||||||
emit(KEqualBunop);
|
emit(KEqualBunop);
|
||||||
os_ << '1';
|
os_ << '1';
|
||||||
|
|
@ -702,12 +702,12 @@ namespace spot
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Try to match ((!b)[*];b)[*i..j];(!b)[*]
|
// Try to match ((!b)[*];b)[*i..j];(!b)[*]
|
||||||
formula fi = f.nth(i);
|
formula fi = f[i];
|
||||||
if (fi.is(op::Star))
|
if (fi.is(op::Star))
|
||||||
{
|
{
|
||||||
if (formula b2 = strip_star_not(f.nth(i + 1)))
|
if (formula b2 = strip_star_not(f[i + 1]))
|
||||||
{
|
{
|
||||||
formula fic = fi.nth(0);
|
formula fic = fi[0];
|
||||||
if (fic.is(op::Concat))
|
if (fic.is(op::Concat))
|
||||||
if (formula b1 = match_goto(fic, 0))
|
if (formula b1 = match_goto(fic, 0))
|
||||||
if (b1 == b2)
|
if (b1 == b2)
|
||||||
|
|
@ -730,14 +730,14 @@ namespace spot
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
visit(f.nth(i));
|
visit(f[i]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case op::Star:
|
case op::Star:
|
||||||
case op::FStar:
|
case op::FStar:
|
||||||
{
|
{
|
||||||
formula c = f.nth(0);
|
formula c = f[0];
|
||||||
enum { Star, FStar, Goto } sugar = Star;
|
enum { Star, FStar, Goto } sugar = Star;
|
||||||
unsigned default_min = 0;
|
unsigned default_min = 0;
|
||||||
unsigned default_max = formula::unbounded();
|
unsigned default_max = formula::unbounded();
|
||||||
|
|
|
||||||
|
|
@ -280,24 +280,24 @@ namespace spot
|
||||||
visit(b);
|
visit(b);
|
||||||
}
|
}
|
||||||
for (; i < sz; ++i)
|
for (; i < sz; ++i)
|
||||||
visit(f.nth(i));
|
visit(f[i]);
|
||||||
if (sz > 1 && f.is_boolean())
|
if (sz > 1 && f.is_boolean())
|
||||||
{
|
{
|
||||||
// For Boolean nodes, connect all children in a
|
// For Boolean nodes, connect all children in a
|
||||||
// loop. This way the node can only be a cut-point
|
// loop. This way the node can only be a cut-point
|
||||||
// if it separates all children from the reset of
|
// if it separates all children from the reset of
|
||||||
// the graph (not only one).
|
// the graph (not only one).
|
||||||
formula pred = f.nth(0);
|
formula pred = f[0];
|
||||||
for (i = 1; i < sz; ++i)
|
for (i = 1; i < sz; ++i)
|
||||||
{
|
{
|
||||||
formula next = f.nth(i);
|
formula next = f[i];
|
||||||
// Note that we only add an edge in one
|
// Note that we only add an edge in one
|
||||||
// direction, because we are building a cycle
|
// direction, because we are building a cycle
|
||||||
// between all children anyway.
|
// between all children anyway.
|
||||||
g[pred].push_back(next);
|
g[pred].push_back(next);
|
||||||
pred = next;
|
pred = next;
|
||||||
}
|
}
|
||||||
g[pred].push_back(f.nth(0));
|
g[pred].push_back(f[0]);
|
||||||
}
|
}
|
||||||
s.pop();
|
s.pop();
|
||||||
}
|
}
|
||||||
|
|
@ -446,7 +446,7 @@ namespace spot
|
||||||
res.reserve(sz);
|
res.reserve(sz);
|
||||||
}
|
}
|
||||||
for (; i < sz; ++i)
|
for (; i < sz; ++i)
|
||||||
res.push_back(visit(f.nth(i)));
|
res.push_back(visit(f[i]));
|
||||||
return formula::multop(f.kind(), res);
|
return formula::multop(f.kind(), res);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ namespace spot
|
||||||
if (!f.is(op::X))
|
if (!f.is(op::X))
|
||||||
return f.map(rec);
|
return f.map(rec);
|
||||||
|
|
||||||
formula c = rec(f.nth(0));
|
formula c = rec(f[0]);
|
||||||
|
|
||||||
std::vector<formula> vo;
|
std::vector<formula> vo;
|
||||||
for (auto i: aps)
|
for (auto i: aps)
|
||||||
|
|
|
||||||
|
|
@ -29,17 +29,17 @@ namespace spot
|
||||||
formula simplify_f_g(formula p)
|
formula simplify_f_g(formula p)
|
||||||
{
|
{
|
||||||
// 1 U p = Fp
|
// 1 U p = Fp
|
||||||
if (p.is(op::U) && p.nth(0).is_true())
|
if (p.is(op::U) && p[0].is_true())
|
||||||
return formula::F(p.nth(1));
|
return formula::F(p[1]);
|
||||||
// 0 R p = Gp
|
// 0 R p = Gp
|
||||||
if (p.is(op::R) && p.nth(0).is_false())
|
if (p.is(op::R) && p[0].is_false())
|
||||||
return formula::G(p.nth(1));
|
return formula::G(p[1]);
|
||||||
// p W 0 = Gp
|
// p W 0 = Gp
|
||||||
if (p.is(op::W) && p.nth(1).is_false())
|
if (p.is(op::W) && p[1].is_false())
|
||||||
return formula::G(p.nth(0));
|
return formula::G(p[0]);
|
||||||
// p M 1 = Fp
|
// p M 1 = Fp
|
||||||
if (p.is(op::M) && p.nth(1).is_true())
|
if (p.is(op::M) && p[1].is_true())
|
||||||
return formula::F(p.nth(0));
|
return formula::F(p[0]);
|
||||||
return p.map(simplify_f_g);
|
return p.map(simplify_f_g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -56,9 +56,9 @@ namespace spot
|
||||||
break;
|
break;
|
||||||
case op::Star:
|
case op::Star:
|
||||||
if (!bounded)
|
if (!bounded)
|
||||||
out = visit(f.nth(0)); // Strip the star.
|
out = visit(f[0]); // Strip the star.
|
||||||
else
|
else
|
||||||
out = formula::Star(visit(f.nth(0)),
|
out = formula::Star(visit(f[0]),
|
||||||
std::max(unsigned(f.min()), 1U), f.max());
|
std::max(unsigned(f.min()), 1U), f.max());
|
||||||
break;
|
break;
|
||||||
case op::Concat:
|
case op::Concat:
|
||||||
|
|
@ -91,7 +91,7 @@ namespace spot
|
||||||
std::vector<formula> v;
|
std::vector<formula> v;
|
||||||
v.reserve(s);
|
v.reserve(s);
|
||||||
for (unsigned pos = 0; pos < s; ++pos)
|
for (unsigned pos = 0; pos < s; ++pos)
|
||||||
v.emplace_back(visit(f.nth(pos)));
|
v.emplace_back(visit(f[pos]));
|
||||||
out = formula::OrRat(v);
|
out = formula::OrRat(v);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ namespace spot
|
||||||
// F f = true U f
|
// F f = true U f
|
||||||
if (!re_f_)
|
if (!re_f_)
|
||||||
break;
|
break;
|
||||||
out = formula::U(formula::tt(), out.nth(0));
|
out = formula::U(formula::tt(), out[0]);
|
||||||
break;
|
break;
|
||||||
case op::G:
|
case op::G:
|
||||||
// G f = false R f
|
// G f = false R f
|
||||||
|
|
@ -130,16 +130,16 @@ namespace spot
|
||||||
break;
|
break;
|
||||||
if (!re_r_)
|
if (!re_r_)
|
||||||
{
|
{
|
||||||
out = formula::R(formula::ff(), out.nth(0));
|
out = formula::R(formula::ff(), out[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!re_w_)
|
if (!re_w_)
|
||||||
{
|
{
|
||||||
out = formula::W(out.nth(0), formula::ff());
|
out = formula::W(out[0], formula::ff());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto nc = formula::Not(out.nth(0));
|
auto nc = formula::Not(out[0]);
|
||||||
if (!re_f_)
|
if (!re_f_)
|
||||||
{
|
{
|
||||||
out = formula::Not(formula::F(nc));
|
out = formula::Not(formula::F(nc));
|
||||||
|
|
@ -154,8 +154,8 @@ namespace spot
|
||||||
if (!re_xor_)
|
if (!re_xor_)
|
||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
auto f1 = out.nth(0);
|
auto f1 = out[0];
|
||||||
auto f2 = out.nth(1);
|
auto f2 = out[1];
|
||||||
if (!re_e_)
|
if (!re_e_)
|
||||||
{
|
{
|
||||||
out = formula::Not(formula::Equiv(f1, f2));
|
out = formula::Not(formula::Equiv(f1, f2));
|
||||||
|
|
@ -172,15 +172,15 @@ namespace spot
|
||||||
// f1 => f2 == !f1 | f2
|
// f1 => f2 == !f1 | f2
|
||||||
if (!re_i_)
|
if (!re_i_)
|
||||||
break;
|
break;
|
||||||
out = formula::Or({formula::Not(out.nth(0)), out.nth(1)});
|
out = formula::Or({formula::Not(out[0]), out[1]});
|
||||||
break;
|
break;
|
||||||
case op::Equiv:
|
case op::Equiv:
|
||||||
// f1 <=> f2 == (f1 & f2) | (!f1 & !f2)
|
// f1 <=> f2 == (f1 & f2) | (!f1 & !f2)
|
||||||
if (!re_e_)
|
if (!re_e_)
|
||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
auto f1 = out.nth(0);
|
auto f1 = out[0];
|
||||||
auto f2 = out.nth(1);
|
auto f2 = out[1];
|
||||||
auto nf1 = formula::Not(f1);
|
auto nf1 = formula::Not(f1);
|
||||||
auto nf2 = formula::Not(f2);
|
auto nf2 = formula::Not(f2);
|
||||||
auto term1 = formula::And({f1, f2});
|
auto term1 = formula::And({f1, f2});
|
||||||
|
|
@ -196,8 +196,8 @@ namespace spot
|
||||||
if (!re_r_)
|
if (!re_r_)
|
||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
auto f1 = out.nth(0);
|
auto f1 = out[0];
|
||||||
auto f2 = out.nth(1);
|
auto f2 = out[1];
|
||||||
auto f12 = formula::And({f1, f2});
|
auto f12 = formula::And({f1, f2});
|
||||||
if (!re_w_)
|
if (!re_w_)
|
||||||
{
|
{
|
||||||
|
|
@ -218,8 +218,8 @@ namespace spot
|
||||||
if (!re_w_)
|
if (!re_w_)
|
||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
auto f1 = out.nth(0);
|
auto f1 = out[0];
|
||||||
auto f2 = out.nth(1);
|
auto f2 = out[1];
|
||||||
if (!re_r_)
|
if (!re_r_)
|
||||||
{
|
{
|
||||||
out = formula::R(f2, formula::Or({f2, f1}));
|
out = formula::R(f2, formula::Or({f2, f1}));
|
||||||
|
|
@ -236,8 +236,8 @@ namespace spot
|
||||||
if (!re_m_)
|
if (!re_m_)
|
||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
auto f2 = out.nth(1);
|
auto f2 = out[1];
|
||||||
out = formula::U(f2, formula::And({f2, out.nth(0)}));
|
out = formula::U(f2, formula::And({f2, out[0]}));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -101,13 +101,13 @@ namespace spot
|
||||||
case op::AP:
|
case op::AP:
|
||||||
return bdd_ithvar(d->register_proposition(f, owner));
|
return bdd_ithvar(d->register_proposition(f, owner));
|
||||||
case op::Not:
|
case op::Not:
|
||||||
return bdd_not(recurse(f.nth(0)));
|
return bdd_not(recurse(f[0]));
|
||||||
case op::Xor:
|
case op::Xor:
|
||||||
return bdd_apply(recurse(f.nth(0)), recurse(f.nth(1)), bddop_xor);
|
return bdd_apply(recurse(f[0]), recurse(f[1]), bddop_xor);
|
||||||
case op::Implies:
|
case op::Implies:
|
||||||
return bdd_apply(recurse(f.nth(0)), recurse(f.nth(1)), bddop_imp);
|
return bdd_apply(recurse(f[0]), recurse(f[1]), bddop_imp);
|
||||||
case op::Equiv:
|
case op::Equiv:
|
||||||
return bdd_apply(recurse(f.nth(0)), recurse(f.nth(1)), bddop_biimp);
|
return bdd_apply(recurse(f[0]), recurse(f[1]), bddop_biimp);
|
||||||
case op::And:
|
case op::And:
|
||||||
case op::Or:
|
case op::Or:
|
||||||
{
|
{
|
||||||
|
|
@ -120,7 +120,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
unsigned s = f.size();
|
unsigned s = f.size();
|
||||||
for (unsigned n = 0; n < s; ++n)
|
for (unsigned n = 0; n < s; ++n)
|
||||||
res = bdd_apply(res, recurse(f.nth(n)), op);
|
res = bdd_apply(res, recurse(f[n]), op);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ namespace spot
|
||||||
unsigned mos = f.size();
|
unsigned mos = f.size();
|
||||||
for (unsigned i = 0; i < mos; ++i)
|
for (unsigned i = 0; i < mos; ++i)
|
||||||
{
|
{
|
||||||
ltl::formula c = f.nth(i);
|
ltl::formula c = f[i];
|
||||||
if (c.is_boolean())
|
if (c.is_boolean())
|
||||||
res.push_back(c);
|
res.push_back(c);
|
||||||
else if (oblig_ && c.is_syntactic_obligation())
|
else if (oblig_ && c.is_syntactic_obligation())
|
||||||
|
|
@ -91,7 +91,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
// res || susp -> (res && G![susp]) || G[susp])
|
// res || susp -> (res && G![susp]) || G[susp])
|
||||||
auto r = ltl::formula::multop(op, res);
|
auto r = ltl::formula::multop(op, res);
|
||||||
auto gn = ltl::formula::G(ltl::formula::Not(g.nth(0)));
|
auto gn = ltl::formula::G(ltl::formula::Not(g[0]));
|
||||||
return ltl::formula::Or({ltl::formula::And({r, gn}), g});
|
return ltl::formula::Or({ltl::formula::And({r, gn}), g});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
case op::X:
|
case op::X:
|
||||||
{
|
{
|
||||||
ltl2taa_visitor v = recurse(f.nth(0));
|
ltl2taa_visitor v = recurse(f[0]);
|
||||||
std::vector<formula> dst;
|
std::vector<formula> dst;
|
||||||
std::vector<formula> a;
|
std::vector<formula> a;
|
||||||
if (v.succ_.empty()) // Handle X(0)
|
if (v.succ_.empty()) // Handle X(0)
|
||||||
|
|
@ -104,7 +104,7 @@ namespace spot
|
||||||
case op::Not:
|
case op::Not:
|
||||||
{
|
{
|
||||||
negated_ = true;
|
negated_ = true;
|
||||||
ltl2taa_visitor v = recurse(f.nth(0));
|
ltl2taa_visitor v = recurse(f[0]);
|
||||||
// Done in recurse
|
// Done in recurse
|
||||||
succ_ = v.succ_;
|
succ_ = v.succ_;
|
||||||
return;
|
return;
|
||||||
|
|
@ -143,8 +143,8 @@ namespace spot
|
||||||
void
|
void
|
||||||
visit_binop(formula f)
|
visit_binop(formula f)
|
||||||
{
|
{
|
||||||
ltl2taa_visitor v1 = recurse(f.nth(0));
|
ltl2taa_visitor v1 = recurse(f[0]);
|
||||||
ltl2taa_visitor v2 = recurse(f.nth(1));
|
ltl2taa_visitor v2 = recurse(f[1]);
|
||||||
|
|
||||||
std::vector<succ_state>::iterator i1;
|
std::vector<succ_state>::iterator i1;
|
||||||
std::vector<succ_state>::iterator i2;
|
std::vector<succ_state>::iterator i2;
|
||||||
|
|
@ -159,7 +159,7 @@ namespace spot
|
||||||
// fall thru
|
// fall thru
|
||||||
case op::W:
|
case op::W:
|
||||||
if (refined_)
|
if (refined_)
|
||||||
contained = lcc_->contained(f.nth(0), f.nth(1));
|
contained = lcc_->contained(f[0], f[1]);
|
||||||
for (i1 = v1.succ_.begin(); i1 != v1.succ_.end(); ++i1)
|
for (i1 = v1.succ_.begin(); i1 != v1.succ_.end(); ++i1)
|
||||||
{
|
{
|
||||||
// Refined rule
|
// Refined rule
|
||||||
|
|
@ -169,11 +169,11 @@ namespace spot
|
||||||
|
|
||||||
i1->Q.push_back(init_); // Add the initial state
|
i1->Q.push_back(init_); // Add the initial state
|
||||||
if (strong)
|
if (strong)
|
||||||
i1->acc.push_back(f.nth(1));
|
i1->acc.push_back(f[1]);
|
||||||
t = res_->create_transition(init_, i1->Q);
|
t = res_->create_transition(init_, i1->Q);
|
||||||
res_->add_condition(t, i1->condition);
|
res_->add_condition(t, i1->condition);
|
||||||
if (strong)
|
if (strong)
|
||||||
res_->add_acceptance_condition(t, f.nth(1));
|
res_->add_acceptance_condition(t, f[1]);
|
||||||
else
|
else
|
||||||
for (unsigned i = 0; i < i1->acc.size(); ++i)
|
for (unsigned i = 0; i < i1->acc.size(); ++i)
|
||||||
res_->add_acceptance_condition(t, i1->acc[i]);
|
res_->add_acceptance_condition(t, i1->acc[i]);
|
||||||
|
|
@ -190,7 +190,7 @@ namespace spot
|
||||||
strong = true;
|
strong = true;
|
||||||
case op::R: // Weak Release
|
case op::R: // Weak Release
|
||||||
if (refined_)
|
if (refined_)
|
||||||
contained = lcc_->contained(f.nth(0), f.nth(1));
|
contained = lcc_->contained(f[0], f[1]);
|
||||||
|
|
||||||
for (i2 = v2.succ_.begin(); i2 != v2.succ_.end(); ++i2)
|
for (i2 = v2.succ_.begin(); i2 != v2.succ_.end(); ++i2)
|
||||||
{
|
{
|
||||||
|
|
@ -222,8 +222,8 @@ namespace spot
|
||||||
|
|
||||||
if (strong)
|
if (strong)
|
||||||
{
|
{
|
||||||
i2->acc.push_back(f.nth(0));
|
i2->acc.push_back(f[0]);
|
||||||
res_->add_acceptance_condition(t, f.nth(0));
|
res_->add_acceptance_condition(t, f[0]);
|
||||||
}
|
}
|
||||||
else if (refined_)
|
else if (refined_)
|
||||||
for (unsigned i = 0; i < i2->acc.size(); ++i)
|
for (unsigned i = 0; i < i2->acc.size(); ++i)
|
||||||
|
|
@ -244,7 +244,7 @@ namespace spot
|
||||||
std::vector<ltl2taa_visitor> vs;
|
std::vector<ltl2taa_visitor> vs;
|
||||||
for (unsigned n = 0, s = f.size(); n < s; ++n)
|
for (unsigned n = 0, s = f.size(); n < s; ++n)
|
||||||
{
|
{
|
||||||
vs.push_back(recurse(f.nth(n)));
|
vs.push_back(recurse(f[n]));
|
||||||
if (vs[n].succ_.empty()) // Handle 0
|
if (vs[n].succ_.empty()) // Handle 0
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,28 +69,28 @@ namespace spot
|
||||||
unsigned s = f.size();
|
unsigned s = f.size();
|
||||||
for (unsigned n = 0; n < s; ++n)
|
for (unsigned n = 0; n < s; ++n)
|
||||||
{
|
{
|
||||||
formula sub = f.nth(n);
|
formula sub = f[n];
|
||||||
// Recurring is set if we are under "G(...)" or "0 R (...)"
|
// Recurring is set if we are under "G(...)" or "0 R (...)"
|
||||||
// or (...) W 0".
|
// or (...) W 0".
|
||||||
if (recurring)
|
if (recurring)
|
||||||
rec.insert(sub);
|
rec.insert(sub);
|
||||||
if (sub.is(op::G))
|
if (sub.is(op::G))
|
||||||
{
|
{
|
||||||
implied_subformulae(sub.nth(0), rec, true);
|
implied_subformulae(sub[0], rec, true);
|
||||||
}
|
}
|
||||||
else if (sub.is(op::W))
|
else if (sub.is(op::W))
|
||||||
{
|
{
|
||||||
// f W 0 = Gf
|
// f W 0 = Gf
|
||||||
if (sub.nth(1).is_false())
|
if (sub[1].is_false())
|
||||||
implied_subformulae(sub.nth(0), rec, true);
|
implied_subformulae(sub[0], rec, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
while (sub.is(op::R, op::M))
|
while (sub.is(op::R, op::M))
|
||||||
{
|
{
|
||||||
// in 'f R g' and 'f M g' always evaluate 'g'.
|
// in 'f R g' and 'f M g' always evaluate 'g'.
|
||||||
formula b = sub;
|
formula b = sub;
|
||||||
sub = b.nth(1);
|
sub = b[1];
|
||||||
if (b.nth(0).is_false())
|
if (b[0].is_false())
|
||||||
{
|
{
|
||||||
assert(b.is(op::R)); // because 0 M g = 0
|
assert(b.is(op::R)); // because 0 M g = 0
|
||||||
// 0 R f = Gf
|
// 0 R f = Gf
|
||||||
|
|
@ -305,12 +305,12 @@ namespace spot
|
||||||
if (f.is(op::U))
|
if (f.is(op::U))
|
||||||
{
|
{
|
||||||
// P(a U b) = P(b)
|
// P(a U b) = P(b)
|
||||||
f = f.nth(1);
|
f = f[1];
|
||||||
}
|
}
|
||||||
else if (f.is(op::M))
|
else if (f.is(op::M))
|
||||||
{
|
{
|
||||||
// P(a M b) = P(a & b)
|
// P(a M b) = P(a & b)
|
||||||
formula g = formula::And({f.nth(0), f.nth(1)});
|
formula g = formula::And({f[0], f[1]});
|
||||||
int num = dict->register_acceptance_variable(g, this);
|
int num = dict->register_acceptance_variable(g, this);
|
||||||
a_set &= bdd_ithvar(num);
|
a_set &= bdd_ithvar(num);
|
||||||
|
|
||||||
|
|
@ -322,7 +322,7 @@ namespace spot
|
||||||
else if (f.is(op::F))
|
else if (f.is(op::F))
|
||||||
{
|
{
|
||||||
// P(F(a)) = P(a)
|
// P(F(a)) = P(a)
|
||||||
f = f.nth(0);
|
f = f[0];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -596,7 +596,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
// Not can only appear in front of Boolean
|
// Not can only appear in front of Boolean
|
||||||
// expressions.
|
// expressions.
|
||||||
formula g = f.nth(0);
|
formula g = f[0];
|
||||||
assert(g.is_boolean());
|
assert(g.is_boolean());
|
||||||
return (!recurse(g)) & next_to_concat();
|
return (!recurse(g)) & next_to_concat();
|
||||||
}
|
}
|
||||||
|
|
@ -619,7 +619,7 @@ namespace spot
|
||||||
unsigned min2 = (min == 0) ? 0 : (min - 1);
|
unsigned min2 = (min == 0) ? 0 : (min - 1);
|
||||||
unsigned max2 =
|
unsigned max2 =
|
||||||
max == formula::unbounded() ? formula::unbounded() : (max - 1);
|
max == formula::unbounded() ? formula::unbounded() : (max - 1);
|
||||||
f = formula::bunop(o, f.nth(0), min2, max2);
|
f = formula::bunop(o, f[0], min2, max2);
|
||||||
|
|
||||||
// If we have something to append, we can actually append it
|
// If we have something to append, we can actually append it
|
||||||
// to f. This is correct even in the case of FStar, as f
|
// to f. This is correct even in the case of FStar, as f
|
||||||
|
|
@ -629,13 +629,13 @@ namespace spot
|
||||||
|
|
||||||
if (o == op::Star)
|
if (o == op::Star)
|
||||||
{
|
{
|
||||||
if (!bo.nth(0).accepts_eword())
|
if (!bo[0].accepts_eword())
|
||||||
{
|
{
|
||||||
// f*;g -> f;f*;g | g
|
// f*;g -> f;f*;g | g
|
||||||
//
|
//
|
||||||
// If f does not accept the empty word, we can easily
|
// If f does not accept the empty word, we can easily
|
||||||
// add "f*;g" as to_concat_ when translating f.
|
// add "f*;g" as to_concat_ when translating f.
|
||||||
bdd res = recurse(bo.nth(0), f);
|
bdd res = recurse(bo[0], f);
|
||||||
if (min == 0)
|
if (min == 0)
|
||||||
res |= now_to_concat();
|
res |= now_to_concat();
|
||||||
return res;
|
return res;
|
||||||
|
|
@ -651,7 +651,7 @@ namespace spot
|
||||||
// 1. translate f,
|
// 1. translate f,
|
||||||
// 2. append f*;g to all destinations
|
// 2. append f*;g to all destinations
|
||||||
// 3. add |g
|
// 3. add |g
|
||||||
bdd res = recurse(bo.nth(0));
|
bdd res = recurse(bo[0]);
|
||||||
// f*;g -> f;f*;g
|
// f*;g -> f;f*;g
|
||||||
minato_isop isop(res);
|
minato_isop isop(res);
|
||||||
bdd cube;
|
bdd cube;
|
||||||
|
|
@ -682,7 +682,7 @@ namespace spot
|
||||||
bdd tail_bdd;
|
bdd tail_bdd;
|
||||||
bool tail_computed = false;
|
bool tail_computed = false;
|
||||||
|
|
||||||
minato_isop isop(recurse(bo.nth(0)));
|
minato_isop isop(recurse(bo[0]));
|
||||||
bdd cube;
|
bdd cube;
|
||||||
bdd res = bddfalse;
|
bdd res = bddfalse;
|
||||||
if (min == 0)
|
if (min == 0)
|
||||||
|
|
@ -779,7 +779,7 @@ namespace spot
|
||||||
vec conj;
|
vec conj;
|
||||||
for (unsigned m = 0; m < s; ++m)
|
for (unsigned m = 0; m < s; ++m)
|
||||||
{
|
{
|
||||||
formula g = f.nth(m);
|
formula g = f[m];
|
||||||
if (n != m)
|
if (n != m)
|
||||||
g = formula::Concat({g, star});
|
g = formula::Concat({g, star});
|
||||||
conj.push_back(g);
|
conj.push_back(g);
|
||||||
|
|
@ -815,17 +815,17 @@ namespace spot
|
||||||
unsigned s = f.size();
|
unsigned s = f.size();
|
||||||
v.reserve(s);
|
v.reserve(s);
|
||||||
for (unsigned n = 1; n < s; ++n)
|
for (unsigned n = 1; n < s; ++n)
|
||||||
v.push_back(f.nth(n));
|
v.push_back(f[n]);
|
||||||
if (to_concat_)
|
if (to_concat_)
|
||||||
v.push_back(to_concat_);
|
v.push_back(to_concat_);
|
||||||
return recurse(f.nth(0), formula::Concat(std::move(v)));
|
return recurse(f[0], formula::Concat(std::move(v)));
|
||||||
}
|
}
|
||||||
case op::Fusion:
|
case op::Fusion:
|
||||||
{
|
{
|
||||||
assert(f.size() >= 2);
|
assert(f.size() >= 2);
|
||||||
|
|
||||||
// the head
|
// the head
|
||||||
bdd res = recurse(f.nth(0));
|
bdd res = recurse(f[0]);
|
||||||
|
|
||||||
// the tail
|
// the tail
|
||||||
formula tail = f.all_but(0);
|
formula tail = f.all_but(0);
|
||||||
|
|
@ -1129,7 +1129,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
// r(Fy) = r(y) + a(y)X(Fy) if not recurring
|
// r(Fy) = r(y) + a(y)X(Fy) if not recurring
|
||||||
// r(Fy) = r(y) + a(y) if recurring (see comment in G)
|
// r(Fy) = r(y) + a(y) if recurring (see comment in G)
|
||||||
formula child = node.nth(0);
|
formula child = node[0];
|
||||||
bdd y = recurse(child);
|
bdd y = recurse(child);
|
||||||
bdd a = bdd_ithvar(dict_.register_a_variable(child));
|
bdd a = bdd_ithvar(dict_.register_a_variable(child));
|
||||||
if (!recurring_)
|
if (!recurring_)
|
||||||
|
|
@ -1172,13 +1172,13 @@ namespace spot
|
||||||
|
|
||||||
// r(Gy) = r(y)X(Gy)
|
// r(Gy) = r(y)X(Gy)
|
||||||
int x = dict_.register_next_variable(node);
|
int x = dict_.register_next_variable(node);
|
||||||
bdd y = recurse(node.nth(0), /* recurring = */ true);
|
bdd y = recurse(node[0], /* recurring = */ true);
|
||||||
return y & bdd_ithvar(x);
|
return y & bdd_ithvar(x);
|
||||||
}
|
}
|
||||||
case op::Not:
|
case op::Not:
|
||||||
{
|
{
|
||||||
// r(!y) = !r(y)
|
// r(!y) = !r(y)
|
||||||
return bdd_not(recurse(node.nth(0)));
|
return bdd_not(recurse(node[0]));
|
||||||
}
|
}
|
||||||
case op::X:
|
case op::X:
|
||||||
{
|
{
|
||||||
|
|
@ -1201,7 +1201,7 @@ namespace spot
|
||||||
// effect is less clear. Benchmarks show that it
|
// effect is less clear. Benchmarks show that it
|
||||||
// reduces the number of states and transitions, but it
|
// reduces the number of states and transitions, but it
|
||||||
// increases the number of non-deterministic states...
|
// increases the number of non-deterministic states...
|
||||||
formula y = node.nth(0);
|
formula y = node[0];
|
||||||
bdd res;
|
bdd res;
|
||||||
if (y.is(op::And))
|
if (y.is(op::And))
|
||||||
{
|
{
|
||||||
|
|
@ -1226,7 +1226,7 @@ namespace spot
|
||||||
case op::Closure:
|
case op::Closure:
|
||||||
{
|
{
|
||||||
// rat_seen_ = true;
|
// rat_seen_ = true;
|
||||||
formula f = node.nth(0);
|
formula f = node[0];
|
||||||
auto p = dict_.transdfa.succ(f);
|
auto p = dict_.transdfa.succ(f);
|
||||||
bdd res = bddfalse;
|
bdd res = bddfalse;
|
||||||
auto aut = std::get<0>(p);
|
auto aut = std::get<0>(p);
|
||||||
|
|
@ -1267,7 +1267,7 @@ namespace spot
|
||||||
has_marked_ = true;
|
has_marked_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
formula f = node.nth(0);
|
formula f = node[0];
|
||||||
auto p = dict_.transdfa.succ(f);
|
auto p = dict_.transdfa.succ(f);
|
||||||
auto aut = std::get<0>(p);
|
auto aut = std::get<0>(p);
|
||||||
|
|
||||||
|
|
@ -1316,15 +1316,15 @@ namespace spot
|
||||||
SPOT_UNREACHABLE();
|
SPOT_UNREACHABLE();
|
||||||
case op::U:
|
case op::U:
|
||||||
{
|
{
|
||||||
bdd f1 = recurse(node.nth(0));
|
bdd f1 = recurse(node[0]);
|
||||||
bdd f2 = recurse(node.nth(1));
|
bdd f2 = recurse(node[1]);
|
||||||
// r(f1 U f2) = r(f2) + a(f2)r(f1)X(f1 U f2) if not recurring
|
// r(f1 U f2) = r(f2) + a(f2)r(f1)X(f1 U f2) if not recurring
|
||||||
// r(f1 U f2) = r(f2) + a(f2)r(f1) if recurring
|
// r(f1 U f2) = r(f2) + a(f2)r(f1) if recurring
|
||||||
f1 &= bdd_ithvar(dict_.register_a_variable(node.nth(1)));
|
f1 &= bdd_ithvar(dict_.register_a_variable(node[1]));
|
||||||
if (!recurring_)
|
if (!recurring_)
|
||||||
f1 &= bdd_ithvar(dict_.register_next_variable(node));
|
f1 &= bdd_ithvar(dict_.register_next_variable(node));
|
||||||
if (dict_.unambiguous)
|
if (dict_.unambiguous)
|
||||||
f1 &= neg_of(node.nth(1));
|
f1 &= neg_of(node[1]);
|
||||||
return f2 | f1;
|
return f2 | f1;
|
||||||
}
|
}
|
||||||
case op::W:
|
case op::W:
|
||||||
|
|
@ -1333,36 +1333,36 @@ namespace spot
|
||||||
// r(f1 W f2) = r(f2) + r(f1) if recurring
|
// r(f1 W f2) = r(f2) + r(f1) if recurring
|
||||||
//
|
//
|
||||||
// also f1 W 0 = G(f1), so we can enable recurring on f1
|
// also f1 W 0 = G(f1), so we can enable recurring on f1
|
||||||
bdd f1 = recurse(node.nth(0), node.nth(1).is_false());
|
bdd f1 = recurse(node[0], node[1].is_false());
|
||||||
bdd f2 = recurse(node.nth(1));
|
bdd f2 = recurse(node[1]);
|
||||||
if (!recurring_)
|
if (!recurring_)
|
||||||
f1 &= bdd_ithvar(dict_.register_next_variable(node));
|
f1 &= bdd_ithvar(dict_.register_next_variable(node));
|
||||||
if (dict_.unambiguous)
|
if (dict_.unambiguous)
|
||||||
f1 &= neg_of(node.nth(1));
|
f1 &= neg_of(node[1]);
|
||||||
return f2 | f1;
|
return f2 | f1;
|
||||||
}
|
}
|
||||||
case op::R:
|
case op::R:
|
||||||
{
|
{
|
||||||
// r(f2) is in factor, so we can propagate the recurring_ flag.
|
// r(f2) is in factor, so we can propagate the recurring_ flag.
|
||||||
// if f1=false, we can also turn it on (0 R f = Gf).
|
// if f1=false, we can also turn it on (0 R f = Gf).
|
||||||
bdd res = recurse(node.nth(1),
|
bdd res = recurse(node[1],
|
||||||
recurring_ || node.nth(0).is_false());
|
recurring_ || node[0].is_false());
|
||||||
// r(f1 R f2) = r(f2)(r(f1) + X(f1 R f2)) if not recurring
|
// r(f1 R f2) = r(f2)(r(f1) + X(f1 R f2)) if not recurring
|
||||||
// r(f1 R f2) = r(f2) if recurring
|
// r(f1 R f2) = r(f2) if recurring
|
||||||
if (recurring_ && !dict_.unambiguous)
|
if (recurring_ && !dict_.unambiguous)
|
||||||
return res;
|
return res;
|
||||||
bdd f1 = recurse(node.nth(0));
|
bdd f1 = recurse(node[0]);
|
||||||
bdd f2 = bddtrue;
|
bdd f2 = bddtrue;
|
||||||
if (!recurring_)
|
if (!recurring_)
|
||||||
f2 = bdd_ithvar(dict_.register_next_variable(node));
|
f2 = bdd_ithvar(dict_.register_next_variable(node));
|
||||||
if (dict_.unambiguous)
|
if (dict_.unambiguous)
|
||||||
f2 &= neg_of(node.nth(0));
|
f2 &= neg_of(node[0]);
|
||||||
return res & (f1 | f2);
|
return res & (f1 | f2);
|
||||||
}
|
}
|
||||||
case op::M:
|
case op::M:
|
||||||
{
|
{
|
||||||
bdd res = recurse(node.nth(1), recurring_);
|
bdd res = recurse(node[1], recurring_);
|
||||||
bdd f1 = recurse(node.nth(0));
|
bdd f1 = recurse(node[0]);
|
||||||
// r(f1 M f2) = r(f2)(r(f1) + a(f1&f2)X(f1 M f2)) if not recurring
|
// r(f1 M f2) = r(f2)(r(f1) + a(f1&f2)X(f1 M f2)) if not recurring
|
||||||
// r(f1 M f2) = r(f2)(r(f1) + a(f1&f2)) if recurring
|
// r(f1 M f2) = r(f2)(r(f1) + a(f1&f2)) if recurring
|
||||||
//
|
//
|
||||||
|
|
@ -1383,7 +1383,7 @@ namespace spot
|
||||||
if (!recurring_)
|
if (!recurring_)
|
||||||
a &= bdd_ithvar(dict_.register_next_variable(node));
|
a &= bdd_ithvar(dict_.register_next_variable(node));
|
||||||
if (dict_.unambiguous)
|
if (dict_.unambiguous)
|
||||||
a &= neg_of(node.nth(0));
|
a &= neg_of(node[0]);
|
||||||
return res & (f1 | a);
|
return res & (f1 | a);
|
||||||
}
|
}
|
||||||
case op::EConcatMarked:
|
case op::EConcatMarked:
|
||||||
|
|
@ -1394,8 +1394,8 @@ namespace spot
|
||||||
{
|
{
|
||||||
// Recognize f2 on transitions going to destinations
|
// Recognize f2 on transitions going to destinations
|
||||||
// that accept the empty word.
|
// that accept the empty word.
|
||||||
bdd f2 = recurse(node.nth(1));
|
bdd f2 = recurse(node[1]);
|
||||||
bdd f1 = translate_ratexp(node.nth(0), dict_);
|
bdd f1 = translate_ratexp(node[0], dict_);
|
||||||
bdd res = bddfalse;
|
bdd res = bddfalse;
|
||||||
|
|
||||||
if (mark_all_)
|
if (mark_all_)
|
||||||
|
|
@ -1417,7 +1417,7 @@ namespace spot
|
||||||
dict_.bdd_to_sere(bdd_exist(f1 & label,
|
dict_.bdd_to_sere(bdd_exist(f1 & label,
|
||||||
dict_.var_set));
|
dict_.var_set));
|
||||||
|
|
||||||
formula dest2 = formula::binop(o, dest, node.nth(1));
|
formula dest2 = formula::binop(o, dest, node[1]);
|
||||||
bool unamb = dict_.unambiguous;
|
bool unamb = dict_.unambiguous;
|
||||||
if (!dest2.is(op::False))
|
if (!dest2.is(op::False))
|
||||||
{
|
{
|
||||||
|
|
@ -1426,13 +1426,13 @@ namespace spot
|
||||||
// deterministic automaton at no additional
|
// deterministic automaton at no additional
|
||||||
// cost. You can test this on
|
// cost. You can test this on
|
||||||
// G({{1;1}*}<>->a)
|
// G({{1;1}*}<>->a)
|
||||||
if (node.nth(1).is_boolean())
|
if (node[1].is_boolean())
|
||||||
unamb = true;
|
unamb = true;
|
||||||
|
|
||||||
bdd toadd = label &
|
bdd toadd = label &
|
||||||
bdd_ithvar(dict_.register_next_variable(dest2));
|
bdd_ithvar(dict_.register_next_variable(dest2));
|
||||||
if (dest.accepts_eword() && unamb)
|
if (dest.accepts_eword() && unamb)
|
||||||
toadd &= neg_of(node.nth(1));
|
toadd &= neg_of(node[1]);
|
||||||
res |= toadd;
|
res |= toadd;
|
||||||
}
|
}
|
||||||
if (dest.accepts_eword())
|
if (dest.accepts_eword())
|
||||||
|
|
@ -1462,7 +1462,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
formula dest2 = formula::binop(o, dest, node.nth(1));
|
formula dest2 = formula::binop(o, dest, node[1]);
|
||||||
if (!dest2.is(op::False))
|
if (!dest2.is(op::False))
|
||||||
res |= label &
|
res |= label &
|
||||||
bdd_ithvar(dict_.register_next_variable(dest2));
|
bdd_ithvar(dict_.register_next_variable(dest2));
|
||||||
|
|
@ -1483,8 +1483,8 @@ namespace spot
|
||||||
// interpretation of first() as a universal automaton,
|
// interpretation of first() as a universal automaton,
|
||||||
// and using implication to encode it) was explained
|
// and using implication to encode it) was explained
|
||||||
// to me (adl) by Felix Klaedtke.
|
// to me (adl) by Felix Klaedtke.
|
||||||
bdd f2 = recurse(node.nth(1));
|
bdd f2 = recurse(node[1]);
|
||||||
bdd f1 = translate_ratexp(node.nth(0), dict_);
|
bdd f1 = translate_ratexp(node[0], dict_);
|
||||||
|
|
||||||
if (exprop_)
|
if (exprop_)
|
||||||
{
|
{
|
||||||
|
|
@ -1500,7 +1500,7 @@ namespace spot
|
||||||
formula dest =
|
formula dest =
|
||||||
dict_.bdd_to_sere(bdd_exist(f1 & label, dict_.var_set));
|
dict_.bdd_to_sere(bdd_exist(f1 & label, dict_.var_set));
|
||||||
|
|
||||||
formula dest2 = formula::binop(o, dest, node.nth(1));
|
formula dest2 = formula::binop(o, dest, node[1]);
|
||||||
|
|
||||||
bdd udest =
|
bdd udest =
|
||||||
bdd_ithvar(dict_.register_next_variable(dest2));
|
bdd_ithvar(dict_.register_next_variable(dest2));
|
||||||
|
|
@ -1526,7 +1526,7 @@ namespace spot
|
||||||
bdd label = bdd_exist(cube, dict_.next_set);
|
bdd label = bdd_exist(cube, dict_.next_set);
|
||||||
bdd dest_bdd = bdd_existcomp(cube, dict_.next_set);
|
bdd dest_bdd = bdd_existcomp(cube, dict_.next_set);
|
||||||
formula dest = dict_.conj_bdd_to_sere(dest_bdd);
|
formula dest = dict_.conj_bdd_to_sere(dest_bdd);
|
||||||
formula dest2 = formula::binop(o, dest, node.nth(1));
|
formula dest2 = formula::binop(o, dest, node[1]);
|
||||||
|
|
||||||
bdd udest =
|
bdd udest =
|
||||||
bdd_ithvar(dict_.register_next_variable(dest2));
|
bdd_ithvar(dict_.register_next_variable(dest2));
|
||||||
|
|
@ -1930,10 +1930,10 @@ namespace spot
|
||||||
{
|
{
|
||||||
if (f.is(op::F))
|
if (f.is(op::F))
|
||||||
all_promises &=
|
all_promises &=
|
||||||
bdd_ithvar(d.register_a_variable(f.nth(0)));
|
bdd_ithvar(d.register_a_variable(f[0]));
|
||||||
else if (f.is(op::U))
|
else if (f.is(op::U))
|
||||||
all_promises &=
|
all_promises &=
|
||||||
bdd_ithvar(d.register_a_variable(f.nth(1)));
|
bdd_ithvar(d.register_a_variable(f[1]));
|
||||||
else if (f.is(op::M))
|
else if (f.is(op::M))
|
||||||
all_promises &=
|
all_promises &=
|
||||||
bdd_ithvar(d.register_a_variable(f));
|
bdd_ithvar(d.register_a_variable(f));
|
||||||
|
|
|
||||||
|
|
@ -310,7 +310,7 @@ namespace std {
|
||||||
int __cmp__(spot::ltl::formula b) { return self->id() - b.id(); }
|
int __cmp__(spot::ltl::formula b) { return self->id() - b.id(); }
|
||||||
size_t __hash__() { return self->id(); }
|
size_t __hash__() { return self->id(); }
|
||||||
unsigned __len__() { return self->size(); }
|
unsigned __len__() { return self->size(); }
|
||||||
formula __getitem__(unsigned pos) { return self->nth(pos); }
|
formula __getitem__(unsigned pos) { return (*self)[pos]; }
|
||||||
|
|
||||||
std::string __repr__() { return spot::ltl::str_psl(*self); }
|
std::string __repr__() { return spot::ltl::str_psl(*self); }
|
||||||
std::string _repr_latex_()
|
std::string _repr_latex_()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue