DOCUMENTATION
The documentation and API is currently a work in progress. See the source code repository for more information.
EXPRESSION LANGUAGE
QBAR uses an s-expression language to describe all of its data structures and abstract syntax. S-expressions are parenthesis-grouped strings which can be distinguished into two basic forms: atoms and groups. S-expressions are the syntax of choice for LISP dialects like Common Lisp, Clojure, Racket, and many others. QBAR expressions are slightly more general in that they intend to describe arbitrary data rather than just programs. See Rivest S-expressions which have a similar goal.
NOTE: Objects marked with ⚠️ have an unstable API.
Basic Forms
Expressions are either atoms, groups, or unspecified, in which case they are simply called exprs.
atom ⚠️
An atom is any Unicode string which uses " to wrap whitespace and ( ). Here are some examples:
123
"a b c"
f"Hello, {world}!"
"multi-line
strings"
text-before-the-quote"text in the quote"text-after-the-quote
[]{}<>-are-also"atoms since we only care about ()"<-notice_we_had_to_escape"("and")"
emoji.too:🗿:😂
Here's a regular expression that parses atoms:
RAW SYNTAX
([^\"\(\s\)]+((\"[^\"]*\")[^\"\(\s\)]*)*)|([^\"\(\s\)]*((\"[^\"]*\")[^\"\(\s\)]*)+)
NOTE: Currently, only whitespace literals and parenthesis are escaped in quoted strings. In the future, other escape sequences may be supported.
group
A group is an expression formed by bracketing with an open parenthesis (, delimiting with whitespace a set of expressions and then ending with a close parenthesis ).
SYNTAX
( whitespace? {expr whitespace?}* )
expr
An expr is either an atom or a group
SYNTAX
atom | group
Important Shapes
NOTE: Shapes have the same syntax as expressions except we don't notate optional whitespace and wrapping group, and [$name: $shape] objects are used to name the shape elements.
The following are some important shapes:
substitution
A substitution represents a piecewise transformation of the kind Atom -> Expr mapped over an expressions atoms. For every var which appears in a given expression, expr replaces every occurence of that atom in the entire expression.
SHAPE
{[var: atom] [expr: expr]}*
NOTE: If two equal var appear in the same substitution, the first one is used.
rule
A rule represents a stateful inference rule which can be joined with substitutions to make a composition.
SHAPE
[top: group] [bot: group]
The top expression is also known as the premise and the bot expression is also known as the conclusion.
composition
A composition represents a chain of rule-substitution pairs composed from top to bottom.
SHAPE
{[rule: {hash | rule}] [substitution: {hash | substitution}]}*
ruleset
A ruleset is a collection of rules along with a set of substitution constants which are not allowed to be substituted out of. A composition belongs to the closure of a ruleset if all of its rules are in the ruleset and no substitution has any constant as one of its var.
SHAPE
[constants: ( atom* )] [rules: ( {hash | rule}* )]
definition ⚠️
A definition is the assignment of a name and variables to an expression.
SHAPE
def [name: atom] [vars: ( atom* )] [expr: expr]
defset
This shape represents any collection of definitions. For the shape to be a valid set of definitions, it must not contain duplicate name assignments.
SHAPE
{hash | definition}*
Reference Parsers
Currently all expression parsers are built into the reference shell implementations. In the future, they will be separated into their own libraries.
SHELL
The shell is the default way to interact with QBAR expressions. You can use the shell to build, verify, and analyze compositions and other proof objects.
Commands
The following are a list of the currently implemented commands.
NOTE: Commands marked with ⚠️ have an unstable name, API, and/or signature.
clear
clears the screen Same as ^L.config ⚠️
gets/sets configuration optionsdocs ⚠️
documentation inside the shelleval ⚠️
reduces compositions to rulesfind ⚠️
looks for expressionsinfo ⚠️
information about an expressionload ⚠️
loads expressionsruleset ⚠️
information about a rulesetsearch ⚠️
searches for compositionssubst: <expr> <substitution>
substitute out of an expression
tutorial ⚠️
runs the tutorial in the shellverify ⚠️
verifies that arule belongs to the composition closure of the given ruleset
version
prints shell version informationexit
exits the shell Same as exit.Keybindings
The following are the default shell emacs-like keybindings for the reference shell implementations. Custom and vim-like keybindings are not yet implemented.
^A
line start^C
cancel^D
exit/restart Same as exit.^E
line end^L
clears the screen Same as clear.Reference Implementations
The qbar toolkit comes with two reference shell implementations written in Rust:
Terminal
The reference terminal shell can be installed with cargo as follows:
cargo install qbar
For more information on the terminal shell implementation see the Rust documentation.
Web
The reference web shell is built off of the reference terminal shell and can be accessed on the main qbar website. For more information on the web shell implementation see the Rust documentation.