116 lines
5.6 KiB
Markdown
116 lines
5.6 KiB
Markdown
|
Hi Lean Provers! Curious, I know that https://leanprover-community.github.io/mathlib4_docs/ is good for referencing the mathlib docs. If I want to see all of the main Lean4 syntax/constructs e.g., building types, strucs, functions, what is the recommended website? Similarly is there a cheat sheet/table for this?
|
|||
|
1 reply
|
|||
|
|
|||
|
|
|||
|
Jibiana Jakpor
|
|||
|
22 minutes ago
|
|||
|
Functional Programming in Lean is a great resource for learning the syntax, especially for general purpose programming: https://leanprover.github.io/functional_programming_in_lean/. It doesn’t have much info on tactics though. That’s where MIL or Theorem Proving in Lean 4 will serve you bette
|
|||
|
|
|||
|
|
|||
|
# Learning to write Lean
|
|||
|
|
|||
|
[Opening a lean project in VSCODE.](https://proofassistants.stackexchange.com/questions/2760/how-does-one-create-a-lean-project-and-have-mathlib-import-work-when-not-creatin/3779#3779)
|
|||
|
|
|||
|
We start of the bat recommending good sources for learning Lean 4:
|
|||
|
- [Theorem proving in Lean](https://leanprover.github.io/theorem_proving_in_lean4/)
|
|||
|
- []
|
|||
|
|
|||
|
The goal will be to give an overview of useful tips for proving in Lean
|
|||
|
|
|||
|
## Unicode
|
|||
|
|
|||
|
For unicode use `\` backslash so that `\to` becomes an arrow.
|
|||
|
- `\^-1` for inverse e.g., `2⁻¹`
|
|||
|
- `\l` for back arrow e.g., in rewrite
|
|||
|
- `to` for arrow/implication
|
|||
|
- TODO: iff
|
|||
|
- `\R` for `ℝ`
|
|||
|
|
|||
|
## Tactics
|
|||
|
tip: seems mathlib_4 documentation (& Moogle) are the best to find tactic docs.
|
|||
|
|
|||
|
### Entering tactic mode
|
|||
|
|
|||
|
- use `by` afte thm declaration e.g., `theorem thm_name : \forall n, n = n := by sorry` I think it works since `:=` expects you to write a function/proof term and then `by ...` enters tactic mode. `#print thm_name` TODO or something prints the proof term.
|
|||
|
|
|||
|
## Intro & Intros tactic
|
|||
|
- TODO: intro intros
|
|||
|
|
|||
|
- `intro` introduces one or more hypotheses, optionally naming and/or pattern-matching them. For each hypothesis to be introduced, the remaining main goal's target type must be a let or function type.
|
|||
|
- it seems it also unfolds definitions for you (and yes introduces hypothesis.)
|
|||
|
ref: [intro](https://leanprover-community.github.io/mathlib4_docs/Init/Tactics.html#Lean.Parser.Tactic.intro)
|
|||
|
|
|||
|
- `intros` Introduces zero or more hypotheses, optionally naming them.
|
|||
|
- intros is equivalent to repeatedly applying intro until the goal is not an obvious candidate for intro, ...
|
|||
|
ref: [intros](https://leanprover-community.github.io/mathlib4_docs/Init/Tactics.html#Lean.Parser.Tactic.intros)
|
|||
|
|
|||
|
### Rewrite Tactic
|
|||
|
|
|||
|
My understanding is that rewrites is the substitution (rewrite a term) tactic when we have an equality.
|
|||
|
How tactic `rw` works:
|
|||
|
- `rw [t]` applies from left to right on first term wrt to equality term `t` on goal
|
|||
|
- rw tactic closes/discharges any goals of the form `t = t`.
|
|||
|
- rw [ <- t] or rw [ \l t ] to apply equality form left to right (on 1st term) on goal
|
|||
|
- rw to rewrite hypothesis `h` do `rw [t] at h`
|
|||
|
- (rw to rewrite everything I assume rw [*] but then proof harder to read!)
|
|||
|
- to apply tactic at specific loc do rw `[Nat.add_comm b]` if `a + (b + c)` --> `a + (c + b)`
|
|||
|
- tip: hover over Nat.add_comm to see how tactic and arg interact.
|
|||
|
- rewrite using compund expression `rw [h1 h2]` <--> `rw [h1]; rw [h2]`
|
|||
|
- rewrite can also rewrite terms that aren't equalities
|
|||
|
- e.g., if `h_k_eq_0: k = 0` then `t : Pair 1 k` --> `t : Pair 1 0` with `rw [h_k_eq_0] at t`
|
|||
|
ref: https://leanprover.github.io/theorem_proving_in_lean4/tactics.html
|
|||
|
|
|||
|
- `rwa` calls `rw`, then closes any remaining goals using `assumption`. Note: found by writing `rwa` in tactic mode then using vscode to get to it's def. Mathlib4 search, Moogle, didn't help surprisingly.
|
|||
|
|
|||
|
### Constructor tactic
|
|||
|
|
|||
|
- `constructor` If the main goal's target type is an inductive type, constructor solves it with the first matching constructor, or else fails.
|
|||
|
-tactic introduces a certain number of new proof obligations/goals to discharge/close according to each term in the constructor of the goal.
|
|||
|
- e.g., if we have `... |- a \and k = 0 -> c` the constructor will open two goals where you need to prove `a` and `k = 0`. i.e., to have arrived at that goal you must have had a proof/evidence that `a` and `k=0` had proves e.g., `k = 0` might be a simple assumption in your "local context"/hypothesis space (TODO lean official lingo)
|
|||
|
|
|||
|
### Have
|
|||
|
- `have : t := e` := "introduces theorem with proof `e` e.g., `e` can be `by tactics...` or the exact `proof term`
|
|||
|
e.g.,
|
|||
|
```lean
|
|||
|
have h_pos : 0 < x⁻¹ := inv_pos.mpr h_x_pos
|
|||
|
```
|
|||
|
|
|||
|
### Dot deperator for cases
|
|||
|
Do `.` to handle each case e.g., in induction.
|
|||
|
|
|||
|
|
|||
|
### Tacticals
|
|||
|
Note: `;` is not a tactical. TODO what is?
|
|||
|
|
|||
|
### Expressions
|
|||
|
|
|||
|
TODO: `\forall x : R, x < 0'
|
|||
|
|
|||
|
### Mathlib tips
|
|||
|
|
|||
|
- use less than (lt) in terms (e.g., thms) so it's easier to prove things.
|
|||
|
- `m_lt_m_right` TODO: what is tip?
|
|||
|
|
|||
|
### Seeing Propositional Constructors
|
|||
|
ref: [How do I explicitly see the propositional or logical constructors in Lean 4?](https://proofassistants.stackexchange.com/questions/3794/how-do-i-explicitly-see-the-propositional-or-logical-constructors-in-lean-4)
|
|||
|
|
|||
|
TODO: precedence of exists, forall vs And, implicaiton.
|
|||
|
|
|||
|
And < (less precedence than) Implcation <==> `A /\ B -> B` means `(A /\ B) -> B`.
|
|||
|
Exists delta, P delta -> P' delta <==>
|
|||
|
|
|||
|
### Terminology
|
|||
|
|
|||
|
- argument vs parameter -> argument (calling) the argument of f is 2, parameter (declaration) of f is n: Nat
|
|||
|
- elaboration
|
|||
|
- proof term
|
|||
|
- proof obligation
|
|||
|
- discharge
|
|||
|
|
|||
|
### Questions:
|
|||
|
Q: what is a macro again?
|
|||
|
Q: why is there this Init.Tactics vs Std.Tactic.Rcases
|
|||
|
https://leanprover-community.github.io/mathlib4_docs/Std/Tactic/RCases.html#Std.Tactic.rintro
|
|||
|
https://leanprover-community.github.io/mathlib4_docs/Init/Tactics.html#Lean.Parser.Tactic.constructor
|
|||
|
Q: destructing patterns, rcases, rintro & rcases vs constructor
|