Commit graph

235 commits

Author SHA1 Message Date
Alexandre Duret-Lutz
776564cbf2 Rertite a M (b | a) = b U a and a R (b | a) == b W a.
* src/ltlvisit/simplify.cc: Here.
* src/ltltest/reduccmp.test: Test it.
* doc/tl/tl.tex: Document it.
2012-04-30 11:57:55 +02:00
Alexandre Duret-Lutz
a09ad6b4c6 Implement W,M removal for Spin output.
* src/ltlvisit/wmunabbrev.hh, src/ltlvisit/wmunabbrev.cc: New files.
* src/ltlvisit/Makefile.am: Add them.
* src/ltlvisit/tostring.cc (to_spin_string): Use the new rewriting.
* wrap/python/ajax/spot.in: Warn when a "Spin" still contain PSL
operators.
* wrap/python/ajax/ltl2tgba.html: Adjust help text.
* doc/tl/tl.tex, NEWS: Document the new rewriting.
2012-04-30 11:57:55 +02:00
Alexandre Duret-Lutz
6ea88efddc Allow atomic propositions negated with a combining overline.
* src/ltlparse/ltlscan.ll: Understand the combining overline, and
combining overbar as synonym for =0.
* src/ltlvisit/tostring.cc: Emit a combining overline for
single-letter atomic propositions.
* src/ltlast/atomic_prop.hh (is_atomic_prop): New function.
* doc/tl/tl.tex: Document these two characters.
2012-04-30 11:57:55 +02:00
Alexandre Duret-Lutz
53f38c2ccd Implement to_utf8_string().
* src/ltlvisit/tostring.cc, src/ltlvisit/tostring.hh: Here.
* src/ltltest/randltl.cc: Add option -8 to display utf-8 formulae.
* src/ltltest/utf8.test: Test it.
2012-04-30 11:57:55 +02:00
Alexandre Duret-Lutz
aec556f7a2 Implement basic rewriting rules for {r} and !{r}.
* src/ltlvisit/simplify.cc: Here.
* src/ltltest/reduccmp.test: Test them.
* doc/tl/tl.tex: Document them.
2012-04-28 09:34:46 +02:00
Alexandre Duret-Lutz
d6587cf531 Implement dual rewritings rules for <>->.
* src/ltlvisit/simplify.cc (reduce_sere_ltl): New function,
to factor the code of the []-> and <>-> rewrittings.
* src/ltltest/reduccmp.test: Add more tests.
* doc/tl/tl.tex: Document these rewritings.
2012-04-28 09:34:46 +02:00
Alexandre Duret-Lutz
6f46345c3a Implement 11 rewritings for []->.
* src/ltlvisit/simplify.cc: Here.
* doc/tl/tl.tex: Document then.
* src/ltlast/bunop.hh (as_KleenStar): New helper function.
* src/ltltest/reduccmp.test: Add more tests.
* src/ltltest/reduc.cc: Also display the resulting formula
without reduce_size_stricly.
2012-04-28 09:34:46 +02:00
Alexandre Duret-Lutz
6eb830c8ae Implement star-normal-form rewriting.
* src/ltlvisit/snf.cc, src/ltlvisit/snf.hh: New files.
* src/ltlvisit/Makefile.am: Distribute them.
* src/ltlvisit/simplify.cc, src/ltlvisit/simplify.hh: Call snf(f) for
all f[*].
* src/ltltest/reduccmp.test: Test it.
* doc/tl/tl.tex, doc/tl/tl.bib: Document it.
2012-04-28 09:34:46 +02:00
Alexandre Duret-Lutz
691119c188 Introduce AndRat and OrRat operator.
It was a mistake to try to overload And/Or LTL operator for these when
trivial simplification are performed.  The reason is so simple it is
embarassing: And(f,1)=f is a trivial identity that should not be
applied with AndRat.  E.g. AndRat(a;b, 1) is equal to 0, not a;b.

* src/ltlast/multop.hh, src/ltlast/multop.cc: Add the AndRat and OrRat
operators.
* src/ltlparse/ltlparse.yy: Build them.
* src/ltlvisit/mark.cc, src/ltlvisit/simplify.cc,
src/ltlvisit/tostring.cc, src/tgba/formula2bdd.cc,
src/tgbaalgos/eltl2tgba_lacim.cc, src/tgbaalgos/ltl2taa.cc,
src/tgbaalgos/ltl2tgba_fm.cc, src/tgbaalgos/ltl2tgba_lacim.cc:
Adjust all switches.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
35b41331f7 Add more simplification rules for AndNLM.
* src/ltlvisit/simplify.cc: Here.
* src/ltltest/reduccmp.test: More tests.
* doc/tl/tl.tex: Document them.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
abaf102746 Get rid of bunop::Equal and bunop::Goto.
* src/ltlast/bunop.hh, src/ltlast/bunop.cc, src/ltlvisit/randomltl.cc,
src/ltlvisit/simplify.cc, src/ltlvisit/tostring.cc,
src/tgbaalgos/ltl2tgba_fm.cc: Remove all traces of these two
operators since they are not handled like sugar.
* doc/tl/tl.tex: Adjust documentation to reflect the fact that these
two operators are sugar.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
39417037d7 to_string: abbreviate [->i..j] and [=i..j] expressed using [*i..j]
* src/ltlast/bunop.hh (is_bunop, is_Star): New functions.
* src/ltlast/multop.hh (is_And, is_Or): Fix constness.
(is_Concat, is_Fusion): New functions.
* src/ltlast/unop.hh (is_unop, is_X, is_F, is_G, is_GF, is_FG):
Fix constness.
(is_Not): New function.
* src/ltlvisit/tostring.cc (strip_star_not, match_goto,
emit_bunop_child, resugar_concat): New methods.
(visit(bunop)): Rewrite without calling format().  Detect the
[->i..j] pattern.
(visit(multop)): Call resugar_concat to detect [=i..j] patterns.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
e109f21ce4 Factor the code of ltl::to_string and ltl::to_spin_string.
* src/ltlvisit/tostring.cc (to_string_visitor): Take a list of
keywords as fourth argument.
(to_spin_string_visitor): Remove.
(to_string, to_spin_string): Adjust usage of to_string_visitor.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
62bf41cdb4 Prefer "xor" over "^" when outputing formulae.
* src/ltlvisit/tostring.cc (to_string_visitor): Here.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
277ae7ddfb ltl::dotty: Number children for Concat and Fusion.
* src/ltlvisit/dotty.cc (dotty_visitor): Replace the "dir" attribute
by a childnum attribute used to number children.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
412f946ac0 Use []=> and <>=> as sugar in the output when possible.
* src/ltlast/multop.hh (is_multop): Take a constant formula as input.
* src/ltlvisit/tostring.cc (to_string_visitor::visit(multop*)):
Output []=> or <>=> when the left argument of a []-> or <>-> is
a concatenation that ends in 1.
* doc/tl/tl.tex: Document this desugaring.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
5e7c0add49 Move helper functions from simplify.cc to the AST files.
* src/ltlvisit/simplify.cc (spot::ltl::is_And, spot::ltl::is_F,
spot::ltl::is_FG, spot::ltl::is_G, spot::ltl::is_GF, spot::ltl::is_M,
spot::ltl::is_Or, spot::ltl::is_R, spot::ltl::is_U, spot::ltl::is_W,
spot::ltl::is_X, spot::ltl::is_binop, spot::ltl::is_constant,
spot::ltl::is_multop, spot::ltl::is_unop): Move ...
* src/ltlast/binop.hh, src/ltlast/constant.hh, src/ltlast/multop.hh
src/ltlast/unop.hh: ... here, as appropriate.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
aa4b68fcfc Simplify some simplification code using but_all().
* src/ltlvisit/simplify.cc: Use but_all() to simplify code.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
955fc041ca Reduce 'a|(b&X(b U a))' to 'b U a', plus three simular rules.
* src/ltlast/multop.hh, src/ltlast/multop.cc (all_but): New method
used to simplify the removal of one element of a multop.
* src/ltlvisit/simplify.cc: Implement the new rewriting rules.
* doc/tl/tl.tex: Document them.
* src/ltltest/reduccmp.test: Test them.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
bb56c26d1c Rewrite "(Xc) M b" as "b & X(b U c)", plus three similar rules.
* src/ltlvisit/simplify.hh (ltl_simplifier_options): New option
reduce_size_stricly.
* src/ltlvisit/simplify.cc (simplify_visitor): Implement these
rules.
* src/ltltest/reduc.cc: Check with reduce_size_strictly unset or
set, but only use the latter result to check sizes.
* src/ltltest/reduccmp.test: Test them.
* doc/tl/tl.tex: Document them.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
c9b34d684a * src/ltlvisit/tostring.cc: Output <-> and -> instead of <=> and =>. 2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
e6e85999de Add new simplification rules like: "a | (Xa R b)" gives "b U a".
* src/ltlvisit/simplify.cc: Add new rules.
* doc/tl/tl.tex: Document them.
* src/ltltest/reduccmp.test: Add test cases.
2012-04-28 09:34:45 +02:00
Alexandre Duret-Lutz
395793d986 Rewrite a&XGa as Ga, and a|XFa as Fa.
The actual rules are a bit more complex:
a & X(G(a&b...)&c...) = Ga & X(G(b...)&c...)
a | X(Fa | c) = F(a) | c
with the second rule being applied only if all XF can
be removed.  See the documentation for an example.

* src/ltlvisit/simplify.cc: Implement these new rules.
* doc/tl/tl.tex: Document them.
* src/ltltest/reduccmp.test: Add test cases.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
54d4a0a093 Rewrite F(a M b) as F(a & b), and G(a W b) as G(a | b).
* src/ltlvisit/simplify.cc: Implement these rules.
* src/ltltest/reduccmp.test: Add tests.
* doc/tl/tl.tex: Document them.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
212c7ebdd7 Add implication-based rewritings from Babiak et al. (TACAS'12)
* src/ltlvisit/simplify.cc: Implement them here, and augment them
to support M, and W operators.
* src/ltltest/reduccmp.test: Add some tests.
* doc/tl/tl.tex (Simplifications Based on Implications): Document
these rules.
* doc/tl/tl.bib (babiak.12.tacas): New entry.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
ed0dd0b48d Add a new length_boolone() function to fix an assert in randpsl.
* src/ltlvisit/length.hh (length_boolone): New function.
* src/ltlvisit/length.cc (length_boolone): Implement it using...
(length_boolone_visitor): ... this new visitor.
* src/ltltest/randltl.cc: Use length_boolone() to check the result
of the random generator, and ignore any formula larger (in
length()) than opt_f.  This fix a bug where the random formula
generator would sometime produce formula larger than requested,
because of the trivial rewriting of {f}[]->e as e|!f.
* src/ltltest/length.cc: Add option -b to call length_boolone().
* src/ltltest/length.test: Test length_boolone().
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
c2ab4e781b Rewrite "a U (a&b)" as "b M a", and "a W (a&b)" as "b R a".
* src/ltlvisit/simplify.cc (simplify_visitor): Implement these
rules.
* doc/tl/tl.tex: Document these rules.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
0536cdfb9b Fix a g++ warning about possibly uninitialized variable.
* src/ltlvisit/simplify.cc (simplify_visitor::visit(multop)):
Initialize `ri' to kill a warning.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
72609185b8 Fix drawing a bonup operators in the AST.
* src/ltlvisit/dotty.cc (dotty_visitor::visit): Do not
declare bunop as sinks.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
b03935a4cf Simplify {r1;b1}&&{r2;b2} or {b1:r1}&&{b2:r2}, or similar.
* src/ltlvisit/simplify.cc: Add four rules.
* doc/tl/tl.tex: Document these rules.
* src/ltltest/reduccmp.test: Add tests.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
ec9a3f96cb * src/ltlvisit/postfix.cc: Fix recursion on bunop formulae. 2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
614810c0db Simplify {b && {r1;...;rn}}.
* doc/tl/tl.tex: Document the rules.
* src/ltlvisit/simplify.cc (simplify_visitor): Implement them.
* src/ltltest/reduccmp.test: Test them.
2012-04-28 09:34:44 +02:00
Alexandre Duret-Lutz
d0cfd44ba6 Simplify {b && {r1:...:rn}} as {b && r1 && ... && rn}.
* src/ltlvisit/simplify.cc (simplify_visitor): Do it.
* src/ltltest/reduccmp.test: Add a test.
* doc/tl/tl.tex: Document it.
* src/ltlast/multop.cc: Fix the computation of is.accepting_eword
for Fusion.  The Fusion operator never accepts [*0].
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
77084747b9 Simplify {b && r[*]} as {b && r}; likewise for [->] and [=].
* src/ltlvisit/simplify.cc (simplify_visitor): Do it.
* src/ltltest/reduccmp.test: Add more tests.
* doc/tl/tl.tex: Document it.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
0f11e5fe0e Speedup mark_concat_ops() and simplify_mark() with a cache.
* src/ltlvisit/mark.hh, src/ltlvisit/mark.cc (mark_concat_ops,
simplify_mark): Rewrite these two functions as methods of
(mark_tools): this new class.
* src/ltlast/binop.cc, src/ltlast/unop.cc: Adjust computation
of not_marked to ignore marked operators that are not at
the top-level.  I.e., something like X(!{a}) is not marked.
* src/tgbaalgos/ltl2tgba_fm.cc (translate_dict::mt): New
instance of mark_tools.
(formula_canonizer::translate) Adjust calls to
mark_concat_ops() and simplify_mark().
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
2f03649324 Generalize syntactic implication for event. and univ. formulae.
* src/ltlvisit/simplify.cc (syntactic_implication_aux): Refine
rules to deal with pure eventualities and purely universal
properties.
* src/ltltest/reduccmp.test: Add tests.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
07e40e706a Translate Boolean formulae as BDD using the ltl_simplifier cache.
* src/ltlvisit/simplify.hh, src/ltlvisit/simplify.cc
(ltl_simplifier::ltl_simplifier, ltl_simplifier::get_dict): Make
it possible to supply and retrieve the dictionary used.
(ltl_simplifier::as_bdd): New function, exported from the cache.
* src/tgbaalgos/ltl2tgba_fm.cc (translate_dict): Store the
ltl_simplifier object.
(translate_dict::boolean_to_bdd): Call ltl_simplifier::as_bdd.
(translate_ratexp): New wrapper around the ratexp_trad_visitor,
calling boolean_to_bdd whenever possible.
(ratexp_trad_visitor): Do not deal with negated formulae, there
are necessarily Boolean and handled by translate_ratexp().
(ltl_visitor): Adjust to call translate_ratexp.
(ltl_to_tgba_fm): Adjust passing of the ltl_simplifier to the
translate_dict, and make sure everybody is using the same
dictionary.
* src/tgbatest/ltl2tgba.cc: Pass the dictionary to the
ltl_simplifier.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
369ad87e50 Rewrite syntactic implication using a single function.
* src/ltlvisit/simplify.cc (inf_left_recurse_visitor,
inf_right_recurse_visitor): Remove.
(syntactic_implication, syntactic_implication_aux): Rewrite all
rules for syntactic implication.
(syntactic_implication_neg): Simplify.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
7514cc15ee Decrease the maximum bound used in random BUnOps.
* src/ltlvisit/randomltl.cc (bunop_bounded_builder,
bunop_bool_bounded_builder): Set the maximum value
to 3 instead of 4, to speed up the test suite.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
c54627bebd Avoid containment checks on equal formulae.
* src/ltlvisit/contain.cc
(language_containment_checker::contained,
language_containment_checker::neg_contained,
language_containment_checker::contained_neg): Detect
cases where both formulae are equal.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
7f7627bf22 Check that reductions are legitimates with containment.
* src/ltlvisit/simplify.cc, src/ltlvisit/simplify.hh
(are_equivalent): Export this function from the cache.
* src/ltltest/reduc.cc, src/ltltest/equals.cc: Use
are_equivalent() to check that the reductions are legitimate.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
c9a659c8d4 Compare Boolean LTL formulae using BDDs.
* src/ltlvisit/simplify.cc (syntactic_implication): Here.
2012-04-28 09:34:43 +02:00
Alexandre Duret-Lutz
fea49630f6 Merge the syntactic implication code with ltl_simplifier.
So that we can latter use some combined optimizations.

* src/ltlvisit/simplify.hh, src/ltlvisit/simplify.cc: Integrate
the code from syntimpl.cc
* src/ltlvisit/syntimpl.hh, src/ltlvisit/syntimpl.cc: Delete.  All
code has been moved above.
* src/ltlvisit/Makefile.am: Adjust.
* src/ltltest/syntimpl.cc: Adjust code.
2012-04-28 09:34:42 +02:00
Alexandre Duret-Lutz
3db13a6f97 * src/ltlvisit/simplify.cc: More comments. 2012-04-28 09:34:42 +02:00
Alexandre Duret-Lutz
03fd46a13b Rewrite xor, =>, and <=> in negative_normal_form().
* src/ltlvisit/simplify.hh, src/ltlvisit/simplify.cc
(ltl_simplify::negative_normal_form): Remove the third
parameter and always rewrite XOR, =>, and <=>.  This avoid
problems with the cache, that could have been populated with
a different value for this third parameter.
* src/ltltest/reduc.cc, src/tgbaalgos/ltl2tgba_fm.cc: Adjust
calls to negative_normal_form().
* src/ltltest/nenoform.test: Adjust tests.
2012-04-28 09:34:42 +02:00
Alexandre Duret-Lutz
b89f86edcf Mark reduce_tau03() as deprecated.
* src/ltlvisit/contain.hh (reduce_tau03): Mark as deprecated.
* src/tgbaalgos/ltl2tgba_fm.cc, src/tgbatest/ltl2tgba.cc,
src/ltltest/equals.cc: Do not include ltlvisit/contain.hh, since
it's not used.
2012-04-28 09:34:42 +02:00
Alexandre Duret-Lutz
5c1729d6e4 Remove basicreduce files. ltl_simplifier does all the work.
* src/ltlvisit/basicreduce.cc, src/ltlvisit/basicreduce.hh: Delete.
* src/ltlvisit/Makefile.am: Remove them.
2012-04-28 09:34:42 +02:00
Alexandre Duret-Lutz
67f4e8b5ce Deprecate reduce() in favor of ltl_simplifier.
* src/ltlvisit/reduce.hh: Mark the file as obsolete.
(reduce): Declare this function as obsolete.
* src/ltlvisit/reduce.cc: Define SKIP_DEPRECATED_WARNING
so we can include reduce.hh.
* src/sanity/includes.test: Also use SKIP_DEPRECATED_WARNING
when compiling headers.
* iface/dve2/dve2check.cc,
src/ltltest/equals.cc, src/ltltest/randltl.cc,
src/ltltest/reduc.cc, src/tgbaalgos/ltl2tgba_fm.hh,
src/tgbaalgos/ltl2tgba_fm.cc, src/tgbatest/randtgba.cc,
wrap/python/ajax/spot.in, wrap/python/spot.i: Adjust
to use ltl_simplifier.
* src/tgbatest/ltl2tgba.cc: Adjust to use ltl_simplifier,
and replace -fr1...-fr7 options by a single -fr option.
* src/tgbatest/spotlbtt.test: Adjust -fr flags accordingly.
* src/tgbatest/reductgba.cc: Do not include reduce.hh.
2012-04-28 09:34:42 +02:00
Alexandre Duret-Lutz
c0085a8f30 Move the remaining reduce() logic into ltl_simplifier.
* src/ltlvisit/simplify.hh
(ltl_simplifier::negative_normal_form): Allow logical
unabbreviations during the NNF pass.
* src/ltlvisit/simplify.cc
(ltl_simplifier::negative_normal_form)
(negative_normal_form_visitor): Adjust.
(ltl_simplifier::simplify): Request unabbreviations.
* src/ltlvisit/reduce.cc (reduce): Remove most
of the code, leaving only a call ltl_simplifier
and some wrapper code to convert options.
* src/ltltest/reduccmp.test: Add more test cases.
2012-04-28 09:30:37 +02:00
Alexandre Duret-Lutz
d4d4c0e7d3 Typo in the code rewriting "a M 1 = Fa".
* src/ltlvisit/simplify.cc (simplify_visitor): Fix it,
and leave the trace code.
2012-04-28 09:30:37 +02:00