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

@ -26,6 +26,7 @@
#include <cassert>
#include <iostream>
#include "constant.hh"
#include "atomic_prop.hh"
namespace spot
{
@ -34,6 +35,41 @@ namespace spot
unop::unop(type op, formula* child)
: op_(op), child_(child)
{
props = child->get_props();
switch (op)
{
case Not:
is.in_nenoform = !!dynamic_cast<atomic_prop*>(child);
break;
case X:
is.boolean = false;
is.X_free = false;
is.eltl_formula = false;
break;
case F:
is.boolean = false;
is.eltl_formula = false;
is.sugar_free_ltl = false;
is.eventual = true;
break;
case G:
is.boolean = false;
is.eltl_formula = false;
is.sugar_free_ltl = false;
is.universal = true;
break;
case Finish:
is.boolean = false;
is.ltl_formula = false;
is.psl_formula = false;
break;
case Closure:
case NegClosure:
is.boolean = false;
is.ltl_formula = false;
is.eltl_formula = false;
break;
}
}
unop::~unop()