introduce op::strong_X
This was prompted by reports by Andrew Wells and Yong Li. * NEWS, doc/tl/tl.tex: Document the changes. * THANKS: Add Andrew. * bin/ltlfilt.cc: Match --ltl before --from-ltlf if needed. * spot/parsetl/parsedecl.hh, spot/parsetl/parsetl.yy, spot/parsetl/scantl.ll: Parse X[!]. * spot/tl/formula.cc, spot/tl/formula.hh: Declare the new operator. * spot/tl/ltlf.cc: Adjust to handle op::X and op::strong_X correctly. * spot/tl/dot.cc, spot/tl/mark.cc, spot/tl/mutation.cc, spot/tl/print.cc, spot/tl/simplify.cc, spot/tl/snf.cc, spot/tl/unabbrev.cc, spot/twa/formula2bdd.cc, spot/twaalgos/ltl2taa.cc, spot/twaalgos/ltl2tgba_fm.cc, tests/core/ltlgrind.test, tests/core/rand.test, tests/core/sugar.test, tests/python/randltl.ipynb: Adjust. * tests/core/ltlfilt.test, tests/core/sugar.test, tests/core/utf8.test: More tests.
This commit is contained in:
parent
b91ba58bbe
commit
be389c5c25
26 changed files with 434 additions and 134 deletions
|
|
@ -48,6 +48,8 @@ G(a & Xb)
|
|||
Xa
|
||||
F(a & !Xa & Xb)
|
||||
{a & {b|c} }
|
||||
((a && b) U (! (X 1)))
|
||||
((a && b) U (! (X[!] 1)))
|
||||
|
||||
{a[=2:3]}|->b
|
||||
{a[->2:3]}|->b
|
||||
|
|
@ -63,6 +65,7 @@ EOF
|
|||
|
||||
checkopt --boolean <<EOF
|
||||
a & (b | c)
|
||||
0
|
||||
EOF
|
||||
|
||||
checkopt --bsize-min=2 --bsize-max=4 <<EOF
|
||||
|
|
@ -81,6 +84,8 @@ F(GFa | Gb)
|
|||
F(b W GFa)
|
||||
a U Fb
|
||||
F(a & !Xa & Xb)
|
||||
0
|
||||
(a & b) U !X[!]1
|
||||
EOF
|
||||
|
||||
checkopt --universal <<EOF
|
||||
|
|
@ -88,16 +93,19 @@ GFa | FGb
|
|||
F(GFa | Gb)
|
||||
GFa | Gb
|
||||
G(a & Xb)
|
||||
0
|
||||
EOF
|
||||
|
||||
checkopt --eventual --universal <<EOF
|
||||
GFa | FGb
|
||||
F(GFa | Gb)
|
||||
0
|
||||
EOF
|
||||
|
||||
checkopt --suspendable <<EOF
|
||||
GFa | FGb
|
||||
F(GFa | Gb)
|
||||
0
|
||||
EOF
|
||||
|
||||
checkopt --stutter-invariant <<EOF
|
||||
|
|
@ -110,6 +118,8 @@ b W GFa
|
|||
a U Fb
|
||||
F(a & !Xa & Xb)
|
||||
a & (b | c)
|
||||
0
|
||||
(a & b) U !X[!]1
|
||||
{{!a}[*];a[+]}[]-> b
|
||||
{a[*];{!a}[*];a[*]}[]-> b
|
||||
{a[*];{!a}[+];a[*]}[]-> b
|
||||
|
|
@ -120,7 +130,7 @@ a & (b | c)
|
|||
EOF
|
||||
|
||||
checkopt -c --stutter-invariant <<EOF
|
||||
16
|
||||
18
|
||||
EOF
|
||||
|
||||
checkopt --syntactic-stutter-invariant <<EOF
|
||||
|
|
@ -131,6 +141,7 @@ GFa | Gb
|
|||
b W GFa
|
||||
a U Fb
|
||||
a & (b | c)
|
||||
0
|
||||
{{!a}[*];a[+]}[]-> b
|
||||
{a[*];{!a}[*];a[*]}[]-> b
|
||||
{a[*];{!a}[+];a[*]}[]-> b
|
||||
|
|
@ -152,6 +163,8 @@ G(a & Xb)
|
|||
Xa
|
||||
F(a & X(!a & b))
|
||||
a & (b | c)
|
||||
0
|
||||
0
|
||||
a R (!a | X({a[->1..2]}[]-> (b & X(b W a))))
|
||||
a R (!a | X({a[->1..2]}[]-> b))
|
||||
a R (b W !a)
|
||||
|
|
@ -169,6 +182,7 @@ F(GFa | Gb)
|
|||
F(b W GFa)
|
||||
Fb
|
||||
F(a & X(!a & b))
|
||||
0
|
||||
EOF
|
||||
|
||||
checkopt --liveness <<EOF
|
||||
|
|
@ -186,6 +200,8 @@ checkopt --safety <<EOF
|
|||
G(a & Xb)
|
||||
Xa
|
||||
a & (b | c)
|
||||
0
|
||||
(a & b) U !X[!]1
|
||||
{a[=2..3]}[]-> b
|
||||
{a[->2..3]}[]-> b
|
||||
{{!a}[*];a[+]}[]-> b
|
||||
|
|
@ -206,6 +222,8 @@ G(a & Xb)
|
|||
Xa
|
||||
F(a & !Xa & Xb)
|
||||
a & (b | c)
|
||||
0
|
||||
(a & b) U !X[!]1
|
||||
{a[=2..3]}[]-> b
|
||||
{a[->2..3]}[]-> b
|
||||
{{!a}[*];a[+]}[]-> b
|
||||
|
|
@ -224,6 +242,8 @@ a U Fb
|
|||
Xa
|
||||
F(a & !Xa & Xb)
|
||||
a & (b | c)
|
||||
0
|
||||
(a & b) U !X[!]1
|
||||
EOF
|
||||
|
||||
checkopt -v --ltl <<EOF
|
||||
|
|
@ -251,6 +271,8 @@ a U Fb
|
|||
G(a & Xb)
|
||||
Xa
|
||||
F(a & !Xa & Xb)
|
||||
0
|
||||
(a & b) U !X[!]1
|
||||
{a[=2..3]}[]-> b
|
||||
{a[->2..3]}[]-> b
|
||||
{{!a}[*];a[+]}[]-> b
|
||||
|
|
@ -273,6 +295,7 @@ a U Fb
|
|||
G(a & Xb)
|
||||
F(a & !Xa & Xb)
|
||||
a & (b | c)
|
||||
(a & b) U !X[!]1
|
||||
{a[=2..3]}[]-> b
|
||||
{a[->2..3]}[]-> b
|
||||
{{!a}[*];a[+]}[]-> b
|
||||
|
|
@ -300,10 +323,6 @@ F(GFa | Gb)
|
|||
F(b W GFa)
|
||||
EOF
|
||||
|
||||
# Restrict to LTL
|
||||
run 0 ltlfilt --ltl formulas > formulas2
|
||||
mv formulas2 formulas
|
||||
|
||||
checkopt --ltl --from-ltlf=al <<EOF
|
||||
al & (G(!al | F(a & al)) | F(al & G(!al | b))) & (al U G!al)
|
||||
al & F(al & (G(!al | F(a & al)) | G(!al | b))) & (al U G!al)
|
||||
|
|
@ -311,10 +330,12 @@ al & F(al & ((!al | b) W G(!al | F(a & al)))) & (al U G!al)
|
|||
al & (G(!al | F(a & al)) | G(!al | b)) & (al U G!al)
|
||||
al & ((!al | b) W G(!al | F(a & al))) & (al U G!al)
|
||||
al & (a U (al & F(al & b))) & (al U G!al)
|
||||
al & G(!al | (a & X(al & b))) & (al U G!al)
|
||||
al & X(a & al) & (al U G!al)
|
||||
al & F(a & al & !X(a & al) & X(al & b)) & (al U G!al)
|
||||
al & G(!al | (a & X(!al | b))) & (al U G!al)
|
||||
al & X(a | !al) & (al U G!al)
|
||||
al & F(a & al & !X(a | !al) & X(!al | b)) & (al U G!al)
|
||||
a & al & (b | c) & (al U G!al)
|
||||
0
|
||||
al & ((a & b) U (al & !X[!]al)) & (al U G!al)
|
||||
EOF
|
||||
|
||||
checkopt --ltl --from-ltlf='!dead' <<EOF
|
||||
|
|
@ -324,10 +345,12 @@ checkopt --ltl --from-ltlf='!dead' <<EOF
|
|||
!dead & (G(dead | F(a & !dead)) | G(b | dead)) & (!dead U Gdead)
|
||||
!dead & ((b | dead) W G(dead | F(a & !dead))) & (!dead U Gdead)
|
||||
!dead & (a U (!dead & F(b & !dead))) & (!dead U Gdead)
|
||||
!dead & G(dead | (a & X(b & !dead))) & (!dead U Gdead)
|
||||
!dead & X(a & !dead) & (!dead U Gdead)
|
||||
!dead & F(a & !dead & !X(a & !dead) & X(b & !dead)) & (!dead U Gdead)
|
||||
!dead & G(dead | (a & X(b | dead))) & (!dead U Gdead)
|
||||
!dead & X(a | dead) & (!dead U Gdead)
|
||||
!dead & F(a & !dead & !X(a | dead) & X(b | dead)) & (!dead U Gdead)
|
||||
a & !dead & (b | c) & (!dead U Gdead)
|
||||
0
|
||||
!dead & ((a & b) U (!dead & !X[!]!dead)) & (!dead U Gdead)
|
||||
EOF
|
||||
|
||||
cat >in <<EOF
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2014, 2015 Laboratoire de Recherche et Développement
|
||||
# Copyright (C) 2014, 2015, 2019 Laboratoire de Recherche et Développement
|
||||
# de l'Epita (LRDE).
|
||||
#
|
||||
# This file is part of Spot, a model checking library.
|
||||
|
|
@ -52,6 +52,7 @@ p1 U (p4 | (p3 xor (p4 W p0)))
|
|||
1 U (p4 | (p3 xor (p4 W p0)))
|
||||
Xp1 U (p4 | !(p4 W p0))
|
||||
Xp1 W (p4 | (p3 xor (p4 W p0)))
|
||||
X(0) U (p4 | (p3 xor (p4 W p0)))
|
||||
Xp1 U (p4 | (p3 xor (p4 W 0)))
|
||||
Xp4 U (p4 | (p3 xor (p4 W p0)))
|
||||
Xp3 U (p4 | (p3 xor (p4 W p0)))
|
||||
|
|
@ -74,10 +75,10 @@ Xp4 R p3
|
|||
p3 W !p0
|
||||
Xp4 W !p0
|
||||
(p4 R p3) W !p0
|
||||
(0 R p3) W !p0
|
||||
(Xp4 R p3) W p0
|
||||
(Xp4 R p3) W 0
|
||||
(p3 W Xp4) W !p0
|
||||
(X(0) R p3) W !p0
|
||||
(Xp3 R p3) W !p0
|
||||
(Xp0 R p3) W !p0
|
||||
(Xp4 R p4) W !p0
|
||||
|
|
@ -180,11 +181,11 @@ F!{{p2;p0}[:*]}
|
|||
{{p2;p0}[:*]}[]-> Xp0
|
||||
F({p2;p0}[]-> Xp0)
|
||||
F({{p2;p0}[:*]}[]-> p0)
|
||||
F({{p2;p0}[:*]}[]-> 0)
|
||||
F({p0[*2][:*]}[]-> Xp0)
|
||||
F({p2[*2][:*]}[]-> Xp2)
|
||||
F({{1;p0}[:*]}[]-> Xp0)
|
||||
F({{p2;1}[:*]}[]-> Xp0)
|
||||
F({{p2;p0}[:*]}[]-> X(0))
|
||||
EOF
|
||||
|
||||
echo '1,a,3' > input
|
||||
|
|
|
|||
|
|
@ -114,17 +114,19 @@ grep -q p2 out
|
|||
grep p3 out && exit 1
|
||||
|
||||
|
||||
# We should be able to generate exactly two formulas with 0 atomic
|
||||
# propositions.
|
||||
run 0 randltl -n2 0 | sort > out
|
||||
# We should be able to generate exactly three formulas with 0 atomic
|
||||
# propositions and at most 2 nodes.
|
||||
run 0 randltl -n3 --tree-size=..2 0 > out
|
||||
sort <out >out2
|
||||
cat >expected <<EOF
|
||||
0
|
||||
1
|
||||
X(0)
|
||||
EOF
|
||||
diff out expected
|
||||
diff out2 expected
|
||||
|
||||
# requesting more formulas should fail
|
||||
run 2 randltl -n3 0
|
||||
run 2 randltl -n4 --tree-size=..2 0
|
||||
|
||||
# If more numbers are given, there are interpreted as atomic propositions
|
||||
run 0 randltl -n1000 0 1 > out
|
||||
|
|
|
|||
|
|
@ -24,19 +24,24 @@
|
|||
|
||||
set -e
|
||||
|
||||
cat >ok.in <<EOF
|
||||
cat >ok.in <<\EOF
|
||||
X[4]a
|
||||
X[3!]a
|
||||
G[2:4]a
|
||||
G[4:2]a
|
||||
F[2:4]a
|
||||
F[4:2]a
|
||||
F[2:$]a
|
||||
F[2..]a
|
||||
F[2:$!]a
|
||||
F[2:3!]a
|
||||
X [4]a | b
|
||||
G [2:4] a | b
|
||||
G [4:2] a | b
|
||||
G [2:] a | b
|
||||
G [2..] a | b
|
||||
G [2..!] a | b
|
||||
G [2..3!] a | b
|
||||
F [2:4] a | b
|
||||
F [4:2]a | F[2:2]b
|
||||
F[]a|G[]b|X[]c
|
||||
|
|
@ -59,19 +64,24 @@ EOF
|
|||
|
||||
ltlfilt -F ok.in > ok.out
|
||||
|
||||
cat >expect <<EOF
|
||||
cat >expect <<\EOF
|
||||
XXXXa
|
||||
X[!]X[!]X[!]a
|
||||
XX(a & X(a & Xa))
|
||||
XX(a & X(a & Xa))
|
||||
XX(a | X(a | Xa))
|
||||
XX(a | X(a | Xa))
|
||||
XXFa
|
||||
XXFa
|
||||
X[!]X[!]Fa
|
||||
X[!]X[!](a | X[!]a)
|
||||
b | XXXXa
|
||||
b | XX(a & X(a & Xa))
|
||||
b | XX(a & X(a & Xa))
|
||||
b | XXGa
|
||||
b | XXGa
|
||||
b | X[!]X[!]Ga
|
||||
b | X[!]X[!](a & X[!]a)
|
||||
b | XX(a | X(a | Xa))
|
||||
XX(a | X(a | Xa)) | XXb
|
||||
FGa | Gb | XGc
|
||||
|
|
@ -99,14 +109,19 @@ cat >err.in <<EOF
|
|||
F[
|
||||
F[3:1]
|
||||
F[3:1][2:1]
|
||||
F[2]a
|
||||
F[2!]a
|
||||
F[a
|
||||
G[2:4]
|
||||
G[2:.]a
|
||||
G[4]a
|
||||
G[4!]a
|
||||
G[a
|
||||
X[2
|
||||
X[2]
|
||||
X[2:3]
|
||||
X[2:4]a
|
||||
X[2:4!]a
|
||||
X[a
|
||||
{a ## b}
|
||||
{a ##7}
|
||||
|
|
@ -122,6 +137,7 @@ numoreof="$num or end of formula"
|
|||
sep="separator for square bracket operator"
|
||||
undefined='$undefined'
|
||||
closingbkt='square bracket operator, expecting closing bracket'
|
||||
eclosingbkt='expecting closing bracket or closing !]'
|
||||
|
||||
ltlfilt -F err.in 2>err && exit 1
|
||||
cat >expect2 <<EOF
|
||||
|
|
@ -153,6 +169,16 @@ missing right operand for "F[.] operator"
|
|||
ignoring trailing garbage
|
||||
|
||||
ltlfilt:err.in:4: parse error:
|
||||
>>> F[2]a
|
||||
^^^^
|
||||
F[n:m] expects two parameters
|
||||
|
||||
ltlfilt:err.in:5: parse error:
|
||||
>>> F[2!]a
|
||||
^^^^^
|
||||
F[n:m!] expects two parameters
|
||||
|
||||
ltlfilt:err.in:6: parse error:
|
||||
>>> F[a
|
||||
^
|
||||
syntax error, unexpected $undefined, expecting $numoreof
|
||||
|
|
@ -161,7 +187,7 @@ syntax error, unexpected $undefined, expecting $numoreof
|
|||
^^^
|
||||
missing closing bracket for F[.]
|
||||
|
||||
ltlfilt:err.in:5: parse error:
|
||||
ltlfilt:err.in:7: parse error:
|
||||
>>> G[2:4]
|
||||
^
|
||||
syntax error, unexpected end of formula
|
||||
|
|
@ -170,21 +196,26 @@ syntax error, unexpected end of formula
|
|||
^^^^^^
|
||||
missing right operand for "G[.] operator"
|
||||
|
||||
ltlfilt:err.in:6: parse error:
|
||||
ltlfilt:err.in:8: parse error:
|
||||
>>> G[2:.]a
|
||||
^
|
||||
syntax error, unexpected $undefined, expecting closing bracket
|
||||
syntax error, unexpected $undefined, $eclosingbkt
|
||||
|
||||
>>> G[2:.]a
|
||||
^^^^^^
|
||||
treating this G[.] as a simple G
|
||||
|
||||
ltlfilt:err.in:7: parse error:
|
||||
ltlfilt:err.in:9: parse error:
|
||||
>>> G[4]a
|
||||
^^^^
|
||||
G[n:m] expects two parameters
|
||||
|
||||
ltlfilt:err.in:8: parse error:
|
||||
ltlfilt:err.in:10: parse error:
|
||||
>>> G[4!]a
|
||||
^^^^^
|
||||
G[n:m!] expects two parameters
|
||||
|
||||
ltlfilt:err.in:11: parse error:
|
||||
>>> G[a
|
||||
^
|
||||
syntax error, unexpected $undefined, expecting $numoreof
|
||||
|
|
@ -193,16 +224,16 @@ syntax error, unexpected $undefined, expecting $numoreof
|
|||
^^^
|
||||
missing closing bracket for G[.]
|
||||
|
||||
ltlfilt:err.in:9: parse error:
|
||||
ltlfilt:err.in:12: parse error:
|
||||
>>> X[2
|
||||
^
|
||||
syntax error, unexpected end of formula, expecting closing bracket
|
||||
syntax error, unexpected end of formula, $eclosingbkt
|
||||
|
||||
>>> X[2
|
||||
^^^
|
||||
missing closing bracket for X[.]
|
||||
|
||||
ltlfilt:err.in:10: parse error:
|
||||
ltlfilt:err.in:13: parse error:
|
||||
>>> X[2]
|
||||
^
|
||||
syntax error, unexpected end of formula
|
||||
|
|
@ -211,25 +242,43 @@ syntax error, unexpected end of formula
|
|||
^^^^
|
||||
missing right operand for "X[.] operator"
|
||||
|
||||
ltlfilt:err.in:11: parse error:
|
||||
ltlfilt:err.in:14: parse error:
|
||||
>>> X[2:3]
|
||||
^
|
||||
syntax error, unexpected separator for square bracket operator, $eclosingbkt
|
||||
|
||||
>>> X[2:3]
|
||||
^^^^^^
|
||||
missing closing bracket for X[.]
|
||||
|
||||
ltlfilt:err.in:15: parse error:
|
||||
>>> X[2:4]a
|
||||
^
|
||||
syntax error, unexpected $sep, expecting closing bracket
|
||||
syntax error, unexpected $sep, $eclosingbkt
|
||||
|
||||
>>> X[2:4]a
|
||||
^^^^^^^
|
||||
treating this X[.] as a simple X
|
||||
|
||||
ltlfilt:err.in:12: parse error:
|
||||
ltlfilt:err.in:16: parse error:
|
||||
>>> X[2:4!]a
|
||||
^
|
||||
syntax error, unexpected separator for square bracket operator, $eclosingbkt
|
||||
|
||||
>>> X[2:4!]a
|
||||
^^^^^^^^
|
||||
treating this X[.!] as a simple X[!]
|
||||
|
||||
ltlfilt:err.in:17: parse error:
|
||||
>>> X[a
|
||||
^
|
||||
syntax error, unexpected $undefined, expecting $numoreof
|
||||
syntax error, unexpected $undefined, expecting closing !] or $numoreof
|
||||
|
||||
>>> X[a
|
||||
^^^
|
||||
missing closing bracket for X[.]
|
||||
|
||||
ltlfilt:err.in:13: parse error:
|
||||
ltlfilt:err.in:18: parse error:
|
||||
>>> {a ## b}
|
||||
^
|
||||
syntax error, unexpected $undefined
|
||||
|
|
@ -238,7 +287,7 @@ syntax error, unexpected $undefined
|
|||
^^^^
|
||||
ignoring this
|
||||
|
||||
ltlfilt:err.in:14: parse error:
|
||||
ltlfilt:err.in:19: parse error:
|
||||
>>> {a ##7}
|
||||
^
|
||||
syntax error, unexpected closing brace
|
||||
|
|
@ -247,7 +296,7 @@ syntax error, unexpected closing brace
|
|||
^^^
|
||||
missing right operand for "SVA delay operator"
|
||||
|
||||
ltlfilt:err.in:15: parse error:
|
||||
ltlfilt:err.in:20: parse error:
|
||||
>>> {a ##[::] b}
|
||||
^
|
||||
syntax error, unexpected separator for $closingbkt
|
||||
|
|
@ -256,12 +305,12 @@ syntax error, unexpected separator for $closingbkt
|
|||
^^^^^^
|
||||
treating this delay block as ##1
|
||||
|
||||
ltlfilt:err.in:16: parse error:
|
||||
ltlfilt:err.in:21: parse error:
|
||||
>>> {a ##[2:1] b}
|
||||
^
|
||||
reversed range
|
||||
|
||||
ltlfilt:err.in:17: parse error:
|
||||
ltlfilt:err.in:22: parse error:
|
||||
>>> {a ##[1:2]}
|
||||
^
|
||||
syntax error, unexpected closing brace
|
||||
|
|
@ -270,7 +319,7 @@ syntax error, unexpected closing brace
|
|||
^^^^^^^
|
||||
missing right operand for "SVA delay operator"
|
||||
|
||||
ltlfilt:err.in:18: parse error:
|
||||
ltlfilt:err.in:23: parse error:
|
||||
>>> {##[1:2]}
|
||||
^
|
||||
syntax error, unexpected closing brace
|
||||
|
|
@ -280,4 +329,4 @@ syntax error, unexpected closing brace
|
|||
missing right operand for "SVA delay operator"
|
||||
|
||||
EOF
|
||||
diff err expect2
|
||||
diff -u err expect2
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2012, 2013, 2015, 2016 Laboratoire de Recherche et
|
||||
# Copyright (C) 2012, 2013, 2015, 2016, 2019 Laboratoire de Recherche et
|
||||
# Développement de l'Epita (LRDE).
|
||||
#
|
||||
# This file is part of Spot, a model checking library.
|
||||
|
|
@ -64,3 +64,9 @@ diff expected output
|
|||
|
||||
randltl --psl -8 --seed 0 --tree-size 16 a b c -n 100 > formulae
|
||||
../reduc -f -h 0 formulae
|
||||
|
||||
echo 'Ⓧa' >in
|
||||
ltlfilt -8 -f 'X[!]a' >out
|
||||
diff in out
|
||||
ltlfilt -8 -F in >out
|
||||
diff in out
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue