formula: fix syntactic-SI detection for ; operator

Reported by Victor Khomenko.

* spot/tl/formula.cc: Rewrite the siPSL detection for ";".
* tests/core/ltlfilt.test: Add more tests.
* tests/core/kind.test: Adjust.
* NEWS: Mention the bug.
This commit is contained in:
Alexandre Duret-Lutz 2019-04-26 15:55:52 +02:00
parent b928d8c82a
commit 38f0cfd4c0
4 changed files with 119 additions and 29 deletions

View file

@ -1,6 +1,6 @@
#! /bin/sh
# -*- coding: utf-8 -*-
# Copyright (C) 2010, 2011, 2012, 2015, 2017 Laboratoire de Recherche
# Copyright (C) 2010-2012, 2015, 2017, 2019 Laboratoire de Recherche
# et Développement de l'Epita (LRDE).
#
# This file is part of Spot, a model checking library.
@ -59,12 +59,13 @@ Fa -> Gb,xLPsopra
{a;c*;b}|->F!b,&!Pra
{a;c*;b}|->GFa,&!Pra
{a;c*;b}|->FGa,&!Pa
{a[+];c[+];b*}|->!Fb,&xPsopra
{a[+];c*;b[+]}|->G!b,&!xPsopra
{a*;c[+];b[+]}|->!Gb,&xPra
{a[+];c*;b[+]}|->F!b,&!xPra
{a[+];c[+];b*}|->GFa,&!xPra
{a*;c[+];b[+]}|->FGa,&!xPa
{a[+];c[+];b*}|->!Fb,&Psopra
{a*;c[+];b*}|->!Fb,&xPsopra
{a[+];c*;b[+]}|->G!b,&!Psopra
{a*;c[+];b[+]}|->!Gb,&Pra
{a[+];c*;b[+]}|->F!b,&!Pra
{a[+];c[+];b*}|->GFa,&!Pra
{a*;c[+];b[+]}|->FGa,&!Pa
{a;c;b|(d;e)}|->!Xb,&fPFsgopra
{a;c;b|(d;e)}|->X!b,&!fPFsgopra
{a;c;b|(d;e)}|->!Fb,&Psopra
@ -87,7 +88,7 @@ Fa -> Gb,xLPsopra
{a;c*;b}<>->!GFb,&Ppa
{a;c*;b}<>->GFb,&!Pa
{a;c*;b}<>->!FGb,&Pa
{a*;c[+];b[+]}<>->!FGb,&xPa
{a*;c[+];b[+]}<>->!FGb,&Pa
{a;c|d;b}<>->!Gb,&Pgopra
{a;c|d;b}<>->G!b,&!Psopra
{a;c|d;b}<>->FGb,&!Ppa
@ -126,8 +127,9 @@ Fa M b,&!xLPgopra
!{a;b*;c}!,&fPsopra
{a;b*;p112}[]->0,&!fPsopra
!{a;b*;c.2},&!fPgopr
!{a[+];b*;c[+]},&!xfPgopra
{a[+];b*;c[+]},&!xfPsopra
!{a[+];b*;c[+]},&!fPgopra
!{a[+];b*;c*},&!xfPgopra
{a[+];b*;c[+]},&!fPsopra
{a[+] && b || c[+]},&!fPsopra
{a[+] && b[+] || c[+]},&!xfPsopra
{p[+]:p[+]},&!xfPsoprla

View file

@ -1,6 +1,6 @@
#! /bin/sh
# -*- coding: utf-8 -*-
# Copyright (C) 2013-2018 Laboratoire de Recherche et Développement de
# Copyright (C) 2013-2019 Laboratoire de Recherche et Développement de
# l'Epita (LRDE).
#
# This file is part of Spot, a model checking library.
@ -29,7 +29,7 @@ checkopt()
{
cat >exp
run 0 ltlfilt "$@" formulas > out
diff exp out
diff -u exp out
}
# The empty lines in the file are meant, we want to make sure that
@ -48,6 +48,16 @@ G(a & Xb)
Xa
F(a & !Xa & Xb)
{a & {b|c} }
{a[=2:3]}|->b
{a[->2:3]}|->b
{a[->1];a*}|->b /* becomes {(!a)*;a[+]}|->b */
{a*;(!a)*;a*}|->b
{a*;(!a)[+];a*}|->b
{a[+];(!a)*;a*}|->b
{a*;(!a)*;a[+]}|->b
{a*;(!a)[+];a[+]}|->b
{a*;(!c)[+];a[+]}|->b
EOF
checkopt --boolean <<EOF
@ -99,10 +109,30 @@ b W GFa
a U Fb
F(a & !Xa & Xb)
a & (b | c)
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[*];a[*]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[+]}[]-> b
EOF
checkopt -c --stutter-invariant <<EOF
9
15
EOF
checkopt --syntactic-stutter-invariant <<EOF
GFa | FGb
F(GFa | Gb)
F(b W GFa)
GFa | Gb
b W GFa
a U Fb
a & (b | c)
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
EOF
checkopt --simplify <<EOF
@ -118,6 +148,15 @@ G(a & Xb)
Xa
F(a & X(!a & b))
a & (b | c)
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)
{a[*];{!a}[*];a[*]}[]-> b
!a R ((b & X(b W !a)) W a)
(b & X((b W !a) & ((b & X(b W !a)) W a))) W !a
!a R (a R (b W !a))
!a R (a | X(a R (b W !a)))
!a R (c | X(c R (b W !a)))
EOF
checkopt --simplify --eventual --unique <<EOF
@ -142,6 +181,15 @@ checkopt --safety <<EOF
G(a & Xb)
Xa
a & (b | c)
{a[=2..3]}[]-> b
{a[->2..3]}[]-> b
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[*];a[*]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[+]}[]-> b
{a[*];{!c}[+];a[+]}[]-> b
EOF
checkopt --obligation <<EOF
@ -152,6 +200,15 @@ G(a & Xb)
Xa
F(a & !Xa & Xb)
a & (b | c)
{a[=2..3]}[]-> b
{a[->2..3]}[]-> b
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[*];a[*]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[+]}[]-> b
{a[*];{!c}[+];a[+]}[]-> b
EOF
checkopt --guarantee <<EOF
@ -165,6 +222,15 @@ EOF
checkopt -v --ltl <<EOF
!({a;b[*];c}!)
!{a:b[*]:c}
{a[=2..3]}[]-> b
{a[->2..3]}[]-> b
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[*];a[*]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[+]}[]-> b
{a[*];{!c}[+];a[+]}[]-> b
EOF
checkopt -v --ap=3 <<EOF
@ -177,6 +243,14 @@ a U Fb
G(a & Xb)
Xa
F(a & !Xa & Xb)
{a[=2..3]}[]-> b
{a[->2..3]}[]-> b
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[*];a[*]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[+]}[]-> b
EOF
checkopt --ap=2..3 <<EOF
@ -191,12 +265,24 @@ a U Fb
G(a & Xb)
F(a & !Xa & Xb)
a & (b | c)
{a[=2..3]}[]-> b
{a[->2..3]}[]-> b
{{!a}[*];a[+]}[]-> b
{a[*];{!a}[*];a[*]}[]-> b
{a[*];{!a}[+];a[*]}[]-> b
{a[+];{!a}[*];a[*]}[]-> b
{a[*];{!a}[*];a[+]}[]-> b
{a[*];{!a}[+];a[+]}[]-> b
{a[*];{!c}[+];a[+]}[]-> b
EOF
checkopt -v --stutter-invariant <<EOF
!({a;b[*];c}!)
G(a & Xb)
Xa
{a[=2..3]}[]-> b
{a[->2..3]}[]-> b
{a[*];{!c}[+];a[+]}[]-> b
EOF
checkopt --equivalent-to 'GFa | FGb' <<EOF