* src/ltlvisit/basereduc.cc (spot): 80 columns.
* src/ltlvisit/reducform.cc (spot), src/ltltest/inf.cc, src/ltltest/reduc.cc (main), src/ltlvisit/reducform.hh, src/tgbatest/ltl2tgba.cc (main): More option. * src/ltltest/inf.test: More test.
This commit is contained in:
parent
41589e2818
commit
788ed772c2
8 changed files with 458 additions and 349 deletions
|
|
@ -70,6 +70,9 @@ namespace spot
|
|||
{
|
||||
formula* f = uo->child();
|
||||
result_ = basic_reduce_form(f);
|
||||
multop* mo = NULL;
|
||||
unop* u = NULL;
|
||||
binop* bo = NULL;
|
||||
switch (uo->op())
|
||||
{
|
||||
case unop::Not:
|
||||
|
|
@ -87,30 +90,31 @@ namespace spot
|
|||
|
||||
/* X(f1 & GF(f2)) = X(f1) & GF(F2) */
|
||||
/* X(f1 | GF(f2)) = X(f1) | GF(F2) */
|
||||
if (node_type(result_) == (node_type_form_visitor::Multop)) {
|
||||
if (dynamic_cast<multop*>(result_)->size() == 2) {
|
||||
if (is_GF(dynamic_cast<multop*>(result_)->nth(0))) {
|
||||
//|| is_FG(dynamic_cast<multop*>(result_)->nth(0))) {
|
||||
mo = dynamic_cast<multop*>(result_);
|
||||
if (mo && mo->size() == 2)
|
||||
{
|
||||
if (is_GF(mo->nth(0)))
|
||||
{
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F, basic_reduce_form(dynamic_cast<multop*>(result_)->nth(1))));
|
||||
res->push_back(basic_reduce_form(dynamic_cast<multop*>(result_)->nth(0)));
|
||||
f = result_;
|
||||
result_ = multop::instance(dynamic_cast<multop*>(result_)->op(), res);
|
||||
spot::ltl::destroy(f);
|
||||
res->push_back(unop::instance(unop::F,
|
||||
basic_reduce_form(mo->nth(1))));
|
||||
res->push_back(basic_reduce_form(mo->nth(0)));
|
||||
result_ = multop::instance(mo->op(), res);
|
||||
spot::ltl::destroy(mo);
|
||||
return;
|
||||
}
|
||||
if (is_GF(dynamic_cast<multop*>(result_)->nth(1))) {
|
||||
//|| is_FG(dynamic_cast<multop*>(result_)->nth(1))) {
|
||||
if (is_GF(mo->nth(1)))
|
||||
{
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F, basic_reduce_form(dynamic_cast<multop*>(result_)->nth(0))));
|
||||
res->push_back(basic_reduce_form(dynamic_cast<multop*>(result_)->nth(1)));
|
||||
f = result_;
|
||||
result_ = multop::instance(dynamic_cast<multop*>(result_)->op(), res);
|
||||
spot::ltl::destroy(f);
|
||||
res->push_back(unop::instance(unop::F,
|
||||
basic_reduce_form(mo->nth(0))));
|
||||
res->push_back(basic_reduce_form(mo->nth(1)));
|
||||
result_ = multop::instance(mo->op(), res);
|
||||
spot::ltl::destroy(mo);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
result_ = unop::instance(unop::X, result_);
|
||||
return;
|
||||
|
|
@ -123,41 +127,46 @@ namespace spot
|
|||
return;
|
||||
|
||||
/* FX(a) = XF(a) */
|
||||
if (node_type(result_) == (node_type_form_visitor::Unop))
|
||||
if (dynamic_cast<unop*>(result_)->op() == unop::X){
|
||||
f = result_;
|
||||
result_ = unop::instance(unop::X,
|
||||
unop::instance(unop::F,
|
||||
basic_reduce_form(dynamic_cast<unop*>(result_)->child()) ));
|
||||
spot::ltl::destroy(f);
|
||||
return;
|
||||
}
|
||||
u = dynamic_cast<unop*>(result_);
|
||||
if (u && u->op() == unop::X)
|
||||
{
|
||||
result_ =
|
||||
unop::instance(unop::X,
|
||||
unop::instance(unop::F,
|
||||
basic_reduce_form(u->child())));
|
||||
spot::ltl::destroy(u);
|
||||
return;
|
||||
}
|
||||
|
||||
/* F(f1 & GF(f2)) = F(f1) & GF(F2) */
|
||||
if (node_type(result_) == (node_type_form_visitor::Multop)) {
|
||||
if (dynamic_cast<multop*>(result_)->op() == multop::And) {
|
||||
if (dynamic_cast<multop*>(result_)->size() == 2) {
|
||||
if (is_GF(dynamic_cast<multop*>(result_)->nth(0))) {
|
||||
//|| is_FG(dynamic_cast<multop*>(result_)->nth(0))) {
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F, basic_reduce_form(dynamic_cast<multop*>(result_)->nth(1))));
|
||||
res->push_back(basic_reduce_form(dynamic_cast<multop*>(result_)->nth(0)));
|
||||
spot::ltl::destroy(result_);
|
||||
result_ = multop::instance(multop::And, res);
|
||||
return;
|
||||
mo = dynamic_cast<multop*>(result_);
|
||||
if (mo && mo->op() == multop::And)
|
||||
{
|
||||
if (mo->size() == 2)
|
||||
{
|
||||
if (is_GF(mo->nth(0)))
|
||||
{
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F,
|
||||
basic_reduce_form(mo->nth(1))));
|
||||
res->push_back(basic_reduce_form(mo->nth(0)));
|
||||
result_ = multop::instance(mo->op(), res);
|
||||
spot::ltl::destroy(mo);
|
||||
return;
|
||||
}
|
||||
if (is_GF(mo->nth(1)))
|
||||
{
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F,
|
||||
basic_reduce_form(mo->nth(0))));
|
||||
res->push_back(basic_reduce_form(mo->nth(1)));
|
||||
result_ = multop::instance(mo->op(), res);
|
||||
spot::ltl::destroy(mo);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (is_GF(dynamic_cast<multop*>(result_)->nth(1))) {
|
||||
//|| is_FG(dynamic_cast<multop*>(result_)->nth(1))) {
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F, basic_reduce_form(dynamic_cast<multop*>(result_)->nth(0))));
|
||||
res->push_back(basic_reduce_form(dynamic_cast<multop*>(result_)->nth(1)));
|
||||
spot::ltl::destroy(result_);
|
||||
result_ = multop::instance(multop::And, res);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
result_ = unop::instance(unop::F, result_);
|
||||
return;
|
||||
|
|
@ -170,50 +179,56 @@ namespace spot
|
|||
return;
|
||||
|
||||
/* G(a R b) = G(b) */
|
||||
if (node_type(result_) == node_type_form_visitor::Binop)
|
||||
if (dynamic_cast<binop*>(result_)->op() == binop::R){
|
||||
f = result_;
|
||||
result_ = unop::instance(unop::G, basic_reduce_form(dynamic_cast<binop*>(result_)->second()));
|
||||
spot::ltl::destroy(f);
|
||||
bo = dynamic_cast<binop*>(result_);
|
||||
if (bo && bo->op() == binop::R)
|
||||
{
|
||||
result_ = unop::instance(unop::G,
|
||||
basic_reduce_form(bo->second()));
|
||||
spot::ltl::destroy(bo);
|
||||
return;
|
||||
}
|
||||
|
||||
/* GX(a) = XG(a) */
|
||||
if (node_type(result_) == (node_type_form_visitor::Unop))
|
||||
if ( dynamic_cast<unop*>(result_)->op() == unop::X ){
|
||||
f = result_;
|
||||
result_ = unop::instance(unop::X,
|
||||
unop::instance(unop::G,
|
||||
basic_reduce_form(dynamic_cast<unop*>(result_)->child())));
|
||||
spot::ltl::destroy(f);
|
||||
u = dynamic_cast<unop*>(result_);
|
||||
if (u && u->op() == unop::X)
|
||||
{
|
||||
result_ =
|
||||
unop::instance(unop::X,
|
||||
unop::instance(unop::G,
|
||||
basic_reduce_form(u->child())));
|
||||
spot::ltl::destroy(u);
|
||||
return;
|
||||
}
|
||||
|
||||
/* G(f1 | GF(f2)) = G(f1) | GF(F2) */
|
||||
if (node_type(result_) == (node_type_form_visitor::Multop)) {
|
||||
if (dynamic_cast<multop*>(f)->op() == multop::Or) {
|
||||
if (dynamic_cast<multop*>(result_)->size() == 2) {
|
||||
if (is_GF(dynamic_cast<multop*>(result_)->nth(0))) {
|
||||
//|| is_FG(dynamic_cast<multop*>(result_)->nth(0))) {
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::G, basic_reduce_form(dynamic_cast<multop*>(result_)->nth(1))));
|
||||
res->push_back(basic_reduce_form(dynamic_cast<multop*>(result_)->nth(0)));
|
||||
spot::ltl::destroy(result_);
|
||||
result_ = multop::instance(multop::Or, res);
|
||||
return;
|
||||
mo = dynamic_cast<multop*>(result_);
|
||||
if (mo && mo->op() == multop::Or)
|
||||
{
|
||||
if (mo->size() == 2)
|
||||
{
|
||||
if (is_GF(mo->nth(0)))
|
||||
{
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F,
|
||||
basic_reduce_form(mo->nth(1))));
|
||||
res->push_back(basic_reduce_form(mo->nth(0)));
|
||||
result_ = multop::instance(mo->op(), res);
|
||||
spot::ltl::destroy(mo);
|
||||
return;
|
||||
}
|
||||
if (is_GF(mo->nth(1)))
|
||||
{
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::F,
|
||||
basic_reduce_form(mo->nth(0))));
|
||||
res->push_back(basic_reduce_form(mo->nth(1)));
|
||||
result_ = multop::instance(mo->op(), res);
|
||||
spot::ltl::destroy(mo);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (is_GF(dynamic_cast<multop*>(result_)->nth(1))) {
|
||||
//|| is_FG(dynamic_cast<multop*>(result_)->nth(1))) {
|
||||
multop::vec* res = new multop::vec;
|
||||
res->push_back(unop::instance(unop::G, basic_reduce_form(dynamic_cast<multop*>(result_)->nth(0))));
|
||||
res->push_back(basic_reduce_form(dynamic_cast<multop*>(result_)->nth(1)));
|
||||
spot::ltl::destroy(result_);
|
||||
result_ = multop::instance(multop::Or, res);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
result_ = unop::instance(unop::G, result_);
|
||||
return;
|
||||
|
|
@ -230,6 +245,8 @@ namespace spot
|
|||
formula* ftmp = NULL;
|
||||
node_type_form_visitor v1;
|
||||
node_type_form_visitor v2;
|
||||
unop* fu1 = NULL;
|
||||
unop* fu2 = NULL;
|
||||
switch (bo->op())
|
||||
{
|
||||
case binop::Xor:
|
||||
|
|
@ -252,28 +269,31 @@ namespace spot
|
|||
|
||||
/* a U false = false
|
||||
a U true = true */
|
||||
if (node_type(f2) == (node_type_form_visitor::Const)) {
|
||||
result_ = f2;
|
||||
return;
|
||||
}
|
||||
if (node_type(f2) == (node_type_form_visitor::Const))
|
||||
{
|
||||
result_ = f2;
|
||||
return;
|
||||
}
|
||||
|
||||
f1 = basic_reduce_form(f1);
|
||||
|
||||
/* X(a) U X(b) = X(a U b) */
|
||||
if ( node_type(f1) == (node_type_form_visitor::Unop)
|
||||
&& node_type(f2) == (node_type_form_visitor::Unop)) {
|
||||
if ((dynamic_cast<unop*>(f1)->op() == unop::X)
|
||||
&& (dynamic_cast<unop*>(f2)->op() == unop::X)) {
|
||||
fu1 = dynamic_cast<unop*>(f1);
|
||||
fu2 = dynamic_cast<unop*>(f2);
|
||||
if ((fu1 && fu2) &&
|
||||
(fu1->op() == unop::X) &&
|
||||
(fu2->op() == unop::X))
|
||||
{
|
||||
ftmp = binop::instance(binop::U,
|
||||
basic_reduce_form(dynamic_cast<unop*>(f1)->child()),
|
||||
basic_reduce_form(dynamic_cast<unop*>(f2)->child()));
|
||||
basic_reduce_form(fu1->child()),
|
||||
basic_reduce_form(fu2->child()));
|
||||
result_ = unop::instance(unop::X, basic_reduce_form(ftmp));
|
||||
spot::ltl::destroy(f1);
|
||||
spot::ltl::destroy(f2);
|
||||
spot::ltl::destroy(ftmp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
result_ = binop::instance(binop::U, f1, f2);
|
||||
return;
|
||||
|
||||
|
|
@ -282,28 +302,31 @@ namespace spot
|
|||
|
||||
/* a R false = false
|
||||
a R true = true */
|
||||
if (node_type(f2) == (node_type_form_visitor::Const)) {
|
||||
result_ = f2;
|
||||
return;
|
||||
}
|
||||
if (node_type(f2) == (node_type_form_visitor::Const))
|
||||
{
|
||||
result_ = f2;
|
||||
return;
|
||||
}
|
||||
|
||||
f1 = basic_reduce_form(f1);
|
||||
|
||||
/* X(a) R X(b) = X(a R b) */
|
||||
if (node_type(f1) == (node_type_form_visitor::Unop)
|
||||
&& node_type(f2) == (node_type_form_visitor::Unop)) {
|
||||
if ((dynamic_cast<unop*>(f1)->op() == unop::X)
|
||||
&& (dynamic_cast<unop*>(f2)->op() == unop::X)) {
|
||||
fu1 = dynamic_cast<unop*>(f1);
|
||||
fu2 = dynamic_cast<unop*>(f2);
|
||||
if ((fu1 && fu2) &&
|
||||
(fu1->op() == unop::X) &&
|
||||
(fu2->op() == unop::X))
|
||||
{
|
||||
ftmp = binop::instance(bo->op(),
|
||||
basic_reduce_form(dynamic_cast<unop*>(f1)->child()),
|
||||
basic_reduce_form(dynamic_cast<unop*>(f2)->child()));
|
||||
basic_reduce_form(fu1->child()),
|
||||
basic_reduce_form(fu2->child()));
|
||||
result_ = unop::instance(unop::X, basic_reduce_form(ftmp));
|
||||
spot::ltl::destroy(f1);
|
||||
spot::ltl::destroy(f2);
|
||||
spot::ltl::destroy(ftmp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
result_ = binop::instance(bo->op(),
|
||||
f1, f2);
|
||||
return;
|
||||
|
|
@ -330,6 +353,9 @@ namespace spot
|
|||
|
||||
multop::vec* tmpOther = new multop::vec;
|
||||
|
||||
unop* uo = NULL;
|
||||
unop* uo2 = NULL;
|
||||
binop* bo = NULL;
|
||||
formula* ftmp = NULL;
|
||||
|
||||
for (unsigned i = 0; i < mos; ++i)
|
||||
|
|
@ -340,96 +366,107 @@ namespace spot
|
|||
{
|
||||
case multop::And:
|
||||
|
||||
for (multop::vec::iterator i = res->begin(); i != res->end(); i++) {
|
||||
if (*i == NULL) continue;
|
||||
switch (node_type(*i)) {
|
||||
for (multop::vec::iterator i = res->begin(); i != res->end(); i++)
|
||||
{
|
||||
if (*i == NULL)
|
||||
continue;
|
||||
switch (node_type(*i))
|
||||
{
|
||||
|
||||
case node_type_form_visitor::Unop:
|
||||
case node_type_form_visitor::Unop:
|
||||
|
||||
/* Xa & Xb = X(a & b)*/
|
||||
if (dynamic_cast<unop*>(*i)->op() == unop::X) {
|
||||
tmpX->push_back(spot::ltl::basic_reduce_form(dynamic_cast<unop*>(*i)->child()));
|
||||
break;
|
||||
}
|
||||
/* Xa & Xb = X(a & b)*/
|
||||
uo = dynamic_cast<unop*>(*i);
|
||||
if (uo && uo->op() == unop::X)
|
||||
{
|
||||
tmpX->push_back(basic_reduce_form(uo->child()));
|
||||
break;
|
||||
}
|
||||
|
||||
/* FG(a) & FG(b) = FG(a & b)*/
|
||||
if (is_FG(*i)) {
|
||||
tmpFG->push_back(spot::ltl::basic_reduce_form(dynamic_cast<unop*>(dynamic_cast<unop*>(*i)->child())->child()));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(spot::ltl::basic_reduce_form(*i));
|
||||
break;
|
||||
/* A GERER !!!!!!!!!!!!!!!!!!!!!!!
|
||||
case node_type_form_visitor::Const:
|
||||
tmpX->push_back( spot::ltl::clone((*i)) );
|
||||
break;
|
||||
*/
|
||||
/* FG(a) & FG(b) = FG(a & b)*/
|
||||
if (is_FG(*i))
|
||||
{
|
||||
uo2 = dynamic_cast<unop*>(uo->child());
|
||||
tmpFG->push_back(basic_reduce_form(uo2->child()));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(basic_reduce_form(*i));
|
||||
break;
|
||||
|
||||
case node_type_form_visitor::Binop:
|
||||
case node_type_form_visitor::Binop:
|
||||
|
||||
/* (a U b) & (c U b) = (a & c) U b */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::U) {
|
||||
ftmp = dynamic_cast<binop*>(*i)->second();
|
||||
tmpUright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if (node_type(*j) == node_type_form_visitor::Binop)
|
||||
{
|
||||
if (dynamic_cast<binop*>(*j)->op() == binop::U)
|
||||
{
|
||||
if (ftmp == dynamic_cast<binop*>(*j)->second())
|
||||
{
|
||||
tmpUright->push_back(spot::ltl::basic_reduce_form(dynamic_cast<binop*>(*j)->first() ));
|
||||
if (j != i) {
|
||||
/* (a U b) & (c U b) = (a & c) U b */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::U)
|
||||
{
|
||||
ftmp = dynamic_cast<binop*>(*i)->second();
|
||||
tmpUright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if ((node_type(*j) == node_type_form_visitor::Binop)
|
||||
&&
|
||||
(dynamic_cast<binop*>(*j)->op() == binop::U) &&
|
||||
(ftmp == dynamic_cast<binop*>(*j)->second()))
|
||||
{
|
||||
bo = dynamic_cast<binop*>(*j);
|
||||
tmpUright
|
||||
->push_back(basic_reduce_form(bo->first()));
|
||||
if (j != i)
|
||||
{
|
||||
destroy(*j);
|
||||
*j = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
tmpU
|
||||
->push_back(binop::instance(binop::U,
|
||||
multop::
|
||||
instance(multop::
|
||||
And,
|
||||
tmpUright),
|
||||
basic_reduce_form(ftmp)));
|
||||
break;
|
||||
}
|
||||
|
||||
/* (a R b) & (a R c) = a R (b & c) */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::R)
|
||||
{
|
||||
ftmp = dynamic_cast<binop*>(*i)->first();
|
||||
tmpRright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if ((node_type(*j) == node_type_form_visitor::Binop)
|
||||
&&
|
||||
(dynamic_cast<binop*>(*j)->op() == binop::R) &&
|
||||
(ftmp == dynamic_cast<binop*>(*j)->first()))
|
||||
{
|
||||
bo = dynamic_cast<binop*>(*j);
|
||||
tmpRright
|
||||
->push_back(basic_reduce_form(bo->second()));
|
||||
if (j != i)
|
||||
{
|
||||
spot::ltl::destroy(*j);
|
||||
*j = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tmpU->push_back(binop::instance(binop::U,
|
||||
multop::instance(multop::And,tmpUright),
|
||||
basic_reduce_form(ftmp)));
|
||||
break;
|
||||
}
|
||||
|
||||
/* (a R b) & (a R c) = a R (b & c) */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::R) {
|
||||
ftmp = dynamic_cast<binop*>(*i)->first();
|
||||
tmpRright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if (node_type(*j) == node_type_form_visitor::Binop)
|
||||
{
|
||||
if (dynamic_cast<binop*>(*j)->op() == binop::R)
|
||||
{
|
||||
if (ftmp == dynamic_cast<binop*>(*j)->first())
|
||||
{
|
||||
tmpRright->push_back(spot::ltl::basic_reduce_form(dynamic_cast<binop*>(*j)->second() ));
|
||||
if (j != i) {
|
||||
spot::ltl::destroy(*j);
|
||||
*j = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tmpR->push_back(binop::instance(binop::R,
|
||||
basic_reduce_form(ftmp),
|
||||
multop::instance(multop::And,tmpRright)));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(spot::ltl::basic_reduce_form(*i));
|
||||
break;
|
||||
default:
|
||||
tmpOther->push_back(spot::ltl::basic_reduce_form(*i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
tmpR
|
||||
->push_back(binop::instance(binop::R,
|
||||
basic_reduce_form(ftmp),
|
||||
multop::
|
||||
instance(multop::And,
|
||||
tmpRright)));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(basic_reduce_form(*i));
|
||||
break;
|
||||
default:
|
||||
tmpOther->push_back(basic_reduce_form(*i));
|
||||
break;
|
||||
}
|
||||
spot::ltl::destroy(*i);
|
||||
}
|
||||
spot::ltl::destroy(*i);
|
||||
}
|
||||
|
||||
delete(tmpGF);
|
||||
tmpGF = NULL;
|
||||
|
|
@ -438,91 +475,104 @@ namespace spot
|
|||
|
||||
case multop::Or:
|
||||
|
||||
for (multop::vec::iterator i = res->begin(); i != res->end(); i++) {
|
||||
if (*i == NULL) continue;
|
||||
switch (node_type(*i)) {
|
||||
for (multop::vec::iterator i = res->begin(); i != res->end(); i++)
|
||||
{
|
||||
if (*i == NULL) continue;
|
||||
switch (node_type(*i))
|
||||
{
|
||||
|
||||
case node_type_form_visitor::Unop:
|
||||
case node_type_form_visitor::Unop:
|
||||
|
||||
/* Xa | Xb = X(a | b)*/
|
||||
if (dynamic_cast<unop*>(*i)->op() == unop::X) {
|
||||
tmpX->push_back(spot::ltl::basic_reduce_form(dynamic_cast<unop*>(*i)->child()));
|
||||
break;
|
||||
}
|
||||
/* Xa | Xb = X(a | b)*/
|
||||
uo = dynamic_cast<unop*>(*i);
|
||||
if (uo && uo->op() == unop::X)
|
||||
{
|
||||
tmpX->push_back(basic_reduce_form(uo->child()));
|
||||
break;
|
||||
}
|
||||
|
||||
/* GF(a) | GF(b) = GF(a | b)*/
|
||||
if (is_GF(*i)) {
|
||||
tmpGF->push_back(spot::ltl::basic_reduce_form(dynamic_cast<unop*>(dynamic_cast<unop*>(*i)->child())->child()));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(spot::ltl::basic_reduce_form(*i));
|
||||
break;
|
||||
/* GF(a) | GF(b) = GF(a | b)*/
|
||||
if (is_GF(*i))
|
||||
{
|
||||
uo2 = dynamic_cast<unop*>(uo->child());
|
||||
tmpGF->push_back(basic_reduce_form(uo2->child()));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(basic_reduce_form(*i));
|
||||
break;
|
||||
|
||||
case node_type_form_visitor::Binop:
|
||||
case node_type_form_visitor::Binop:
|
||||
|
||||
/* (a U b) | (a U c) = a U (b | c) */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::U) {
|
||||
ftmp = dynamic_cast<binop*>(*i)->first();
|
||||
tmpUright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if (node_type(*j) == node_type_form_visitor::Binop)
|
||||
{
|
||||
if (dynamic_cast<binop*>(*j)->op() == binop::U)
|
||||
{
|
||||
if (ftmp == dynamic_cast<binop*>(*j)->first())
|
||||
{
|
||||
tmpUright->push_back(spot::ltl::basic_reduce_form(dynamic_cast<binop*>(*j)->second()));
|
||||
if (j != i) {
|
||||
spot::ltl::destroy(*j);
|
||||
/* (a U b) | (a U c) = a U (b | c) */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::U)
|
||||
{
|
||||
ftmp = dynamic_cast<binop*>(*i)->first();
|
||||
tmpUright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if ((node_type(*j) == node_type_form_visitor::Binop)
|
||||
&&
|
||||
(dynamic_cast<binop*>(*j)->op() == binop::U) &&
|
||||
(ftmp == dynamic_cast<binop*>(*j)->first()))
|
||||
{
|
||||
bo = dynamic_cast<binop*>(*j);
|
||||
tmpUright
|
||||
->push_back(basic_reduce_form(bo->second()));
|
||||
if (j != i)
|
||||
{
|
||||
destroy(*j);
|
||||
*j = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tmpU->push_back(binop::instance(binop::U,
|
||||
basic_reduce_form(ftmp),
|
||||
multop::instance(multop::Or,tmpUright)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
tmpU->push_back(binop::instance(binop::U,
|
||||
basic_reduce_form(ftmp),
|
||||
multop::
|
||||
instance(multop::Or,
|
||||
tmpUright)));
|
||||
break;
|
||||
}
|
||||
|
||||
/* (a R b) | (c R b) = (a | c) R b */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::R) {
|
||||
ftmp = dynamic_cast<binop*>(*i)->second();
|
||||
tmpRright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if (node_type(*j) == node_type_form_visitor::Binop)
|
||||
{
|
||||
if (dynamic_cast<binop*>(*j)->op() == binop::R)
|
||||
{
|
||||
if (ftmp == dynamic_cast<binop*>(*j)->second())
|
||||
{
|
||||
tmpRright->push_back(spot::ltl::basic_reduce_form(dynamic_cast<binop*>(*j)->first()));
|
||||
if (j != i) {
|
||||
spot::ltl::destroy(*j);
|
||||
/* (a R b) | (c R b) = (a | c) R b */
|
||||
if (dynamic_cast<binop*>(*i)->op() == binop::R)
|
||||
{
|
||||
ftmp = dynamic_cast<binop*>(*i)->second();
|
||||
tmpRright = new multop::vec;
|
||||
for (multop::vec::iterator j = i; j != res->end(); j++)
|
||||
{
|
||||
if (*j == NULL) continue;
|
||||
if ((node_type(*j) == node_type_form_visitor::Binop)
|
||||
&&
|
||||
(dynamic_cast<binop*>(*j)->op() == binop::R) &&
|
||||
(ftmp == dynamic_cast<binop*>(*j)->second()))
|
||||
{
|
||||
bo = dynamic_cast<binop*>(*j);
|
||||
tmpRright
|
||||
->push_back(basic_reduce_form(bo->first()));
|
||||
if (j != i)
|
||||
{
|
||||
destroy(*j);
|
||||
*j = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tmpR->push_back(binop::instance(binop::R,
|
||||
multop::instance(multop::Or,tmpRright),
|
||||
basic_reduce_form(ftmp)));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(spot::ltl::basic_reduce_form(*i));
|
||||
break;
|
||||
default:
|
||||
tmpOther->push_back(spot::ltl::basic_reduce_form(*i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
tmpR
|
||||
->push_back(binop::instance(binop::R,
|
||||
multop::
|
||||
instance(multop::Or,
|
||||
tmpRright),
|
||||
basic_reduce_form(ftmp)));
|
||||
break;
|
||||
}
|
||||
tmpOther->push_back(basic_reduce_form(*i));
|
||||
break;
|
||||
default:
|
||||
tmpOther->push_back(basic_reduce_form(*i));
|
||||
break;
|
||||
}
|
||||
spot::ltl::destroy(*i);
|
||||
}
|
||||
spot::ltl::destroy(*i);
|
||||
}
|
||||
|
||||
delete(tmpFG);
|
||||
tmpFG = NULL;
|
||||
|
|
@ -535,27 +585,37 @@ namespace spot
|
|||
delete(res);
|
||||
|
||||
if (tmpX->size())
|
||||
tmpOther->push_back(unop::instance(unop::X,multop::instance(mo->op(),tmpX)));
|
||||
tmpOther->push_back(unop::instance(unop::X,
|
||||
multop::instance(mo->op(),
|
||||
tmpX)));
|
||||
else delete(tmpX);
|
||||
|
||||
if (tmpU->size())
|
||||
tmpOther->push_back(multop::instance(mo->op(),tmpU));
|
||||
tmpOther->push_back(multop::instance(mo->op(), tmpU));
|
||||
else delete(tmpU);
|
||||
|
||||
if (tmpR->size())
|
||||
tmpOther->push_back(multop::instance(mo->op(),tmpR));
|
||||
tmpOther->push_back(multop::instance(mo->op(), tmpR));
|
||||
else delete(tmpR);
|
||||
|
||||
if (tmpGF != NULL)
|
||||
if (tmpGF->size())
|
||||
tmpOther->push_back(unop::instance(unop::G,
|
||||
unop::instance(unop::F,
|
||||
multop::instance(mo->op(),tmpGF))));
|
||||
if (tmpFG != NULL)
|
||||
if (tmpFG->size())
|
||||
tmpOther->push_back(unop::instance(unop::F,
|
||||
unop::instance(unop::G,
|
||||
multop::instance(mo->op(),tmpFG))));
|
||||
if ((tmpGF != NULL) &&
|
||||
(tmpGF->size()))
|
||||
{
|
||||
ftmp = unop::instance(unop::G,
|
||||
unop::instance(unop::F,
|
||||
multop::instance(mo->op(),
|
||||
tmpGF)));
|
||||
tmpOther->push_back(ftmp);
|
||||
}
|
||||
if ((tmpFG != NULL) &&
|
||||
(tmpFG->size()))
|
||||
{
|
||||
ftmp = unop::instance(unop::F,
|
||||
unop::instance(unop::G,
|
||||
multop::instance(mo->op(),
|
||||
tmpFG)));
|
||||
tmpOther->push_back(ftmp);
|
||||
}
|
||||
|
||||
result_ = multop::instance(op, tmpOther);
|
||||
|
||||
|
|
|
|||
|
|
@ -91,13 +91,13 @@ namespace spot
|
|||
|
||||
case unop::F:
|
||||
/* If f is class of eventuality then F(f)=f. */
|
||||
if (!is_eventual(result_) || (o == Inf))
|
||||
if (!is_eventual(result_) || o == Inf || o == InfBase)
|
||||
result_ = unop::instance(unop::F, result_);
|
||||
return;
|
||||
|
||||
case unop::G:
|
||||
/* If f is class of universality then G(f)=f. */
|
||||
if (!is_universal(result_) || (o == Inf))
|
||||
if (!is_universal(result_) || o == Inf || o == InfBase)
|
||||
result_ = unop::instance(unop::G, result_);
|
||||
return;
|
||||
}
|
||||
|
|
@ -112,7 +112,7 @@ namespace spot
|
|||
|
||||
/* If b is of class eventuality then a U b = b.
|
||||
If b is of class universality then a R b = b. */
|
||||
if ((o != Inf)
|
||||
if ((o != Inf) && (o != InfBase)
|
||||
&& ((is_eventual(f2) && ((bo->op()) == binop::U))
|
||||
|| (is_universal(f2) && ((bo->op()) == binop::R))))
|
||||
{
|
||||
|
|
@ -122,7 +122,7 @@ namespace spot
|
|||
/* case of implies */
|
||||
formula* f1 = recurse(bo->first());
|
||||
|
||||
if (o != EventualUniversal)
|
||||
if (o != EventualUniversal && o != EventualUniversalBase)
|
||||
{
|
||||
bool inf = inf_form(f1, f2);
|
||||
bool infinv = inf_form(f2, f1);
|
||||
|
|
@ -206,7 +206,7 @@ namespace spot
|
|||
for (unsigned i = 0; i < mos; ++i)
|
||||
res->push_back(recurse(mo->nth(i)));
|
||||
|
||||
if (o != EventualUniversal)
|
||||
if (o != EventualUniversal && o != EventualUniversalBase)
|
||||
{
|
||||
switch (mo->op())
|
||||
{
|
||||
|
|
@ -312,7 +312,8 @@ namespace spot
|
|||
spot::ltl::formula* ftmp2 = NULL;
|
||||
reduce_form_visitor v(o);
|
||||
|
||||
if (o == BRI)
|
||||
if (o == BRI || o == InfBase ||
|
||||
o == EventualUniversalBase)
|
||||
{
|
||||
ftmp1 = spot::ltl::basic_reduce_form(f);
|
||||
const_cast<formula*>(ftmp1)->accept(v);
|
||||
|
|
@ -350,11 +351,20 @@ namespace spot
|
|||
case Inf:
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2, o);
|
||||
break;
|
||||
case InfBase:
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2, o);
|
||||
break;
|
||||
case EventualUniversal:
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2, o);
|
||||
break;
|
||||
case EventualUniversalBase:
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2, o);
|
||||
break;
|
||||
case InfEventualUniversal:
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2, o);
|
||||
break;
|
||||
case BRI:
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2);
|
||||
ftmp3 = spot::ltl::reduce_form(ftmp2, o);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,13 @@ namespace spot
|
|||
/// EventualUniversal for spot::ltl::reduce_eventuality_universality_form,
|
||||
/// BRI for spot::ltl::reduce_form.
|
||||
|
||||
enum option {Base, Inf, EventualUniversal, BRI};
|
||||
enum option {Base,
|
||||
Inf,
|
||||
InfBase,
|
||||
EventualUniversal,
|
||||
EventualUniversalBase,
|
||||
InfEventualUniversal,
|
||||
BRI};
|
||||
formula* reduce(const formula* f, option o = BRI);
|
||||
|
||||
/// Implement basic rewriting.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue