simplify: fix handling of keep_top_xor

Under that option, !(a ^ b) was converted
to (!a <=> !b) instead of simply (a <=> b).

* spot/tl/simplify.cc (equiv_or_xor): Improve
rewriting.
* tests/core/ltl2tgba2.test, tests/python/simstate.py: Adjust test
cases.
This commit is contained in:
Alexandre Duret-Lutz 2020-07-22 16:23:34 +02:00
parent 1784671ca1
commit 1c5468a93a
4 changed files with 20 additions and 15 deletions

View file

@ -431,12 +431,12 @@ namespace spot
if (equiv)
{
// Rewrite a<=>b as (a&b)|(!a&!b)
auto recurse_f1_true = rec(f1, true);
auto recurse_f2_true = rec(f2, true);
if (!deep && c->options.keep_top_xor)
return formula::Equiv(recurse_f1_true, recurse_f2_true);
auto recurse_f1_false = rec(f1, false);
auto recurse_f2_false = rec(f2, false);
if (!deep && c->options.keep_top_xor)
return formula::Equiv(recurse_f1_false, recurse_f2_false);
auto recurse_f1_true = rec(f1, true);
auto recurse_f2_true = rec(f2, true);
auto left = formula::And({recurse_f1_false, recurse_f2_false});
auto right = formula::And({recurse_f1_true, recurse_f2_true});
return formula::Or({left, right});
@ -444,12 +444,12 @@ namespace spot
else
{
// Rewrite a^b as (a&!b)|(!a&b)
auto recurse_f1_true = rec(f1, true);
auto recurse_f2_true = rec(f2, true);
if (!deep && c->options.keep_top_xor)
return formula::Xor(recurse_f1_true, recurse_f2_true);
auto recurse_f1_false = rec(f1, false);
auto recurse_f2_false = rec(f2, false);
if (!deep && c->options.keep_top_xor)
return formula::Xor(recurse_f1_false, recurse_f2_false);
auto recurse_f1_true = rec(f1, true);
auto recurse_f2_true = rec(f2, true);
auto left = formula::And({recurse_f1_false, recurse_f2_true});
auto right = formula::And({recurse_f1_true, recurse_f2_false});
return formula::Or({left, right});