# -*- coding: utf-8 -*- #+TITLE: Common input and output options for LTL/PSL formulas #+DESCRIPTION: Options for input and output of temporal logic formulas in Spot's command-line tools #+INCLUDE: setup.org #+HTML_LINK_UP: tools.html #+PROPERTY: header-args:sh :results verbatim :exports both Spot supports different syntaxes for LTL/PSL formulas. This page documents the options, common to all tools where it makes sense, that are used to specify input and output of formula. * Common input options All tools that read LTL/PSL formulas implement the following options: #+BEGIN_SRC sh :exports results ltl2tgba --help | sed -n '/Input options:/,/^$/p' | sed '1d;$d' #+END_SRC #+RESULTS: : -f, --formula=STRING process the formula STRING : -F, --file=FILENAME[/COL] process each line of FILENAME as a formula; if COL : is a positive integer, assume a CSV file and read : column COL; use a negative COL to drop the first : line of the CSV file : --lbt-input read all formulas using LBT's prefix syntax : --lenient parenthesized blocks that cannot be parsed as : subformulas are considered as atomic properties =-f= is used to pass one formula on the command line, but this option can be repeated to pass multiple formulas. =-F= is used to read formulas from a file (one formula per line). This option can also be repeated to pass multiple files. If the filename specified is =-= (as in =-F-=), then formulas are read from standard input. If a filename is suffixed with =/COL=, where =COL= is a positive integer, then the file is assumed to be a CSV file, and formulas are read from its =COL=-th column. Use =/-COL= to read from column =COL= and ignore the first line of the CSV file (which often contains column headers). We have [[file:csv.org][examples of reading or writing CSV files on a separate page]]. ** Default parser :PROPERTIES: :CUSTOM_ID: infix :END: Spot's default LTL parser is able to parse the syntaxes of many tools, such as [[http://spinroot.com][Spin]], [[http://vlsi.colorado.edu/~rbloem/wring.html][Wring]], [[http://goal.im.ntu.edu.tw][Goal]], etc. For instance here are the preferred ways to express the same formula for different tools. #+NAME: tab:formula-syntaxes | Tool | Formula | |--------------+-------------------------| | Spot | =G(a -> (b R !c))= | | Spot (UTF-8) | =□(a → (b R c̅))= | | Spin | =[](a -> (b V !c))= | | Wring | =G(a=1 -> (b=1 R c=0))= | | Goal | =G(a --> (b R ~c))= | Spot's default LTL parser will understand all of them. For a complete definition of the supported operators, including PSL operators, please refer to the [[https://spot.lrde.epita.fr/tl.pdf][=doc/tl/tl.pdf= document inside the Spot distribution]]. For Spot, an atomic proposition is any alphanumeric string that does not start with the (upper case) characters =F=, =G=, or =X=. For instance =gfa= is an atomic proposition, but =GFa= actually denotes the LTL formula =G(F(a))=. Any double-quoted string is also considered to be an atomic proposition, so if =GFa= had to be an atomic proposition, it could be written #+HTML: "GFa" . These double-quote strings also make it possible to embed arbitrarily complex expressions that represent an atomic proposition that Spot should not try to interpret. For instance: : "a < b" U "process[2]@ok" ** Lenient mode :PROPERTIES: :CUSTOM_ID: lenient :END: In version 6, Spin extended its syntax to support arbitrary atomic expression in LTL formulas. The previous formula would be written simply: : (a < b) U (process[2]@ok) While Spot cannot read the above syntax by default, it can do it if you specify the =--lenient= option. (This global option affects all formulas that are input.) The same parser is used, however its processing of parenthesis blocks is different: every time a parenthesis block is scanned, the parser first tries to recursively parse the block as an LTL/PSL formula, and if this parsing failed, the block is considered to be an atomic proposition. For instance =(a U b) U c= will be successfully converted into an LTL formula with two operators, while parsing =(a + b < 2) U c= will consider =a + b < 2= as an atomic proposition. An unfortunate side-effect of =--lenient= parsing is that many syntax errors will not be caught. Compare the following syntax error: #+BEGIN_SRC sh :prologue "exec 2>&1" :epilogue true ltlfilt -f '(a U b U) U c' #+END_SRC #+RESULTS: : >>> (a U b U) U c : ^ : syntax error, unexpected closing parenthesis : : >>> (a U b U) U c : ^ : missing right operand for "until operator" : With the same command in =--lenient= mode: #+BEGIN_SRC sh :results verbatim :exports both ltlfilt --lenient -f '(a U b U) U c' #+END_SRC #+RESULTS: : "a U b U" U c Here =a U b U= was taken as an atomic proposition. ** Prefix parser :PROPERTIES: :CUSTOM_ID: prefix :END: The prefix syntax used by tools such as [[http://www.tcs.hut.fi/Software/maria/tools/lbt/][LBT]], [[http://www.tcs.hut.fi/Software/lbtt/][LBTT]], [[http://tcs.legacy.ics.tkk.fi/users/tlatvala/scheck/][scheck]] or [[http://www.ltl2dstar.de][ltl2dstar]] requires a different parser. For these tools, the above example formula has to be written =G i p0 V p1 ! p2= (in LBT's syntax, atomic propositions must start with =p= and be followed by a number). Spot's =--lbt-input= option can be used to activate the parser for this syntax. The following operators are supported: | syntax | meaning | |--------+----------------| | | | | =t= | true | | =f= | false | | =!= | not | | =&= | and | | \vert | or | | =^= | xor | | =i= | implies | | =e= | equivalent | | =X= | next | | =F= | eventually | | =G= | globally | | =U= | strong until | | =V= | weak release | | =M= | strong release | | =W= | weak until | |--------+----------------| As an extension to LBT's syntax, alphanumeric atomic propositions that follow the "=p= + number" rule will be accepted if they do not conflict with one of the operators (e.g., =i=, the /implies/ operator, cannot be used as an atomic proposition). Also any atomic proposition may be double-quoted. These extensions are compatible with the syntax used by [[http://www.ltl2dstar.de][ltl2dstar]]. =--lbt-input= is a global option that affects *all* formulas that are read. * Common output options :PROPERTIES: :CUSTOM_ID: output-options :END: All tools that output LTL/PSL formulas implement the following options: #+BEGIN_SRC sh :exports results ltlfilt --help | sed -n '/Output options:/,/^$/p' | sed '1d;$d;/--.*count/d;/--quiet/d' #+END_SRC #+RESULTS: #+begin_example -0, --zero-terminated-output separate output formulas with \0 instead of \n (for use with xargs -0) -8, --utf8 output using UTF-8 characters --format=FORMAT, --stats=FORMAT specify how each line should be output (default: "%f") -l, --lbt output in LBT's syntax --latex output using LaTeX macros -o, --output=FORMAT send output to a file named FORMAT instead of standard output. The first formula sent to a file truncates it unless FORMAT starts with '>>'. -p, --full-parentheses output fully-parenthesized formulas -s, --spin output in Spin's syntax --spot output in Spot's syntax (default) --wring output in Wring's syntax #+end_example The =--spot=, =--utf-8=, =--spin=, =--wring= options select different output syntaxes as seen in [[tab:formula-syntaxes][the above table]]. Option =--latex= causes formulas to be output using LaTeX macros for each operator. You may define these macros as you wish, and some example definitions are in =doc/tl/spotltl.sty=. The =-p= option can be used to request that parentheses be used at all levels. Note that by default Spot always outputs parentheses around operators such as =U=, because not all tools agree on their associativity. For instance =a U b U c= is read by Spot as =a U (b U c)= (because =U= is right-associative in the PSL standard), while Spin (among other tools) with read it as =(a U b) U c=. The =--lbt= option requests an output in LBT's prefix format, and in that case discussing associativity and parentheses makes no sense. The =--csv= causes the formulas to be double-quoted (with inner double-quotes doubled, as per RFC 4180), regardless of the selected format. This is needed if the formula should appear in a CSV file, and you want to be robust to formulas that contains commas or double-quotes. We have [[file:csv.org][examples of reading or writing CSV files on a separate page]]. The =--format= option can be used to fine-tune the way the formula is output. Not using the =--format= option is equivalent to using =--format=%f=. The semantic of the available =%=-sequences differ from tool to tool: | | =%f= | =%F= | =%L= | =%<= | =%>= | |------------+----------------+----------------+-------------------+--------------+---------------| | [[file:ltlfilt.org][=ltlfilt=]] | output formula | input filename | input line | leading text | trailing text | | [[file:genltl.org][=genltl=]] | output formula | pattern name | pattern parameter | (empty) | (empty) | | [[file:randltl.org][=randltl=]] | output formula | (empty) | formula number | (empty) | (empty) | | [[file:ltlfilt.org][=ltlgrind=]] | output formula | input filename | input line | leading text | trailing text | Other =%=-sequences are supported by these tools, and documented in the output of =--help=. For instance =%s= can be used to compute the size of a formula. By default everything is output to standard output, so that you can redirect the output to a file, and pipe it to another tool. The =--output= (or =-o=) allows you to construct a filename using some of the above =%=-sequences. For instance the following invocation of [[file:randltl.org][=randltl=]] will create 5 random formulas, but in 5 different files: #+BEGIN_SRC sh :epilogue "rm -f example-*.ltl" randltl -n5 a b -o example-%L.ltl wc -l example-*.ltl #+END_SRC #+RESULTS: : 1 example-1.ltl : 1 example-2.ltl : 1 example-3.ltl : 1 example-4.ltl : 1 example-5.ltl : 5 total Option =-0= is useful if the list of formulas is passed to =xargs=. =xargs= normally splits its input on white space (which are frequent in LTL formulas), but you can use =xargs -0= to split the input on null characters. So for instance the following two invocations have nearly the same output: #+BEGIN_SRC sh genltl -0 --gh-q=1..4 | xargs -0 ltl2tgba --stats='%F,%f,%s' genltl --gh-q=1..4 | ltl2tgba -F- --stats='%F,%f,%s' #+END_SRC #+RESULTS: : ,Fp1 | Gp2,3 : ,(Fp1 | Gp2) & (Fp2 | Gp3),8 : ,(Fp1 | Gp2) & (Fp2 | Gp3) & (Fp3 | Gp4),18 : ,(Fp1 | Gp2) & (Fp2 | Gp3) & (Fp3 | Gp4) & (Fp4 | Gp5),42 : -,Fp1 | Gp2,3 : -,(Fp1 | Gp2) & (Fp2 | Gp3),8 : -,(Fp1 | Gp2) & (Fp2 | Gp3) & (Fp3 | Gp4),18 : -,(Fp1 | Gp2) & (Fp2 | Gp3) & (Fp3 | Gp4) & (Fp4 | Gp5),42 The only difference is that for the first command, =ltl2tgba= received its formulas from the command-line arguments supplied by =xargs= (so =%F= is empty as there is no input file), while in the second case the formula where read from standard input (denoted by =-=). # LocalWords: lbt LBT's filename UTF gfa GFa ltlfilt LBTT scheck # LocalWords: utf associativity # LocalWords: syntaxes LTL PSL num toc SRC ltl tgba sed FILENAME