lean2/doc/lean/lexical.md
Leonardo de Moura d9c41e7282 doc(lean): add tutorial draft, and fix lexical documentation
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2014-01-07 00:06:32 -08:00

74 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lexical conventions
## Reserved keywords
This is the list of reserved keywords in Lean:
`axiom`,
`check`,
`coercion`,
`definition`,
`echo`,
`environment`,
`eval`,
`exit`,
`have`,
`help`,
`import`,
`infix`,
`infixr`,
`infixl`,
`notation`,
`options`,
`pi`,
`pop::context`,
`print`,
`scope`,
`theorem`,
`type`,
`universe`,
`variable`,
`variables`,
`by`,
`exists`,
`forall`,
`fun`,
`in`,
`let`
Remark: Lean commands always start with a upper case letter.
The following symbols are also reserved: `->`, `==`, `Π`, `λ`, `→`, `∀`, `∃`, `_`, `,`, `.`, `:`, `(`, `)`, `{`, `}`
## Identifiers
Lean identifiers are divided in 3 categories.
In the first category, identifiers are of the form `[a-zA-Z_'@][a-zA-Z0-9_'@]*`. Here are examples of valid identifiers in this category: `fact`, `sin`, `move_front`, `f1`, `@cast`, and `A'`.
In Lean, we support hierarchical identifiers. A hierarchical is essentially a sequence of category 1 identifiers separated by `::`. We use hierarchical names to simulate modules in Lean. Here are some examples: `mod::x`, `foo::bla::1`.
In the second category, we have any non empty sequence of the following characters: `=`, `<`, `>`, `^`, `|`, `&`, `~`, `+`, `-`, `*`, `/`, `\\`, `$`, `%`, `?`, `;`, `[`, `]`, `#`. Here are examples of indentifiers in this category: `==`, `++`, `<<==`.
In the third category, we have any non empty sequence of non-ascii characters. Here are some examples: `⊆`, ``, and `¬`.
This separation may seem adhoc, the main motivation is to minimize the number of white spaces in Lean files.
For example, we can write `x+y*z` instead of `x + y * z`.
We usually use category 1 identifiers to name variable declarations,
definitions, axioms and theorems. Category 2 and 3 are usually used to
define notation, i.e., symbolic abbreviations denoting terms. For
example, the integer addition is named `Int::add`, and real addition
`Real::add`. The symbol `+` is notation for both of them.
## Numerals
Natural numbers are of the form `[0-9]+`, and decimal numbers are of the form `[0-9]+.[0-9]*`.
Natural numbers have type Nat, and decimal numbers have type Real. Lean automatically introduce coercions when needed.
## Strings
Strings are defined as usual as `"[any sequence of characters excluded "]"`.
## Comments
A comment starts anywhere with a double hyphen `--` and runs until the of the line.