Maintain basic LTL properties using a bitfield inside formula objects.

This bitfield is easily updated as the formulae are constructed.
Doing so avoids many AST recursions to compute these properties
individually.  This patch removes the eventual_universal_visitor,
as well as the kind_of() function.

* src/ltlast/formula.hh (is_boolean, is_sugar_free_boolean,
is_in_nenoform, is_X_free, is_sugar_free_ltl,
is_ltl_formula, is_eltl_formula, is_psl_formula, is_eventual,
is_universal, is_marked): New methods to query formula
properties in constant time.
(get_props, ltl_prop): A method and structure for
implementation as a field bit in an unsigned, for fast
computation.
(print_formula_props): New function.
* src/ltlast/formula.cc (print_formula_props): Implement it.
* src/ltlast/atomic_prop.cc, src/ltlast/binop.cc,
src/ltlast/bunop.cc, src/ltlast/constant.cc, src/ltlast/multop.cc,
src/ltlast/unop.cc, src/ltlast/automatop.cc: Compute the
properties as instances are constructed.
* src/ltlparse/ltlparse.yy: Update to use is_boolean() instead
of kind_of().
* src/ltltest/kind.cc: Update to use print_formula_props().
* src/ltltest/kind.test: Adjust to test eventual and universal
properties.
* src/ltlvisit/kind.cc, src/ltlvisit/kind.hh: Delete these files.
* src/ltlvisit/Makefile.am: Remove kind.hh and kind.cc.
* src/ltlvisit/reduce.cc (recurse_eu, eventual_universal_visitor):
Remove, no longer needed.
(reduce_visitor, is_eventual, is_universal): Adjust to
use formula::is_eventual(), and formula::is_universal().
* src/ltlvisit/reduce.hh (is_eventual, is_universal): Declare as
deprecated.
This commit is contained in:
Alexandre Duret-Lutz 2010-12-08 18:22:35 +01:00
parent 1671aa5da1
commit 546260e7a0
17 changed files with 408 additions and 488 deletions

View file

@ -35,7 +35,6 @@
#include <string>
#include "public.hh"
#include "ltlast/allnodes.hh"
#include "ltlvisit/kind.hh"
struct minmax_t { unsigned min, max; };
}
@ -367,7 +366,7 @@ rationalexp: booleanatom
$1.min, $1.max); }
| rationalexp equalargs
{
if ((kind_of($1) & Boolean_Kind) == Boolean_Kind)
if ($1->is_boolean())
{
$$ = bunop::instance(bunop::Equal, $1, $2.min, $2.max);
}
@ -384,7 +383,7 @@ rationalexp: booleanatom
}
| rationalexp gotoargs
{
if ((kind_of($1) & Boolean_Kind) == Boolean_Kind)
if ($1->is_boolean())
{
$$ = bunop::instance(bunop::Goto, $1, $2.min, $2.max);
}