The particular concrete syntax implemented by the Parser and the Printer is the S-expression syntax described in the SMT-LIB v.2 documentation. In this syntax, all abstract quantities are rendered as S-expressions: either individual tokens, or a sequence consisting of a left-parenthesis, a series of whitespace-separated S-expressions, and a closing right-parenthesis. The whitespace separating a series of S-expressions may be spaces, tabs, new-line or carriage-return characters.
The allowed tokens are
+-*/_=%?!.$~&^<>@ Some character sequences that would be symbols are instead reserved words.
|).
forall exists let as _ ! par NUMERAL DECIMAL STRINGassert check-sat declare-fun declare-sort define-fun define-sort exit get-assertions get-assignment get-info get_option get-proof get-unsat-core get-value pop push set-info set-logic set-option
A command has the form
The logical formulas that are asserted and reasoned about by an SMT solver also are S-expressions. An expression
can in general take one of the following forms, though the particular logic in effect may limit some of the syntax
and will specify which functions are defined:
( command-name )
in which the command-name is a symbol or reserved word naming the command and the arguments are also S-expressions of particular forms, depending on the command.
( _ symbol series-of-numerals )
( identifier arguments... )
( ! expression :named symbol )
( forall ( series-of-symbol-sort-pairs ) expression )
( exists ( series-of-symbol-sort-pairs ) expression )
( let ( series-of-symbol-expression-pairs ) expression )