Commit a4a0cf3b authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

ltl: keep track of spin-compatible AP

* src/misc/bareword.cc, src/misc/bareword.hh (is_spin_ap): New function.
* src/ltlast/formula.cc, src/ltlast/formula.hh (is_spin_atomic_props):
New method and boolean.
* src/ltlast/atomic_prop.cc, src/ltlast/constant.cc: Update it.
* src/ltltest/kind.test: Test it.
parent 16a8c031
......@@ -23,6 +23,7 @@
#include "config.h"
#include "atomic_prop.hh"
#include "visitor.hh"
#include "misc/bareword.hh"
#include <cstddef>
#include <cassert>
#include <ostream>
......@@ -60,12 +61,14 @@ namespace spot
// is.lbt_atomic_props should be true if the name has the form
// pNN where NN is any number of digit.
std::string::const_iterator pos = name.begin();
is.lbt_atomic_props = (pos != name.end() && *pos++ == 'p');
while (is.lbt_atomic_props && pos != name.end())
bool lbtap = (pos != name.end() && *pos++ == 'p');
while (lbtap && pos != name.end())
{
char l = *pos++;
is.lbt_atomic_props = (l >= '0' && l <= '9');
lbtap = (l >= '0' && l <= '9');
}
is.lbt_atomic_props = lbtap;
is.spin_atomic_props = lbtap || is_spin_ap(name.c_str());
}
atomic_prop::~atomic_prop()
......
......@@ -59,6 +59,8 @@ namespace spot
is.syntactic_persistence = true;
is.not_marked = true;
is.accepting_eword = false;
is.lbt_atomic_props = true;
is.spin_atomic_props = true;
break;
case constant::EmptyWord:
is.boolean = false;
......@@ -80,6 +82,8 @@ namespace spot
is.universal = false;
is.not_marked = true;
is.accepting_eword = true;
is.lbt_atomic_props = true;
is.spin_atomic_props = true;
break;
}
}
......
......@@ -56,7 +56,10 @@ namespace spot
proprint(is_syntactic_recurrence, "r", "syntactic recurrence"); \
proprint(is_marked, "+", "marked"); \
proprint(accepts_eword, "0", "accepts the empty word"); \
proprint(has_lbt_atomic_props, "l", "has LBT-style atomic props");
proprint(has_lbt_atomic_props, "l", \
"has LBT-style atomic props"); \
proprint(has_spin_atomic_props, "a", \
"has Spin-style atomic props");
std::list<std::string>
......
......@@ -293,6 +293,11 @@ namespace spot
return is.lbt_atomic_props;
}
bool has_spin_atomic_props() const
{
return is.spin_atomic_props;
}
/// The properties as a field of bits. For internal use.
unsigned get_props() const
{
......@@ -354,6 +359,7 @@ namespace spot
bool not_marked:1; // No occurrence of EConcatMarked.
bool accepting_eword:1; // Accepts the empty word.
bool lbt_atomic_props:1; // Use only atomic propositions like p42.
bool spin_atomic_props:1; // Use only spin-compatible atomic props.
};
union
{
......
......@@ -26,110 +26,110 @@
set -e
cat >input<<EOF
a,B&!xfLEPSFsgopr
a<->b,BxfLEPSFsgopr
!a,B&!xfLEPSFsgopr
!(a|b),B&xfLEPSFsgopr
F(a),&!xLPegopr
G(a),&!xLPusopr
a U b,&!xfLPgopr
a U Fb,&!xLPegopr
Ga U b,&!xLPopr
1 U a,&!xfLPegopr
a W b,&!xfLPsopr
a W 0,&!xfLPusopr
a M b,&!xfLPgopr
a M 1,&!xfLPegopr
a R b,&!xfLPsopr
0 R b,&!xfLPusopr
a R (b R (c R d)),&!xfLPsopr
a U (b U (c U d)),&!xfLPgopr
a W (b W (c W d)),&!xfLPsopr
a M (b M (c M d)),&!xfLPgopr
Fa -> Fb,xLPopr
Ga -> Fb,xLPgopr
Fa -> Gb,xLPsopr
(Ga|Fc) -> Fb,xLPopr
(Ga|Fa) -> Gb,xLPopr
{a;c*;b}|->!Xb,&fPsopr
{a;c*;b}|->X!b,&!fPsopr
{a;c*;b}|->!Fb,&Psopr
{a;c*;b}|->G!b,&!Psopr
{a;c*;b}|->!Gb,&Pr
{a;c*;b}|->F!b,&!Pr
{a;c*;b}|->GFa,&!Pr
{a;c*;b}|->FGa,&!P
{a[+];c[+];b*}|->!Fb,&xPsopr
{a[+];c*;b[+]}|->G!b,&!xPsopr
{a*;c[+];b[+]}|->!Gb,&xPr
{a[+];c*;b[+]}|->F!b,&!xPr
{a[+];c[+];b*}|->GFa,&!xPr
{a*;c[+];b[+]}|->FGa,&!xP
{a;c;b|(d;e)}|->!Xb,&fPFsgopr
{a;c;b|(d;e)}|->X!b,&!fPFsgopr
{a;c;b|(d;e)}|->!Fb,&Psopr
{a;c;b|(d;e)}|->G!b,&!Psopr
{a;c;b|(d;e)}|->!Gb,&Pgopr
{a;c;b|(d;e)}|->F!b,&!Pgopr
{a;c;b|(d;e)}|->GFa,&!Pr
{a;c;b|(d;e)}|->FGa,&!Pp
{a[+] && c[+]}|->!Xb,&fPsopr
{a[+] && c[+]}|->X!b,&!fPsopr
{a[+] && c[+]}|->!Fb,&xPsopr
{a[+] && c[+]}|->G!b,&!xPsopr
{a[+] && c[+]}|->!Gb,&xPr
{a[+] && c[+]}|->F!b,&!xPr
{a[+] && c[+]}|->GFa,&!xPr
{a[+] && c[+]}|->FGa,&!xP
{a;c*;b}<>->!Gb,&Pgopr
{a;c*;b}<>->F!b,&!Pgopr
{a;c*;b}<>->FGb,&!Pp
{a;c*;b}<>->!GFb,&Pp
{a;c*;b}<>->GFb,&!P
{a;c*;b}<>->!FGb,&P
{a*;c[+];b[+]}<>->!FGb,&xP
{a;c|d;b}<>->!Gb,&Pgopr
{a;c|d;b}<>->G!b,&!Psopr
{a;c|d;b}<>->FGb,&!Pp
{a;c|d;b}<>->!GFb,&Pp
{a;c|d;b}<>->GFb,&!Pr
{a;c|d;b}<>->!FGb,&Pr
a,B&!xfLEPSFsgopra
a<->b,BxfLEPSFsgopra
!a,B&!xfLEPSFsgopra
!(a|b),B&xfLEPSFsgopra
F(a),&!xLPegopra
G(a),&!xLPusopra
a U b,&!xfLPgopra
a U Fb,&!xLPegopra
Ga U b,&!xLPopra
1 U a,&!xfLPegopra
a W b,&!xfLPsopra
a W 0,&!xfLPusopra
a M b,&!xfLPgopra
a M 1,&!xfLPegopra
a R b,&!xfLPsopra
0 R b,&!xfLPusopra
a R (b R (c R d)),&!xfLPsopra
a U (b U (c U d)),&!xfLPgopra
a W (b W (c W d)),&!xfLPsopra
a M (b M (c M d)),&!xfLPgopra
Fa -> Fb,xLPopra
Ga -> Fb,xLPgopra
Fa -> Gb,xLPsopra
(Ga|Fc) -> Fb,xLPopra
(Ga|Fa) -> Gb,xLPopra
{a;c*;b}|->!Xb,&fPsopra
{a;c*;b}|->X!b,&!fPsopra
{a;c*;b}|->!Fb,&Psopra
{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*}|->!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|(d;e)}|->!Xb,&fPFsgopra
{a;c;b|(d;e)}|->X!b,&!fPFsgopra
{a;c;b|(d;e)}|->!Fb,&Psopra
{a;c;b|(d;e)}|->G!b,&!Psopra
{a;c;b|(d;e)}|->!Gb,&Pgopra
{a;c;b|(d;e)}|->F!b,&!Pgopra
{a;c;b|(d;e)}|->GFa,&!Pra
{a;c;b|(d;e)}|->FGa,&!Ppa
{a[+] && c[+]}|->!Xb,&fPsopra
{a[+] && c[+]}|->X!b,&!fPsopra
{a[+] && c[+]}|->!Fb,&xPsopra
{a[+] && c[+]}|->G!b,&!xPsopra
{a[+] && c[+]}|->!Gb,&xPra
{a[+] && c[+]}|->F!b,&!xPra
{a[+] && c[+]}|->GFa,&!xPra
{a[+] && c[+]}|->FGa,&!xPa
{a;c*;b}<>->!Gb,&Pgopra
{a;c*;b}<>->F!b,&!Pgopra
{a;c*;b}<>->FGb,&!Ppa
{a;c*;b}<>->!GFb,&Ppa
{a;c*;b}<>->GFb,&!Pa
{a;c*;b}<>->!FGb,&Pa
{a*;c[+];b[+]}<>->!FGb,&xPa
{a;c|d;b}<>->!Gb,&Pgopra
{a;c|d;b}<>->G!b,&!Psopra
{a;c|d;b}<>->FGb,&!Ppa
{a;c|d;b}<>->!GFb,&Ppa
{a;c|d;b}<>->GFb,&!Pra
{a;c|d;_b}<>->!FGb,&Pr
# Equivalent to a&b&c&d
{a:b:c:d}!,B&!xfLEPSFsgopr
a&b&c&d,B&!xfLEPSFsgopr
(Xa <-> XXXc) U (b & Fe),LPgopr
(!X(a|X(!b))&(FX(g xor h)))U(!G(a|b)),LPegopr
(!X(a|X(!b))&(GX(g xor h)))R(!F(a|b)),LPusopr
(!X(a|X(!b))&(GX(g xor h)))U(!G(a|b)),LPeopr
(!X(a|X(!b))&(FX(g xor h)))R(!F(a|b)),LPuopr
(!X(a|X(!b))&(GX(g xor h)))U(!F(a|b)),LPp
(!X(a|X(!b))&(FX(g xor h)))R(!G(a|b)),LPr
(!X(a|GXF(!b))&(FGX(g xor h)))U(!F(a|b)),LPp
(!X(a|GXF(!b))&(FGX(g xor h)))R(!F(a|b)),LPup
(!X(a|FXG(!b))&(GFX(g xor h)))R(!G(a|b)),LPr
(!X(a|FXG(!b))&(GFX(g xor h)))U(!G(a|b)),LPer
(!X(a|GXF(!b))&(FGX(g xor h)))U(!G(a|Fb)),LPep
(!X(a|GXF(!b))&(FGX(g xor h)))U(!F(a|Gb)),LP
(!X(a|FXG(!b))&(GFX(g xor h)))R(!F(a|Gb)),LPur
(!X(a|FXG(!b))&(GFX(g xor h)))R(!G(a|Fb)),LP
GFa M GFb,&!xLPeu
FGa M FGb,&!xLPeup
Fa M GFb,&!xLPer
GFa W GFb,&!xLPeur
FGa W FGb,&!xLPeu
Ga W FGb,&!xLPup
Ga W b,&!xLPsopr
Fa M b,&!xLPgopr
{a;b*;c},&!fPsopr
{a;b*;c}!,&!fPgopr
{a:b:c:d}!,B&!xfLEPSFsgopra
a&b&c&d,B&!xfLEPSFsgopra
(Xa <-> XXXc) U (b & Fe),LPgopra
(!X(a|X(!b))&(FX(g xor h)))U(!G(a|b)),LPegopra
(!X(a|X(!b))&(GX(g xor h)))R(!F(a|b)),LPusopra
(!X(a|X(!b))&(GX(g xor h)))U(!G(a|b)),LPeopra
(!X(a|X(!b))&(FX(g xor h)))R(!F(a|b)),LPuopra
(!X(a|X(!b))&(GX(g xor h)))U(!F(a|b)),LPpa
(!X(a|X(!b))&(FX(g xor h)))R(!G(a|b)),LPra
(!X(a|GXF(!b))&(FGX(g xor h)))U(!F(a|b)),LPpa
(!X(a|GXF(!b))&(FGX(g xor h)))R(!F(a|b)),LPupa
(!X(a|FXG(!b))&(GFX(g xor h)))R(!G(a|b)),LPra
(!X(a|FXG(!b))&(GFX(g xor h)))U(!G(a|b)),LPera
(!X(a|GXF(!b))&(FGX(g xor h)))U(!G(a|Fb)),LPepa
(!X(a|GXF(!b))&(FGX(g xor h)))U(!F(a|Gb)),LPa
(!X(a|FXG(!b))&(GFX(g xor h)))R(!F(a|Gb)),LPura
(!X(a|FXG(!b))&(GFX(g xor h)))R(!G(a|Fb)),LPa
GFa M GFb,&!xLPeua
FGa M FGb,&!xLPeupa
Fa M GFb,&!xLPera
GFa W GFb,&!xLPeura
FGa W FGb,&!xLPeua
Ga W FGb,&!xLPupa
Ga W b,&!xLPsopra
Fa M b,&!xLPgopra
{a;b*;c},&!fPsopra
{a;b*;c}!,&!fPgopra
# The negative normal form is {a;b*;c}[]->1
!{a;b*;c}!,&fPsopr
{a;b*;c}[]->0,&!fPsopr
!{a;b*;c},&!fPgopr
!{a[+];b*;c[+]},&!xfPgopr
{a[+];b*;c[+]},&!xfPsopr
{a[+] && b || c[+]},&!fPsopr
{a[+] && b[+] || c[+]},&!xfPsopr
!{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[+]},&!fPsopra
{a[+] && b[+] || c[+]},&!xfPsopra
EOF
run 0 ../kind input
// -*- coding: utf-8 -*-
// Copyright (C) 2011, 2013 Laboratoire de Recherche et Développement
// Copyright (C) 2011, 2013, 2015 Laboratoire de Recherche et Développement
// de l'Epita (LRDE).
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
......@@ -50,4 +50,16 @@ namespace spot
return "\"" + escape_str(str) + "\"";
}
// This is for Spin 5. Spin 6 has a relaxed parser that can
// accept any parenthesized block as an atomic propoistion.
bool is_spin_ap(const char* str)
{
if (!str || !islower(*str))
return false;
while (*++str)
if (!(isalnum(*str) || *str == '_'))
return false;
return true;
}
}
// -*- coding: utf-8 -*-
// Copyright (C) 2013 Laboratoire de Recherche et Développement
// Copyright (C) 2013, 2015 Laboratoire de Recherche et Développement
// de l'Epita (LRDE).
// Copyright (C) 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
......@@ -40,6 +40,13 @@ namespace spot
/// \brief Double-quote words that are not bare.
/// \see is_bare_word
SPOT_API std::string quote_unless_bare_word(const std::string& str);
/// \brief Whether a word can be used as an atomic proposition for Spin 5.
///
/// In Spin 5 (hence in ltl2ba and ltl3ba as well) atomic
/// propositions should start with a lowercase letter, and can then
/// consist solely of alphanumeric characters and underscores.
SPOT_API bool is_spin_ap(const char* str);
/// @}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment