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 STRING
assert
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 )