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:
parent
1671aa5da1
commit
546260e7a0
17 changed files with 408 additions and 488 deletions
|
|
@ -37,6 +37,32 @@ namespace spot
|
|||
multop::multop(type op, vec* v)
|
||||
: op_(op), children_(v)
|
||||
{
|
||||
unsigned s = v->size();
|
||||
assert(s > 1);
|
||||
|
||||
props = (*v)[0]->get_props();
|
||||
for (unsigned i = 1; i < s; ++i)
|
||||
props &= (*v)[i]->get_props();
|
||||
|
||||
switch (op)
|
||||
{
|
||||
case Concat:
|
||||
case Fusion:
|
||||
is.boolean = false;
|
||||
is.ltl_formula = false;
|
||||
is.eltl_formula = false;
|
||||
is.eventual = false;
|
||||
is.universal = false;
|
||||
break;
|
||||
case AndNLM:
|
||||
// The non-matching-length-And (&) can only appear in the
|
||||
// rational parts of PSL formula. We don't remove the
|
||||
// Boolean flag, because applied to atomic propositions a&b
|
||||
// has the same effect as a&&b.
|
||||
case And:
|
||||
case Or:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
multop::~multop()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue