Fix trivial identity (0 => Exp) == 1, and add rewritings for =>.
The new rewriting are (Exp => Exp) = 1, (Exp <=> Exp) == 1, and (Exp ^ Exp) == 0. * src/ltlast/binop.hh: Fix documentation. * src/ltlast/binop.cc: Fix implementation. * src/ltltest/equals.test: More tests. * src/tgbatest/emptchk.test: Remove a useless test.
This commit is contained in:
parent
f2732dd8cc
commit
473cf77144
4 changed files with 30 additions and 5 deletions
|
|
@ -158,6 +158,12 @@ namespace spot
|
||||||
return unop::instance(unop::Not, second);
|
return unop::instance(unop::Not, second);
|
||||||
if (first == constant::false_instance())
|
if (first == constant::false_instance())
|
||||||
return second;
|
return second;
|
||||||
|
if (first == second)
|
||||||
|
{
|
||||||
|
first->destroy();
|
||||||
|
second->destroy();
|
||||||
|
return constant::false_instance();
|
||||||
|
}
|
||||||
// We expect constants to appear first, because they are
|
// We expect constants to appear first, because they are
|
||||||
// instantiated first.
|
// instantiated first.
|
||||||
assert(second != constant::false_instance());
|
assert(second != constant::false_instance());
|
||||||
|
|
@ -172,10 +178,17 @@ namespace spot
|
||||||
}
|
}
|
||||||
// - (0 <=> Exp) = !Exp
|
// - (0 <=> Exp) = !Exp
|
||||||
// - (1 <=> Exp) = Exp
|
// - (1 <=> Exp) = Exp
|
||||||
|
// - (Exp <=> Exp) = 1
|
||||||
if (first == constant::false_instance())
|
if (first == constant::false_instance())
|
||||||
return unop::instance(unop::Not, second);
|
return unop::instance(unop::Not, second);
|
||||||
if (first == constant::true_instance())
|
if (first == constant::true_instance())
|
||||||
return second;
|
return second;
|
||||||
|
if (first == second)
|
||||||
|
{
|
||||||
|
first->destroy();
|
||||||
|
second->destroy();
|
||||||
|
return constant::true_instance();
|
||||||
|
}
|
||||||
// We expect constants to appear first, because they are
|
// We expect constants to appear first, because they are
|
||||||
// instantiated first.
|
// instantiated first.
|
||||||
assert(second != constant::false_instance());
|
assert(second != constant::false_instance());
|
||||||
|
|
@ -183,15 +196,16 @@ namespace spot
|
||||||
break;
|
break;
|
||||||
case Implies:
|
case Implies:
|
||||||
// - (1 => Exp) = Exp
|
// - (1 => Exp) = Exp
|
||||||
// - (0 => Exp) = 0
|
// - (0 => Exp) = 1
|
||||||
// - (Exp => 1) = 1
|
// - (Exp => 1) = 1
|
||||||
// - (Exp => 0) = !Exp
|
// - (Exp => 0) = !Exp
|
||||||
|
// - (Exp => Exp) = 1
|
||||||
if (first == constant::true_instance())
|
if (first == constant::true_instance())
|
||||||
return second;
|
return second;
|
||||||
if (first == constant::false_instance())
|
if (first == constant::false_instance())
|
||||||
{
|
{
|
||||||
second->destroy();
|
second->destroy();
|
||||||
return first;
|
return constant::true_instance();
|
||||||
}
|
}
|
||||||
if (second == constant::true_instance())
|
if (second == constant::true_instance())
|
||||||
{
|
{
|
||||||
|
|
@ -200,6 +214,12 @@ namespace spot
|
||||||
}
|
}
|
||||||
if (second == constant::false_instance())
|
if (second == constant::false_instance())
|
||||||
return unop::instance(unop::Not, first);
|
return unop::instance(unop::Not, first);
|
||||||
|
if (first == second)
|
||||||
|
{
|
||||||
|
first->destroy();
|
||||||
|
second->destroy();
|
||||||
|
return constant::true_instance();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case U:
|
case U:
|
||||||
// - (Exp U 1) = 1
|
// - (Exp U 1) = 1
|
||||||
|
|
|
||||||
|
|
@ -70,13 +70,16 @@ namespace spot
|
||||||
/// performed (the left formula is rewritten as the right
|
/// performed (the left formula is rewritten as the right
|
||||||
/// formula):
|
/// formula):
|
||||||
/// - (1 => Exp) = Exp
|
/// - (1 => Exp) = Exp
|
||||||
/// - (0 => Exp) = 0
|
/// - (0 => Exp) = 1
|
||||||
/// - (Exp => 1) = 1
|
/// - (Exp => 1) = 1
|
||||||
/// - (Exp => 0) = !Exp
|
/// - (Exp => 0) = !Exp
|
||||||
|
/// - (Exp => Exp) = 1
|
||||||
/// - (1 ^ Exp) = !Exp
|
/// - (1 ^ Exp) = !Exp
|
||||||
/// - (0 ^ Exp) = Exp
|
/// - (0 ^ Exp) = Exp
|
||||||
|
/// - (Exp ^ Exp) = 0
|
||||||
/// - (0 <=> Exp) = !Exp
|
/// - (0 <=> Exp) = !Exp
|
||||||
/// - (1 <=> Exp) = Exp
|
/// - (1 <=> Exp) = Exp
|
||||||
|
/// - (Exp <=> Exp) = Exp
|
||||||
/// - (Exp U 1) = 1
|
/// - (Exp U 1) = 1
|
||||||
/// - (Exp U 0) = 0
|
/// - (Exp U 0) = 0
|
||||||
/// - (0 U Exp) = Exp
|
/// - (0 U Exp) = Exp
|
||||||
|
|
|
||||||
|
|
@ -88,13 +88,16 @@ run 0 ../equals '!0' '1'
|
||||||
run 0 ../equals '!!Exp' 'Exp'
|
run 0 ../equals '!!Exp' 'Exp'
|
||||||
|
|
||||||
run 0 ../equals '(1 => Exp)' 'Exp'
|
run 0 ../equals '(1 => Exp)' 'Exp'
|
||||||
run 0 ../equals '(0 => Exp)' '0'
|
run 0 ../equals '(0 => Exp)' '1'
|
||||||
run 0 ../equals '(Exp => 1)' '1'
|
run 0 ../equals '(Exp => 1)' '1'
|
||||||
run 0 ../equals '(Exp => 0)' '!Exp'
|
run 0 ../equals '(Exp => 0)' '!Exp'
|
||||||
|
run 0 ../equals '(Exp => Exp)' '1'
|
||||||
run 0 ../equals '(1 ^ Exp)' '!Exp'
|
run 0 ../equals '(1 ^ Exp)' '!Exp'
|
||||||
run 0 ../equals '(0 ^ Exp)' 'Exp'
|
run 0 ../equals '(0 ^ Exp)' 'Exp'
|
||||||
|
run 0 ../equals '(Exp ^ Exp)' '0'
|
||||||
run 0 ../equals '(0 <=> Exp)' '!Exp'
|
run 0 ../equals '(0 <=> Exp)' '!Exp'
|
||||||
run 0 ../equals '(1 <=> Exp)' 'Exp'
|
run 0 ../equals '(1 <=> Exp)' 'Exp'
|
||||||
|
run 0 ../equals '(Exp <=> Exp)' '1'
|
||||||
run 0 ../equals '(Exp U 1)' '1'
|
run 0 ../equals '(Exp U 1)' '1'
|
||||||
run 0 ../equals '(Exp U 0)' '0'
|
run 0 ../equals '(Exp U 0)' '0'
|
||||||
run 0 ../equals '(Exp R 1)' '1'
|
run 0 ../equals '(Exp R 1)' '1'
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,5 @@ expect_ce 'Fa & Xb & GFc & Gd' 1
|
||||||
expect_ce 'Fa & Xa & GFc & Gc' 2
|
expect_ce 'Fa & Xa & GFc & Gc' 2
|
||||||
expect_ce 'Fc & X(a | Xb) & GF(a | Xb) & Gc' 1
|
expect_ce 'Fc & X(a | Xb) & GF(a | Xb) & Gc' 1
|
||||||
expect_ce '!((FF a) <=> (F x))' 3
|
expect_ce '!((FF a) <=> (F x))' 3
|
||||||
expect_no '!((FF a) <=> (F a))' 3
|
|
||||||
expect_no 'Xa && (!a U b) && !b && X!b' 4
|
expect_no 'Xa && (!a U b) && !b && X!b' 4
|
||||||
expect_no '(a U !b) && Gb' 3
|
expect_no '(a U !b) && Gb' 3
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue