ltltest: speedup more tests

This generalizes the previous patch.

* src/ltltest/equalsf.cc: Allow escaped '\,' and
negated result.
* src/ltltest/Makefile.am: Use equalsf.cc for
almost all tests that used equals.cc.
(nequals): New.
* src/ltltest/equals.test, src/ltltest/eventuniv.test,
src/ltltest/lunabbrev.test, src/ltltest/nenoform.test,
src/ltltest/parseerr.test, src/ltltest/tunabbrev.test,
src/ltltest/tunenoform.test: Adjust.
This commit is contained in:
Alexandre Duret-Lutz 2014-08-17 12:22:06 +02:00
parent 7b9f695265
commit 6a741189bc
10 changed files with 371 additions and 324 deletions

View file

@ -8,6 +8,7 @@ parser.dot
expect expect
defs defs
equals equals
nequals
lunabbrev lunabbrev
tunabbrev tunabbrev
nenoform nenoform

View file

@ -35,11 +35,11 @@ check_PROGRAMS = \
ltl2text \ ltl2text \
ltlrel \ ltlrel \
lunabbrev \ lunabbrev \
nequals \
nenoform \ nenoform \
reduc \ reduc \
reduccmp \ reduccmp \
reduceu \ reduceu \
reductau \
reductaustr \ reductaustr \
syntimpl \ syntimpl \
tostring \ tostring \
@ -48,31 +48,31 @@ check_PROGRAMS = \
unabbrevwm unabbrevwm
consterm_SOURCES = consterm.cc consterm_SOURCES = consterm.cc
equals_SOURCES = equals.cc equals_SOURCES = equalsf.cc
kind_SOURCES = kind.cc kind_SOURCES = kind.cc
length_SOURCES = length.cc length_SOURCES = length.cc
ltl2dot_SOURCES = readltl.cc ltl2dot_SOURCES = readltl.cc
ltl2dot_CPPFLAGS = $(AM_CPPFLAGS) -DDOTTY ltl2dot_CPPFLAGS = $(AM_CPPFLAGS) -DDOTTY
ltl2text_SOURCES = readltl.cc ltl2text_SOURCES = readltl.cc
ltlrel_SOURCES = ltlrel.cc ltlrel_SOURCES = ltlrel.cc
lunabbrev_SOURCES = equals.cc lunabbrev_SOURCES = equalsf.cc
lunabbrev_CPPFLAGS = $(AM_CPPFLAGS) -DLUNABBREV lunabbrev_CPPFLAGS = $(AM_CPPFLAGS) -DLUNABBREV
nenoform_SOURCES = equals.cc nenoform_SOURCES = equalsf.cc
nenoform_CPPFLAGS = $(AM_CPPFLAGS) -DNENOFORM nenoform_CPPFLAGS = $(AM_CPPFLAGS) -DNENOFORM
nequals_SOURCES = equalsf.cc
nequals_CPPFLAGS = $(AM_CPPFLAGS) -DNEGATE
reduc_SOURCES = reduc.cc reduc_SOURCES = reduc.cc
reduccmp_SOURCES = equalsf.cc reduccmp_SOURCES = equalsf.cc
reduccmp_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC reduccmp_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC
reduceu_SOURCES = equals.cc reduceu_SOURCES = equalsf.cc
reduceu_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC -DEVENT_UNIV reduceu_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC -DEVENT_UNIV
reductau_SOURCES = equals.cc
reductau_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC_TAU
reductaustr_SOURCES = equalsf.cc reductaustr_SOURCES = equalsf.cc
reductaustr_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC_TAUSTR reductaustr_CPPFLAGS = $(AM_CPPFLAGS) -DREDUC_TAUSTR
syntimpl_SOURCES = syntimpl.cc syntimpl_SOURCES = syntimpl.cc
tostring_SOURCES = tostring.cc tostring_SOURCES = tostring.cc
tunabbrev_SOURCES = equals.cc tunabbrev_SOURCES = equalsf.cc
tunabbrev_CPPFLAGS = $(AM_CPPFLAGS) -DTUNABBREV tunabbrev_CPPFLAGS = $(AM_CPPFLAGS) -DTUNABBREV
tunenoform_SOURCES = equals.cc tunenoform_SOURCES = equalsf.cc
tunenoform_CPPFLAGS = $(AM_CPPFLAGS) -DNENOFORM -DTUNABBREV tunenoform_CPPFLAGS = $(AM_CPPFLAGS) -DNENOFORM -DTUNABBREV
unabbrevwm_SOURCES = equals.cc unabbrevwm_SOURCES = equals.cc
unabbrevwm_CPPFLAGS = $(AM_CPPFLAGS) -DWM unabbrevwm_CPPFLAGS = $(AM_CPPFLAGS) -DWM

View file

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2009, 2010, 2011, 2012 Laboratoire de Recherche et # Copyright (C) 2009, 2010, 2011, 2012, 2014 Laboratoire de Recherche et
# Développement de l'Epita (LRDE). # Développement de l'Epita (LRDE).
# Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
# département Systèmes Répartis Coopératifs (SRC), Université Pierre # département Systèmes Répartis Coopératifs (SRC), Université Pierre
@ -25,181 +25,189 @@
# Check for the equals visitor # Check for the equals visitor
. ./defs || exit 1 . ./defs || exit 1
set -e
cat >equal.txt <<\EOF
# A few things which are equal # A few things which are equal
run 0 ../equals 'a' 'a' a, a
run 0 ../equals '~a' '!a' ~a, !a
run 0 ../equals '1' '1' 1, 1
run 0 ../equals '0' '0' 0, 0
run 0 ../equals 'a => b' 'a --> b' a => b, a --> b
run 0 ../equals 'a <-> b' 'a <--> b' a <-> b, a <--> b
run 0 ../equals 'G a ' ' G a' G a , G a
run 0 ../equals 'a U b' 'a U b' a U b, a U b
run 0 ../equals 'a & b' 'a & b' a & b, a & b
run 0 ../equals 'a & b' 'b & a' a & b, b & a
run 0 ../equals 'a & b & c' 'c & a && b' a & b & c, c & a && b
run 0 ../equals 'a & b & c' 'b & c & a' a & b & c, b & c & a
run 0 ../equals 'a && b & a' 'b & a & b' a && b & a, b & a & b
run 0 ../equals 'a & b' 'b & a & b' a & b, b & a & b
run 0 ../equals 'a & b' 'b & a & a' a & b, b & a & a
run 0 ../equals 'a & b & (c |(f U g)|| e)' \ a & b & (c |(f U g)|| e), b & a & a & (c | e |(f U g)| e | c) & b
'b & a & a & (c | e |(f U g)| e | c) & b' a & a, a
run 0 ../equals 'a & a' 'a' a & a & true, a
run 0 ../equals 'a & a & true' 'a' a & false & a, false
run 0 ../equals 'a & false & a' 'false' a | false | a, a
run 0 ../equals 'a | false | a' 'a' true | a | a, true
run 0 ../equals 'true | a | a' 'true' Ga=1*Gb=0, (G(a)) & (G(!b))
run 0 ../equals 'Ga=1*Gb=0' '(G(a)) & (G(!b))' FFx, Fx
FFFFFx, Fx
# other formulae which are not GGx, Gx
run 1 ../equals 'a' 'b' GGGGGx, Gx
run 1 ../equals '1' '0' !!x, x
run 1 ../equals 'a => b' 'b => a' !!!!!x, !x
run 1 ../equals 'a => b' 'a <=> b' {[*0];x}<>->1, {x}<>->1
run 1 ../equals 'a => b' 'a U b' {x;[*0]}<>->1, {x}<>-> 1
run 1 ../equals 'a R b' 'a U b' {[*0];x;[*0];[*0]}<>->1, {x}<>->1
run 1 ../equals 'a & b & c' 'c & a' {[*0];x;[*0];x;[*0]}<>->1, {x;x}<>->1
run 1 ../equals 'b & c' 'c & a & b' {x;x;x;[*0];x;x}<>->1, {x;x;x;x;x}<>->1
run 1 ../equals 'a & b & (c |(f U g)| e)' \ {x;0;x;x;x}<>->1, 0
'b & a & a & (c | e |(g U g)| e | c) & b' {x;0;x;x;x}[]->1, 1
run 1 ../equals '{a*}' '{a*}<>->1' {0*;1}<>->x, x
run 1 ../equals '!{a*}' '{a*}<>->1' {[*0]*;1}<>->x, x
run 1 ../equals '{a*}' '{a*}!' {x;x}<>->FF(0), 0
run 1 ../equals '!{a*}' '{a*}!' {x;x}<>->GX(1), {x;x}<>->1
{x;x}[]->GX(1), 1
{x;x}[]->FF(0), {x;x}[]->0
{x;x}[]->y, {x;x}|->y
{x;x}[]->y, {x;x}(y)
{a*}!, {a*}<>->1
{a -> b} (c), !(a->b)|c
{a & !b}!, a & !b
{a;[*0]}|->!Xb, !a | !Xb
{{a;b}:b:c:d*:e:f}!, {{a;b}:{b && c }:d[*]:{e && f}}!
{a:b:c}|->!Xb, !(a&&b&&c) | !Xb
{a:b:c*}|->!Xb, {(a&&b):c*}|-> !Xb
{a&b&c*}|->!Xb, {(a&&b)&c*}|-> !Xb
{[*]&&a&&[*]}!, a
{[*]||a||[*]}!, {[*]}!
{0&{f;g*}}!, 0
{1&{f;g*}}!, {f;g*}!
# Precedence # Precedence
run 0 ../equals 'a & b ^ c | d' 'd | c ^ b & a' a & b ^ c | d, d | c ^ b & a
# Corner cases parsing # Corner cases parsing
run 0 ../equals 'FFG__GFF' 'F(F(G("__GFF")))' FFG__GFF, F(F(G("__GFF")))
# Trivial simplifications # Trivial simplifications
run 0 ../equals '{0*}<>->a' '{[*0]}<>->a' {0*}<>->a, {[*0]}<>->a
run 0 ../equals '{[*0]*}<>->a' '{[*0]}<>->a' {[*0]*}<>->a, {[*0]}<>->a
run 0 ../equals '{Exp**}<>->a' '{Exp*}<>->a' {Exp**}<>->a, {Exp*}<>->a
run 0 ../equals 'FF(Exp)' 'F(Exp)' FF(Exp), F(Exp)
run 0 ../equals 'GG(Exp)' 'G(Exp)' GG(Exp), G(Exp)
run 0 ../equals 'F(0)' '0' F(0), 0
run 0 ../equals 'G(0)' '0' G(0), 0
run 0 ../equals 'F(1)' '1' F(1), 1
run 0 ../equals 'G(1)' '1' G(1), 1
run 0 ../equals 'F({[*0]}<>->1)' 'F({[*0]}<>->1)' F({[*0]}<>->1), F({[*0]}<>->1)
run 0 ../equals 'G({[*0]}<>->1)' 'G({[*0]}<>->1)' G({[*0]}<>->1), G({[*0]}<>->1)
run 0 ../equals 'F({1}<>->1)' '1' F({1}<>->1), 1
run 0 ../equals 'G({1}<>->1)' '1' G({1}<>->1), 1
run 0 ../equals '!1' '0' !1, 0
run 0 ../equals '!0' '1' !0, 1
run 0 ../equals '!!Exp' 'Exp' !!Exp, Exp
run 0 ../equals '(1 => Exp)' 'Exp' (1 => Exp), Exp
run 0 ../equals '(0 => Exp)' '1' (0 => Exp), 1
run 0 ../equals '(Exp => 1)' '1' (Exp => 1), 1
run 0 ../equals '(Exp => 0)' '!Exp' (Exp => 0), !Exp
run 0 ../equals '(Exp => Exp)' '1' (Exp => Exp), 1
run 0 ../equals '(1 ^ Exp)' '!Exp' (1 ^ Exp), !Exp
run 0 ../equals '(0 ^ Exp)' 'Exp' (0 ^ Exp), Exp
run 0 ../equals '(Exp ^ Exp)' '0' (Exp ^ Exp), 0
run 0 ../equals '(0 <=> Exp)' '!Exp' (0 <=> Exp), !Exp
run 0 ../equals '(1 <=> Exp)' 'Exp' (1 <=> Exp), Exp
run 0 ../equals '(Exp <=> Exp)' '1' (Exp <=> Exp), 1
run 0 ../equals '(Exp U 1)' '1' (Exp U 1), 1
run 0 ../equals '(Exp U 0)' '0' (Exp U 0), 0
run 0 ../equals '(0 U Exp)' 'Exp' (0 U Exp), Exp
run 0 ../equals '(Exp U Exp)' 'Exp' (Exp U Exp), Exp
run 0 ../equals '(Exp R 1)' '1' (Exp R 1), 1
run 0 ../equals '(Exp R 0)' '0' (Exp R 0), 0
run 0 ../equals '(Exp R Exp)' 'Exp' (Exp R Exp), Exp
run 0 ../equals '(1 R Exp)' 'Exp' (1 R Exp), Exp
run 0 ../equals '(Exp W 1)' '1' (Exp W 1), 1
run 0 ../equals '(0 W Exp)' 'Exp' (0 W Exp), Exp
run 0 ../equals '(1 W Exp)' '1' (1 W Exp), 1
run 0 ../equals '(Exp W Exp)' 'Exp' (Exp W Exp), Exp
run 0 ../equals '(Exp M 0)' '0' (Exp M 0), 0
run 0 ../equals '(1 M Exp)' 'Exp' (1 M Exp), Exp
run 0 ../equals '(0 M Exp)' '0' (0 M Exp), 0
run 0 ../equals '(Exp M Exp)' 'Exp' (Exp M Exp), Exp
{1:{a;b}:1:c*}!, {{a;b}:c*}!
{c*:1:{a;b}:1}!, {c*:{a;b}}!
{z;a*;b*;*;c;d;*;b*;e;a*;*;b*}, {z;[*];c;d;[*];e;[*]}
{((a;b)|[*0]);[*];c}!, {[*];c}!
{a;a;a*;a;b;b[*];c[*2:3];c[*4:5]}, {a[*3..];b[+];c[*6..8]}
{a[*0]}, {[*0]}
{a[*..]}, {a[*]}
{a[*2..3][*4..5]}, {a[*8..15]}
{a[*4..5][*2..3]}, {a[*4..5][*2..3]}
{a[*2:3][*]}, {a[*2 to 3][*]}
{a[*1..3][*]}, {a[*]}
{a[*][*2..3]}, {a[*]}
{a[*..3][*2]}, {a[*..6]}
{a[*..3][*to2]}, {a[*:6]}
{a[*..3][*2..$]}, {a[*]}
{a[*..3][*2:]}, {a[*:inf]}
{a[*1..]}, {a[+]}
{a[*1]}, {a}
{a[+][*1..3]}, {a[+]}
{a[*1..3][+]}, {a[+]}
{[*2][+]}, {[*2][+]}
{[+][*2]}, {[*2..inf]}
{0[=2]}, 0
{0[=2..]}, 0
{0[=1..10]}, 0
{0[=0]}, {[*]}
{0[=0..10]}, {*}
{0[=0..]}, {*}
{1[=0]}, {[*0]}
{1[=1..2]}, {[*1\,2]}
{1[=..4]}, {1[*..4]}
{b[=0]}, {(!b)[*]}
{b[=0to$]}, {*}
{0[->10..100];b}, 0
{0[->1..];b}, 0
{0[->0\,100];b}, b
{0[->0..$];b}, b
!{1[->0];b}, !b
{1[->10\,20];b}, {[*10..20];b}
{1[->..];b}, {[*1..];b}
{{a&!c}[->0];b}, b
EOF
cat >nequal.txt <<\EOF
# other formulae which are not
a, b
1, 0
a => b, b => a
a => b, a <=> b
a => b, a U b
a R b, a U b
a & b & c, c & a
b & c, c & a & b
a & b & (c |(f U g)| e), b & a & a & (c | e |(g U g)| e | c) & b
{a*}, {a*}<>->1
!{a*}, {a*}<>->1
{a*}, {a*}!
!{a*}, {a*}!
run 0 ../equals FFx Fx
run 0 ../equals FFFFFx Fx
run 0 ../equals GGx Gx
run 0 ../equals GGGGGx Gx
run 0 ../equals '!!x' x
run 0 ../equals '!!!!!x' '!x'
run 0 ../equals '{[*0];x}<>->1' '{x}<>->1'
run 0 ../equals '{x;[*0]}<>->1' '{x}<>-> 1'
run 0 ../equals '{[*0];x;[*0];[*0]}<>->1' '{x}<>->1'
run 0 ../equals '{[*0];x;[*0];x;[*0]}<>->1' '{x;x}<>->1'
run 0 ../equals '{x;x;x;[*0];x;x}<>->1' '{x;x;x;x;x}<>->1'
run 0 ../equals '{x;0;x;x;x}<>->1' '0'
run 0 ../equals '{x;0;x;x;x}[]->1' '1'
run 0 ../equals '{0*;1}<>->x' 'x'
run 0 ../equals '{[*0]*;1}<>->x' 'x'
run 0 ../equals '{x;x}<>->FF(0)' '0'
run 0 ../equals '{x;x}<>->GX(1)' '{x;x}<>->1'
run 0 ../equals '{x;x}[]->GX(1)' '1'
run 0 ../equals '{x;x}[]->FF(0)' '{x;x}[]->0'
run 0 ../equals '{x;x}[]->y' '{x;x}|->y'
run 0 ../equals '{x;x}[]->y' '{x;x}(y)'
run 0 ../equals '{a*}!' '{a*}<>->1'
run 0 ../equals '{a -> b} (c)' '!(a->b)|c'
run 0 ../equals '{a & !b}!' 'a & !b'
run 0 ../equals '{a;[*0]}|->!Xb' '!a | !Xb'
run 0 ../equals '{{a;b}:b:c:d*:e:f}!' '{{a;b}:{b && c }:d[*]:{e && f}}!'
run 0 ../equals '{a:b:c}|->!Xb' '!(a&&b&&c) | !Xb'
run 0 ../equals '{a:b:c*}|->!Xb' '{(a&&b):c*}|-> !Xb'
run 0 ../equals '{a&b&c*}|->!Xb' '{(a&&b)&c*}|-> !Xb'
run 0 ../equals '{[*]&&a&&[*]}!' 'a'
run 0 ../equals '{[*]||a||[*]}!' '{[*]}!'
run 0 ../equals '{0&{f;g*}}!' '0'
run 0 ../equals '{1&{f;g*}}!' '{f;g*}!'
# 1 should not be removed in the following two formulae # 1 should not be removed in the following two formulae
run 1 ../equals '{1&{g*}}!' '{g*}!' {1&{g*}}!, {g*}!
run 1 ../equals '{1|{b;c}}<>->a' '{b;c}<>->a' {1|{b;c}}<>->a, {b;c}<>->a
run 0 ../equals '{1:{a;b}:1:c*}!' '{{a;b}:c*}!'
run 0 ../equals '{c*:1:{a;b}:1}!' '{c*:{a;b}}!'
# make sure twin arguments are not reduced in Fusion. # make sure twin arguments are not reduced in Fusion.
run 1 ../equals '{(a;!a)*:(a;!a)*:b}!' '{(a;!a)*:b}!' {(a;!a)*:(a;!a)*:b}!, {(a;!a)*:b}!
# make sure 1:a* is not reduced to a*. # make sure 1:a* is not reduced to a*.
run 1 ../equals '{(1:a*);b}!' '{a*;b}!' {(1:a*);b}!, {a*;b}!
run 0 ../equals '{z;a*;b*;*;c;d;*;b*;e;a*;*;b*}' '{z;[*];c;d;[*];e;[*]}' EOF
run 0 ../equals '{((a;b)|[*0]);[*];c}!' '{[*];c}!'
run 0 ../equals '{a;a;a*;a;b;b[*];c[*2:3];c[*4:5]}' '{a[*3..];b[+];c[*6..8]}'
run 0 ../equals '{a[*0]}' '{[*0]}' run 0 ../equals equal.txt
run 0 ../equals '{a[*..]}' '{a[*]}' run 0 ../nequals nequal.txt
run 0 ../equals '{a[*2..3][*4..5]}' '{a[*8..15]}'
run 0 ../equals '{a[*4..5][*2..3]}' '{a[*4..5][*2..3]}'
run 0 ../equals '{a[*2:3][*]}' '{a[*2 to 3][*]}'
run 0 ../equals '{a[*1..3][*]}' '{a[*]}'
run 0 ../equals '{a[*][*2..3]}' '{a[*]}'
run 0 ../equals '{a[*..3][*2]}' '{a[*..6]}'
run 0 ../equals '{a[*..3][*to2]}' '{a[*:6]}'
run 0 ../equals '{a[*..3][*2..$]}' '{a[*]}'
run 0 ../equals '{a[*..3][*2:]}' '{a[*:inf]}'
run 0 ../equals '{a[*1..]}' '{a[+]}'
run 0 ../equals '{a[*1]}' '{a}'
run 0 ../equals '{a[+][*1..3]}' '{a[+]}'
run 0 ../equals '{a[*1..3][+]}' '{a[+]}'
run 0 ../equals '{[*2][+]}' '{[*2][+]}'
run 0 ../equals '{[+][*2]}' '{[*2..inf]}'
run 0 ../equals '{0[=2]}' '0'
run 0 ../equals '{0[=2..]}' '0'
run 0 ../equals '{0[=1..10]}' '0'
run 0 ../equals '{0[=0]}' '{[*]}'
run 0 ../equals '{0[=0..10]}' '{*}'
run 0 ../equals '{0[=0..]}' '{*}'
run 0 ../equals '{1[=0]}' '{[*0]}'
run 0 ../equals '{1[=1..2]}' '{[*1,2]}'
run 0 ../equals '{1[=..4]}' '{1[*..4]}'
run 0 ../equals '{b[=0]}' '{(!b)[*]}'
run 0 ../equals '{b[=0to$]}' '{*}'
run 0 ../equals '{0[->10..100];b}' '0'
run 0 ../equals '{0[->1..];b}' '0'
run 0 ../equals '{0[->0,100];b}' 'b'
run 0 ../equals '{0[->0..$];b}' 'b'
run 0 ../equals '!{1[->0];b}' '!b'
run 0 ../equals '{1[->10,20];b}' '{[*10..20];b}'
run 0 ../equals '{1[->..];b}' '{[*1..];b}'
run 0 ../equals '{{a&!c}[->0];b}' 'b'

View file

@ -58,6 +58,11 @@ main(int argc, char** argv)
if (argc != 2) if (argc != 2)
syntax(argv[0]); syntax(argv[0]);
std::ifstream input(argv[1]); std::ifstream input(argv[1]);
if (!input)
{
std::cerr << "failed to open " << argv[1] << '\n';
return 2;
}
std::string s; std::string s;
unsigned line = 0; unsigned line = 0;
@ -72,7 +77,16 @@ main(int argc, char** argv)
std::istringstream ss(s); std::istringstream ss(s);
std::string form; std::string form;
while (std::getline(ss, form, ',')) while (std::getline(ss, form, ','))
formulas.push_back(form); {
std::string tmp;
while (form.size() > 0 && form.back() == '\\'
&& std::getline(ss, tmp, ','))
{
form.back() = ',';
form += tmp;
}
formulas.push_back(form);
}
} }
unsigned size = formulas.size(); unsigned size = formulas.size();
@ -226,6 +240,9 @@ main(int argc, char** argv)
exit_code = 1; exit_code = 1;
} }
#if NEGATE
exit_code ^= 1;
#endif
if (exit_code) if (exit_code)
{ {
spot::ltl::dump(std::cerr, f1) << std::endl; spot::ltl::dump(std::cerr, f1) << std::endl;

View file

@ -19,42 +19,46 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
. ./defs || exit 1 . ./defs || exit 1
set -e
check() cat >reduceu.txt <<EOF
{ Xa | GFb, Xa | GFb
run 0 ../reduceu "$@" X(a | GXFb), Xa | GFb
} Xa & GFb, Xa & GFb
X(a & GXFb), Xa & GFb
check 'Xa | GFb' 'Xa | GFb' F(a & b & GFc & FGd), F(a & b) & G(Fc & FGd)
check 'X(a | GXFb)' 'Xa | GFb' Fa | Fb | GFc | GFd, F(a|b) | GF(c | d)
check 'Xa & GFb' 'Xa & GFb' Fa | Fb | GFc | GFd | FGe, F(a|b) | F(G(e) | GF(c | d))
check 'X(a & GXFb)' 'Xa & GFb' Ga | Gb | GFd | FGe | FGf, Ga | Gb | F(GFd | Ge | Gf)
check 'F(a & b & GFc & FGd)' 'F(a & b) & G(Fc & FGd)' G(Ga & Fb & c & GFd), G(a&c) & G(Fb & Fd)
check 'Fa | Fb | GFc | GFd' 'F(a|b) | GF(c | d)' G(Ga & GFb & c & GFd), G(a&c) & G(Fb & Fd)
check 'Fa | Fb | GFc | GFd | FGe' 'F(a|b) | F(G(e) | GF(c | d))' G(a & GFb & c & GFd), G(a&c) & G(Fb & Fd)
cehck 'Ga | Gb | GFd | FGe | FGf' 'Ga | Gb | F(GFd | Ge | Gf)' G(Ga & Fb & c & GFd & FGe), G(a & c) & G(Fb & Fd & FGe)
G(Ga & XFGb & c & FGd & FGe), FG(b & d & e) & G(a & c)
G(Ga & GXFb & c & FGd & FGe & Fc), G(Fb & FG(d & e)) & G(a & c)
Ga & Gb & GFd & FGe & FGf, G(Fd & FG(e & f)) & G(a & b)
G(Ga & Gb & GFd & FGe) & FGf, G(Fd & FG(e & f)) & G(a & b)
check 'G(Ga & Fb & c & GFd)' 'G(a&c) & G(Fb & Fd)' a U (b | Fc), (a U b) | Fc
check 'G(Ga & GFb & c & GFd)' 'G(a&c) & G(Fb & Fd)' a W (b | Fc), (a W b) | Fc
check 'G(a & GFb & c & GFd)' 'G(a&c) & G(Fb & Fd)' a U (b & GFc), (a U b) & GFc
check 'G(Ga & Fb & c & GFd & FGe)' 'G(a & c) & G(Fb & Fd & FGe)' # Unchanged
check 'G(Ga & XFGb & c & FGd & FGe)' 'FG(b & d & e) & G(a & c)' a W (b & GFc), a W (b & GFc)
check 'G(Ga & GXFb & c & FGd & FGe & Fc)' 'G(Fb & FG(d & e)) & G(a & c)' # Unchanged
check 'Ga & Gb & GFd & FGe & FGf' 'G(Fd & FG(e & f)) & G(a & b)' (a | Gc) W g, (a | Gc) W g
check 'G(Ga & Gb & GFd & FGe) & FGf' 'G(Fd & FG(e & f)) & G(a & b)' # Unchanged
(a | Gc) U g, (a | Gc) U g
check 'a U (b | Fc)' '(a U b) | Fc' (a & GFc) M b, (a M b) & GFc
check 'a W (b | Fc)' '(a W b) | Fc' # Unchanged
check 'a U (b & GFc)' '(a U b) & GFc' (a | GFc) M b, (a | GFc) M b
check 'a W (b & GFc)' 'a W (b & GFc)' # Unchanged # Unchanged
check '(a | Gc) W g' '(a | Gc) W g' # Unchanged (a & GFc) R b, (a & GFc) R b
check '(a | Gc) U g' '(a | Gc) U g' # Unchanged # Unchanged
(a | GFc) R b, (a | GFc) R b
check '(a & GFc) M b' '(a M b) & GFc' a R (b & Gc), (a R b) & Gc
check '(a | GFc) M b' '(a | GFc) M b' # Unchanged a M (b & Gc), (a M b) & Gc
check '(a & GFc) R b' '(a & GFc) R b' # Unchanged EOF
check '(a | GFc) R b' '(a | GFc) R b' # Unchanged
check 'a R (b & Gc)' '(a R b) & Gc'
check 'a M (b & Gc)' '(a M b) & Gc'
run 0 ../reduceu reduceu.txt

View file

@ -1,8 +1,9 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2009 Laboratoire de Recherche et Développement # -*- coding: utf-8 -*-
# Copyright (C) 2009, 2014 Laboratoire de Recherche et Développement
# de l'Epita (LRDE). # de l'Epita (LRDE).
# Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
# département Systèmes Répartis Coopératifs (SRC), Université Pierre # département Systèmes Répartis Coopératifs (SRC), Université Pierre
# et Marie Curie. # et Marie Curie.
# #
# This file is part of Spot, a model checking library. # This file is part of Spot, a model checking library.
@ -27,25 +28,27 @@
set -e set -e
cat >lunabbrev.txt<<EOF
# A few things that do not change # A few things that do not change
run 0 ../lunabbrev 'a' 'a' a, a
run 0 ../lunabbrev '1' '1' 1, 1
run 0 ../lunabbrev '0' '0' 0, 0
run 0 ../lunabbrev 'G a ' ' G a' G a , G a
run 0 ../lunabbrev 'a U b' 'a U b' a U b, a U b
run 0 ../lunabbrev 'a & b' 'a & b' a & b, a & b
run 0 ../lunabbrev 'a & b' 'b & a' a & b, b & a
run 0 ../lunabbrev 'a & b & c' 'c & a & b' a & b & c, c & a & b
run 0 ../lunabbrev 'a & b & c' 'b & c & a' a & b & c, b & c & a
run 0 ../lunabbrev 'a & b & a' 'b & a & b' a & b & a, b & a & b
run 0 ../lunabbrev 'a & b' 'b & a & b' a & b, b & a & b
run 0 ../lunabbrev 'a & b' 'b & a & a' a & b, b & a & a
run 0 ../lunabbrev 'a & b & (c |(f U g)| e)' \ a & b & (c |(f U g)| e), b & a & a & (c | e |(f U g)| e | c) & b
'b & a & a & (c | e |(f U g)| e | c) & b'
# other formulae that do change # other formulae that do change
run 0 ../lunabbrev 'a ^ b' '(a & !b) | (!a & b)' a ^ b, (a & !b) | (!a & b)
run 0 ../lunabbrev 'a ^ Xb' '(!Xb & a) | (!a & Xb) | (Xb & !a)' a ^ Xb, (!Xb & a) | (!a & Xb) | (Xb & !a)
run 0 ../lunabbrev 'GF a => F G(b)' '!GFa | F Gb' GF a => F G(b), !GFa | F Gb
run 0 ../lunabbrev '!a <-> Xb' '(Xb & !a) | (!!a & !Xb)' !a <-> Xb, (Xb & !a) | (!!a & !Xb)
run 0 ../lunabbrev '(a ^ b) | (b ^ c)' \ (a ^ b) | (b ^ c), (c & !b) | (!c & b) | (a & !b) | (!a & b)
'(c & !b) | (!c & b) | (a & !b) | (!a & b)' EOF
run 0 ../lunabbrev lunabbrev.txt

View file

@ -1,6 +1,7 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2009, 2010, 2011 Laboratoire de Recherche et Développement # -*- coding: utf-8 -*-
# de l'Epita (LRDE). # Copyright (C) 2009, 2010, 2011, 2014 Laboratoire de Recherche et
# Développement de l'Epita (LRDE).
# Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
# département Systèmes Répartis Coopératifs (SRC), Université Pierre # département Systèmes Répartis Coopératifs (SRC), Université Pierre
# et Marie Curie. # et Marie Curie.
@ -27,44 +28,46 @@
set -e set -e
cat >nenoform.txt<<EOF
# A few things that do not change # A few things that do not change
run 0 ../nenoform 'a' 'a' a, a
run 0 ../nenoform '1' '1' 1, 1
run 0 ../nenoform '0' '0' 0, 0
run 0 ../nenoform '!a' '!a' !a, !a
run 0 ../nenoform 'a U b' 'a U b' a U b, a U b
run 0 ../nenoform 'a & b' 'a & b' a & b, a & b
run 0 ../nenoform 'a & b' 'b & a' a & b, b & a
run 0 ../nenoform 'a & !b & c' 'c & a & !b' a & !b & c, c & a & !b
run 0 ../nenoform 'a & b & c' 'b & c & a' a & b & c, b & c & a
run 0 ../nenoform 'Xa & b & Xa' 'b & Xa & b' Xa & b & Xa, b & Xa & b
run 0 ../nenoform 'a & b' 'b & a & b' a & b, b & a & b
run 0 ../nenoform 'a & !b' '!b & a & a' a & !b, !b & a & a
run 0 ../nenoform 'a & b & (Xc |(f U !g)| e)' \ a & b & (Xc |(f U !g)| e), b & a & a & (Xc | e |(f U !g)| e | Xc) & b
'b & a & a & (Xc | e |(f U !g)| e | Xc) & b' GFa => FGb, FG!a || FGb
run 0 ../nenoform 'GFa => FGb' 'FG!a || FGb'
# Basic rewritings # Basic rewritings
run 0 ../nenoform '!!a' 'a' !!a, a
run 0 ../nenoform '!!!!!a' '!a' !!!!!a, !a
run 0 ../nenoform '!Xa' 'X!a' !Xa, X!a
run 0 ../nenoform '!Fa' 'G!a' !Fa, G!a
run 0 ../nenoform '!Ga' 'F!a' !Ga, F!a
run 0 ../nenoform '!(a ^ b)' '!a&!b | a&b' !(a ^ b), !a&!b | a&b
run 0 ../nenoform '!(a <=> b)' '(!a&b) | a&!b' !(a <=> b), (!a&b) | a&!b
run 0 ../nenoform '!(a => b)' 'a&!b' !(a => b), a&!b
run 0 ../nenoform '!(!a => !b)' '!a&b' !(!a => !b), !a&b
run 0 ../nenoform '!(a U b)' '!a R !b' !(a U b), !a R !b
run 0 ../nenoform '!(a R b)' '!a U !b' !(a R b), !a U !b
run 0 ../nenoform '!(!a R !b)' 'a U b' !(!a R !b), a U b
run 0 ../nenoform '!(a & b & c & d & b)' '!a | !b | !c | !d' !(a & b & c & d & b), !a | !b | !c | !d
run 0 ../nenoform '!(a | b | c | d)' '!a & !b & !c & !d' !(a | b | c | d), !a & !b & !c & !d
# Nested rewritings # Nested rewritings
run 0 ../nenoform '!(a U (!b U ((a & b & c) R d)))' \ !(a U (!b U ((a & b & c) R d))), !a R (b R ((!a | !b | !c) U !d))
'!a R (b R ((!a | !b | !c) U !d))' !(GF a => FG b), GFa & GF!b
run 0 ../nenoform '!(GF a => FG b)' 'GFa & GF!b'
# Rational operators # Rational operators
run 0 ../nenoform '!X{a;b}<>->Fx' 'X{a;b}[]->G!x' !X{a;b}<>->Fx, X{a;b}[]->G!x
run 0 ../nenoform '!F({a*}<>->{b*}<>->c)' 'G({a*}[]->{b*}[]->!c)' !F({a*}<>->{b*}<>->c), G({a*}[]->{b*}[]->!c)
EOF
run 0 ../nenoform nenoform.txt

View file

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2009, 2010, 2011, 2013 Laboratoire de Recherche et # Copyright (C) 2009, 2010, 2011, 2013, 2014 Laboratoire de Recherche et
# Développement de l'Epita (LRDE). # Développement de l'Epita (LRDE).
# Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
# département Systèmes Répartis Coopératifs (SRC), Université Pierre # département Systèmes Répartis Coopératifs (SRC), Université Pierre
@ -26,6 +26,7 @@
# resulting tree looks like. # resulting tree looks like.
. ./defs || exit 1 . ./defs || exit 1
set -e
check() check()
{ {
@ -64,33 +65,36 @@ check '' ''
check '+' '' check '+' ''
check '/2/3/4/5 a + b /6/7/8/' '' check '/2/3/4/5 a + b /6/7/8/' ''
cat >recover.txt <<EOF
# leading and trailing garbage are skipped # leading and trailing garbage are skipped
run 0 ../equals -E 'a U b c' 'a U b' a U b c, a U b
# (check multop merging while we are at it) # (check multop merging while we are at it)
run 0 ../equals -E 'a & b & c & d e' 'a & b & c & d' a & b & c & d e, a & b & c & d
run 0 ../equals -E 'a & (b | c) & d should work' 'a & (b | c) & d' a & (b | c) & d should work, a & (b | c) & d
# Binop recovery # Binop recovery
run 0 ../equals -E 'a U' a a U, a
run 0 ../equals -E 'a U b V c R' 'a U b V c' a U b V c R, a U b V c
run 0 ../equals -E 'a &&& b' 'a & b' a &&& b, a & b
run 0 ../equals -E 'a &&| b' 'a | b' a &&| b, a | b
# Recovery inside parentheses # Recovery inside parentheses
run 0 ../equals -E 'a U (b c) U e R (f g <=> h)' 'a U b U e R f' a U (b c) U e R (f g <=> h), a U b U e R f
run 0 ../equals -E 'a U ((c) U e) R (<=> f g)' 'a U ((c) U e) R (0)' a U ((c) U e) R (<=> f g), a U ((c) U e) R (0)
# Missing parentheses # Missing parentheses
run 0 ../equals -E 'a & (a + b' 'a & (a + b)' a & (a + b, a & (a + b)
run 0 ../equals -E 'a & (a + b c' 'a & (a + b)' a & (a + b c, a & (a + b)
run 0 ../equals -E 'a & (+' 'a & 0' a & (+, a & 0
run 0 ../equals -E 'a & (' 'a & 0' a & (, a & 0
# Invalid ranges # Invalid ranges
run 0 ../equals -E '{a[*8..1];b}' '{a[*1..8];b}' {a[*8..1];b}, {a[*1..8];b}
run 0 ../equals -E '{a[=8..1];b}' '{a[=1..8];b}' {a[=8..1];b}, {a[=1..8];b}
run 0 ../equals -E '{a[->8..1];b}' '{a[->1..8];b}' {a[->8..1];b}, {a[->1..8];b}
run 0 ../equals -E '{a[->..0];b}' '{a[->0..1];b}' {a[->..0];b}, {a[->0..1];b}
EOF
run 0 ../equals -E recover.txt
check 'a - b' 'AP(a)' '>>> a - b check 'a - b' 'AP(a)' '>>> a - b
^ ^

View file

@ -1,9 +1,10 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2009, 2010 Laboratoire de Recherche et Développement # -*- coding: utf-8-
# Copyright (C) 2009, 2010, 2014 Laboratoire de Recherche et Développement
# de l'Epita (LRDE). # de l'Epita (LRDE).
# Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6
# d<EFBFBD>partement Syst<73>mes R<>partis Coop<6F>ratifs (SRC), Universit<69> Pierre # (LIP6), département Systèmes Répartis Coopératifs (SRC), Université
# et Marie Curie. # Pierre et Marie Curie.
# #
# This file is part of Spot, a model checking library. # This file is part of Spot, a model checking library.
# #
@ -27,32 +28,33 @@
set -e set -e
cat >tunabbrev.txt<<EOF
# A few things that do not change # A few things that do not change
run 0 ../tunabbrev 'a' 'a' a, a
run 0 ../tunabbrev '1' '1' 1, 1
run 0 ../tunabbrev '0' '0' 0, 0
run 0 ../tunabbrev 'a U b' 'a U b' a U b, a U b
run 0 ../tunabbrev 'a & b' 'a & b' a & b, a & b
run 0 ../tunabbrev 'a & b' 'b & a' a & b, b & a
run 0 ../tunabbrev 'a & b & c' 'c & a & b' a & b & c, c & a & b
run 0 ../tunabbrev 'a & b & c' 'b & c & a' a & b & c, b & c & a
run 0 ../tunabbrev 'a & b & a' 'b & a & b' a & b & a, b & a & b
run 0 ../tunabbrev 'a & b' 'b & a & b' a & b, b & a & b
run 0 ../tunabbrev 'a & b' 'b & a & a' a & b, b & a & a
run 0 ../tunabbrev 'a & b & (c |(f U g)| e)' \ a & b & (c |(f U g)| e), b & a & a & (c | e |(f U g)| e | c) & b
'b & a & a & (c | e |(f U g)| e | c) & b'
# same as in lunabbrev.test: # same as in lunabbrev.test:
run 0 ../tunabbrev 'a ^ b' '(a & !b) | (!a & b)' a ^ b, (a & !b) | (!a & b)
run 0 ../tunabbrev 'a ^ Xb' '(!Xb & a) | (!a & Xb) | (Xb & !a)' a ^ Xb, (!Xb & a) | (!a & Xb) | (Xb & !a)
run 0 ../tunabbrev '!a <-> Xb' '(Xb & !a) | (!!a & !Xb)' !a <-> Xb, (Xb & !a) | (!!a & !Xb)
run 0 ../tunabbrev '(a ^ b) | (b ^ c)' \ (a ^ b) | (b ^ c), (c & !b) | (!c & b) | (a & !b) | (!a & b)
'(c & !b) | (!c & b) | (a & !b) | (!a & b)'
# LTL unabbreviations: # LTL unabbreviations:
run 0 ../tunabbrev 'G a ' 'false R a' G a , false R a
run 0 ../tunabbrev 'GF a => F G(b)' \ GF a => F G(b), !(false R (true U a)) | (true U (false V b))
'!(false R (true U a)) | (true U (false V b))' GGGGa, false V a
run 0 ../tunabbrev 'GGGGa' 'false V a' FFFfalse, 0
run 0 ../tunabbrev 'FFFfalse' '0' FFFf, true U f
run 0 ../tunabbrev 'FFFf' 'true U f' EOF
run 0 ../tunabbrev tunabbrev.txt

View file

@ -1,8 +1,9 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2009 Laboratoire de Recherche et Développement # -*- coding: utf-8 -*-
# Copyright (C) 2009, 2014 Laboratoire de Recherche et Développement
# de l'Epita (LRDE). # de l'Epita (LRDE).
# Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6), # Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6),
# département Systèmes Répartis Coopératifs (SRC), Université Pierre # département Systèmes Répartis Coopératifs (SRC), Université Pierre
# et Marie Curie. # et Marie Curie.
# #
# This file is part of Spot, a model checking library. # This file is part of Spot, a model checking library.
@ -27,10 +28,14 @@
set -e set -e
run 0 ../tunenoform '!(a ^ b)' '(a|!b) & (!a|b)' cat >tunenoform.txt<<EOF
run 0 ../tunenoform '!(a <=> b)' '(a|b) & (!a|!b)' !(a ^ b), (a|!b) & (!a|b)
run 0 ../tunenoform '!(a => b)' 'a&!b' !(a <=> b), (a|b) & (!a|!b)
run 0 ../tunenoform '!(!a => !b)' '!a&b' !(a => b), a&!b
run 0 ../tunenoform '!Fa' 'false R !a' !(!a => !b), !a&b
run 0 ../tunenoform '!G!a' 'true U a' !Fa, false R !a
run 0 ../tunenoform '!(GF a => FG b)' '(0 R (1 U a)) & (0 R (1 U !b))' !G!a, true U a
!(GF a => FG b), (0 R (1 U a)) & (0 R (1 U !b))
EOF
run 0 ../tunenoform tunenoform.txt