Allow atomic propositions negated with a combining overline.
* src/ltlparse/ltlscan.ll: Understand the combining overline, and combining overbar as synonym for =0. * src/ltlvisit/tostring.cc: Emit a combining overline for single-letter atomic propositions. * src/ltlast/atomic_prop.hh (is_atomic_prop): New function. * doc/tl/tl.tex: Document these two characters.
This commit is contained in:
parent
1319e18e1d
commit
6ea88efddc
4 changed files with 39 additions and 6 deletions
|
|
@ -381,6 +381,12 @@ syntax \samp{$a$=0}, which is equivalent to \samp{$\NOT a$}. Also
|
||||||
\samp{$a$=1} is equivalent to just \samp{a}. These two syntaxes help
|
\samp{$a$=1} is equivalent to just \samp{a}. These two syntaxes help
|
||||||
us read formul\ae{} written using Wring's syntax.
|
us read formul\ae{} written using Wring's syntax.
|
||||||
|
|
||||||
|
When using UTF-8 input, a \samp{=0} that follow a single-letter atomic
|
||||||
|
proposition may be replaced by a combining overline \uni{0305} or a
|
||||||
|
combining overbar \uni{0304}. When instructed to emit UTF-8, Spot
|
||||||
|
will output \samp{$\bar{\mathtt{a}}$} using a combining overline
|
||||||
|
instead of \samp{$\lnot$a} for any single-letter atomic proposition.
|
||||||
|
|
||||||
\label{def:boolform}
|
\label{def:boolform}
|
||||||
When a formula is built using only Boolean constants
|
When a formula is built using only Boolean constants
|
||||||
(section~\ref{sec:bool}), atomic proposition (section~\ref{sec:ap}),
|
(section~\ref{sec:bool}), atomic proposition (section~\ref{sec:ap}),
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
// Copyright (C) 2009 Laboratoire de Recherche et Développement
|
// -*- coding: utf-8 -*-
|
||||||
|
// Copyright (C) 2009, 2012 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.
|
||||||
|
|
@ -75,6 +76,14 @@ namespace spot
|
||||||
environment* env_;
|
environment* env_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline
|
||||||
|
const atomic_prop*
|
||||||
|
is_atomic_prop(const formula* f)
|
||||||
|
{
|
||||||
|
if (f->kind() != formula::AtomicProp)
|
||||||
|
return 0;
|
||||||
|
return static_cast<const atomic_prop*>(f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,9 @@ BOXDARROW {BOX}{DARROWL}|"|"{DARROWL}|"⤇"
|
||||||
"W" BEGIN(0); return token::OP_W;
|
"W" BEGIN(0); return token::OP_W;
|
||||||
"M" BEGIN(0); return token::OP_M;
|
"M" BEGIN(0); return token::OP_M;
|
||||||
|
|
||||||
"=0" return token::OP_POST_NEG;
|
/* The combining overline or macron (overbar) should normally
|
||||||
|
occur only after a single letter, but we do not check that. */
|
||||||
|
"=0"|"̅"|"̄" return token::OP_POST_NEG;
|
||||||
"=1" return token::OP_POST_POS;
|
"=1" return token::OP_POST_POS;
|
||||||
|
|
||||||
<*>[ \t\n]+ /* discard whitespace */ yylloc->step ();
|
<*>[ \t\n]+ /* discard whitespace */ yylloc->step ();
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ namespace spot
|
||||||
KAndRat,
|
KAndRat,
|
||||||
KAndNLM,
|
KAndNLM,
|
||||||
KConcat,
|
KConcat,
|
||||||
KFusion
|
KFusion,
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* spot_kw[] = {
|
const char* spot_kw[] = {
|
||||||
|
|
@ -96,7 +96,7 @@ namespace spot
|
||||||
" && ",
|
" && ",
|
||||||
" & ",
|
" & ",
|
||||||
";",
|
";",
|
||||||
":"
|
":",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* spin_kw[] = {
|
const char* spin_kw[] = {
|
||||||
|
|
@ -488,6 +488,7 @@ namespace spot
|
||||||
// propositions. So make sure we output F(0), G(1), etc.
|
// propositions. So make sure we output F(0), G(1), etc.
|
||||||
bool need_parent = (uo->child()->kind() == formula::Constant);
|
bool need_parent = (uo->child()->kind() == formula::Constant);
|
||||||
bool top_level = top_level_;
|
bool top_level = top_level_;
|
||||||
|
bool overline = false;
|
||||||
|
|
||||||
if (full_parent_)
|
if (full_parent_)
|
||||||
{
|
{
|
||||||
|
|
@ -500,8 +501,18 @@ namespace spot
|
||||||
switch (uo->op())
|
switch (uo->op())
|
||||||
{
|
{
|
||||||
case unop::Not:
|
case unop::Not:
|
||||||
emit(KNot);
|
|
||||||
need_parent = false;
|
need_parent = false;
|
||||||
|
// If we negate a single letter in UTF-8, use a
|
||||||
|
// combining overline.
|
||||||
|
if (!full_parent_ && kw_ == utf8_kw)
|
||||||
|
if (const ltl::atomic_prop* ap = is_atomic_prop(uo->child()))
|
||||||
|
if (ap->name().size() == 1
|
||||||
|
&& is_bare_word(ap->name().c_str()))
|
||||||
|
{
|
||||||
|
overline = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
emit(KNot);
|
||||||
break;
|
break;
|
||||||
case unop::X:
|
case unop::X:
|
||||||
emit(KX);
|
emit(KX);
|
||||||
|
|
@ -549,6 +560,11 @@ namespace spot
|
||||||
|
|
||||||
if (full_parent_ && !top_level)
|
if (full_parent_ && !top_level)
|
||||||
closep();
|
closep();
|
||||||
|
else if (overline)
|
||||||
|
// The following string contains only the character U+0305
|
||||||
|
// (a combining overline). It looks better than U+0304 (a
|
||||||
|
// combining overbar).
|
||||||
|
os_ << "̅";
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue