Fix handling of PSL operators in reductions rules.

We still don't have any PSL-specific reductions, but at least
the LTL reduction now appear to work on PSL formulas.

* src/ltlvisit/basicreduce.cc (basic_reduce_visitor): Fix the
call to std::copy to handle Concat, Fusion, and AndNLM.
* src/ltlvisit/reduce.cc (reduce_visitor): Fix handling
of UConcat, EConcat, and EConcatMarked.
* src/tgbatest/randpsl.test: Activate reductions.
* src/ltltest/reducpsl.test: New file.
* src/ltltest/Makefile.am (TESTS): Add it.
This commit is contained in:
Alexandre Duret-Lutz 2011-02-15 14:34:57 +01:00
parent b8b4aa72c5
commit c8801935bf
5 changed files with 53 additions and 6 deletions

View file

@ -1,4 +1,4 @@
// Copyright (C) 2008, 2009, 2010 Laboratoire de Recherche et
// Copyright (C) 2008, 2009, 2010, 2011 Laboratoire de Recherche et
// Développement de l'Epita (LRDE).
// Copyright (C) 2004, 2007 Laboratoire d'Informatique de
// Paris 6 (LIP6), d�partement Syst�mes R�partis Coop�ratifs (SRC),
@ -25,6 +25,7 @@
#include "ltlast/visitor.hh"
#include "ltlast/allnodes.hh"
#include <cassert>
#include <iterator>
namespace spot
{
@ -181,13 +182,13 @@ namespace spot
}
#if 0
// F(f1 & GF(f2)) = F(f1) & GF(F2)
// F(f1 & GF(f2)) = F(f1) & GF(f2)
//
// As is, these two formulae are translated into
// equivalent Büchi automata so the rewriting is
// useless.
//
// However when taken in a larger formulae such as F(f1
// However when taken in a larger formula such as F(f1
// & GF(f2)) | F(a & GF(b)), this rewriting used to
// produce (F(f1) & GF(f2)) | (F(a) & GF(b)), missing
// the opportunity to apply the F(E1)|F(E2) = F(E1|E2)
@ -862,7 +863,8 @@ namespace spot
case multop::Concat:
case multop::AndNLM:
case multop::Fusion:
std::copy(res->begin(), res->end(), tmpOther->end());
std::copy(res->begin(), res->end(),
std::back_inserter(*tmpOther));
break;
}

View file

@ -157,10 +157,12 @@ namespace spot
case binop::Xor:
case binop::Equiv:
case binop::Implies:
assert(!"operator not supported for syntactic implication");
return;
case binop::UConcat:
case binop::EConcat:
case binop::EConcatMarked:
return;
break;
case binop::U:
/* a < b => a U b = b */