List books being worked through.
parent
87e293ea8d
commit
7847cf1afe
25
README.md
25
README.md
|
@ -1,14 +1,15 @@
|
||||||
# bookshelf-lean
|
# bookshelf
|
||||||
|
|
||||||
A collection of proofs and answers to exercises to books I'm studying.
|
A collection on the study of the books listed below. I aim to use [Lean](https://leanprover.github.io/)
|
||||||
|
when possible (with respect to my current level of ability) and fallback to
|
||||||
|
LaTeX when not.
|
||||||
|
|
||||||
## Updates
|
- [ ] Apostol, Tom M. Calculus, Vol. 1: One-Variable Calculus, with an Introduction to Linear Algebra. 2nd ed. Vol. 1. 2 vols. Wiley, 1991.
|
||||||
|
- [ ] Avigad, Jeremy. ‘Theorem Proving in Lean’, n.d.
|
||||||
Lean's tooling is a fickle beast. If looking to update e.g. `Mathlib`, pin a new
|
- [ ] Axler, Sheldon. Linear Algebra Done Right. Undergraduate Texts in Mathematics. Cham: Springer International Publishing, 2015.
|
||||||
version to the `lake-manifest.json` file and start a new build from scratch:
|
- [ ] Cormen, Thomas H., Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms. 3rd ed. Cambridge, Mass: MIT Press, 2009.
|
||||||
|
- [ ] Enderton, Herbert B. A Mathematical Introduction to Logic. 2nd ed. San Diego: Harcourt/Academic Press, 2001.
|
||||||
```bash
|
- [ ] Gries, David. The Science of Programming. Texts and Monographs in Computer Science. New York: Springer-Verlag, 1981.
|
||||||
> lake update
|
- [ ] Gustedt, Jens. Modern C. Shelter Island, NY: Manning Publications Co, 2020.
|
||||||
> lake clean
|
- [ ] Ross, Sheldon. A First Course in Probability Theory. 8th ed. Pearson Prentice Hall, n.d.
|
||||||
> lake build
|
- [ ] Smullyan, Raymond M. To Mock a Mockingbird: And Other Logic Puzzles Including an Amazing Adventure in Combinatory Logic. Oxford: Oxford university press, 2000.
|
||||||
```
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
import Bookshelf.Sequence.Arithmetic
|
|
||||||
import Bookshelf.Sequence.Geometric
|
|
||||||
import Bookshelf.Tuple
|
|
||||||
import Bookshelf.Vector
|
|
|
@ -1,53 +0,0 @@
|
||||||
import Mathlib.Tactic.Ring
|
|
||||||
|
|
||||||
/--
|
|
||||||
A list-like structure with its size encoded in the type.
|
|
||||||
|
|
||||||
For a `Vector`-like type with opposite "endian", refer to `Tuple`.
|
|
||||||
-/
|
|
||||||
inductive Vector (α : Type u) : (size : Nat) → Type u where
|
|
||||||
| nil : Vector α 0
|
|
||||||
| cons : α → Vector α n → Vector α (n + 1)
|
|
||||||
|
|
||||||
syntax (priority := high) "v[" term,* "]" : term
|
|
||||||
|
|
||||||
macro_rules
|
|
||||||
| `(v[]) => `(Vector.nil)
|
|
||||||
| `(v[$x]) => `(Vector.cons $x v[])
|
|
||||||
| `(v[$x, $xs:term,*]) => `(Vector.cons $x v[$xs,*])
|
|
||||||
|
|
||||||
namespace Vector
|
|
||||||
|
|
||||||
/--
|
|
||||||
Returns the number of entries in the `Vector`.
|
|
||||||
-/
|
|
||||||
def size (_ : Vector α n) : Nat := n
|
|
||||||
|
|
||||||
/--
|
|
||||||
Returns the first entry of the `Vector`.
|
|
||||||
-/
|
|
||||||
def head : Vector α (n + 1) → α
|
|
||||||
| cons v _ => v
|
|
||||||
|
|
||||||
/--
|
|
||||||
Returns the last entry of the `Vector`.
|
|
||||||
-/
|
|
||||||
def last : Vector α (n + 1) → α
|
|
||||||
| cons v vs => if _ : n = 0 then v else
|
|
||||||
match n with
|
|
||||||
| _ + 1 => vs.last
|
|
||||||
|
|
||||||
/--
|
|
||||||
Returns all but the `head` of the `Vector`.
|
|
||||||
-/
|
|
||||||
def tail : Vector α (n + 1) → Vector α n
|
|
||||||
| cons _ vs => vs
|
|
||||||
|
|
||||||
/--
|
|
||||||
Appends an entry to the end of the `Vector`.
|
|
||||||
-/
|
|
||||||
def snoc : Vector α n → α → Vector α (n + 1)
|
|
||||||
| nil, a => v[a]
|
|
||||||
| cons v vs, a => cons v (snoc vs a)
|
|
||||||
|
|
||||||
end Vector
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
import Common.Sequence.Arithmetic
|
||||||
|
import Common.Sequence.Geometric
|
||||||
|
import Common.Tuple
|
|
@ -1,10 +1,3 @@
|
||||||
/-
|
|
||||||
# References
|
|
||||||
|
|
||||||
1. Levin, Oscar. Discrete Mathematics: An Open Introduction. 3rd ed., n.d.
|
|
||||||
https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf.
|
|
||||||
-/
|
|
||||||
|
|
||||||
import Mathlib.Tactic.NormNum
|
import Mathlib.Tactic.NormNum
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
|
@ -70,4 +63,4 @@ theorem sum_closed_formula (seq : Arithmetic) (n : Nat)
|
||||||
-- TODO: To continue, need to find how to deal with division.
|
-- TODO: To continue, need to find how to deal with division.
|
||||||
_ = ↑(n + 1) / 2 * (seq.a₀ + seq.termClosed n) := by sorry)
|
_ = ↑(n + 1) / 2 * (seq.a₀ + seq.termClosed n) := by sorry)
|
||||||
|
|
||||||
end Arithmetic
|
end Arithmetic
|
|
@ -1,10 +1,3 @@
|
||||||
/-
|
|
||||||
# References
|
|
||||||
|
|
||||||
1. Levin, Oscar. Discrete Mathematics: An Open Introduction. 3rd ed., n.d.
|
|
||||||
https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf.
|
|
||||||
-/
|
|
||||||
|
|
||||||
import Mathlib.Tactic.NormNum
|
import Mathlib.Tactic.NormNum
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
|
@ -53,4 +46,4 @@ def sum : Geometric → Nat → Int
|
||||||
| _, 0 => 0
|
| _, 0 => 0
|
||||||
| seq, (n + 1) => seq.termClosed n + seq.sum n
|
| seq, (n + 1) => seq.termClosed n + seq.sum n
|
||||||
|
|
||||||
end Geometric
|
end Geometric
|
|
@ -1,10 +1,3 @@
|
||||||
/-
|
|
||||||
# References
|
|
||||||
|
|
||||||
1. Enderton, Herbert B. A Mathematical Introduction to Logic. 2nd ed. San Diego:
|
|
||||||
Harcourt/Academic Press, 2001.
|
|
||||||
-/
|
|
||||||
|
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
/--
|
/--
|
||||||
|
@ -29,9 +22,9 @@ macro_rules
|
||||||
|
|
||||||
namespace Tuple
|
namespace Tuple
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Coercions
|
-- Coercions
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
scoped instance : CoeOut (Tuple α (min (m + n) m)) (Tuple α m) where
|
scoped instance : CoeOut (Tuple α (min (m + n) m)) (Tuple α m) where
|
||||||
coe := cast (by simp)
|
coe := cast (by simp)
|
||||||
|
@ -54,9 +47,9 @@ scoped instance : Coe (Tuple α (min m n + 1)) (Tuple α (min (m + 1) (n + 1)))
|
||||||
scoped instance : Coe (Tuple α m) (Tuple α (min (m + n) m)) where
|
scoped instance : Coe (Tuple α m) (Tuple α (min (m + n) m)) where
|
||||||
coe := cast (by simp)
|
coe := cast (by simp)
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Equality
|
-- Equality
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
theorem eq_nil : @Tuple.nil α = t[] := rfl
|
theorem eq_nil : @Tuple.nil α = t[] := rfl
|
||||||
|
|
||||||
|
@ -90,9 +83,9 @@ protected def hasDecEq [DecidableEq α] (t₁ t₂ : Tuple α n) : Decidable (Eq
|
||||||
|
|
||||||
instance [DecidableEq α] : DecidableEq (Tuple α n) := Tuple.hasDecEq
|
instance [DecidableEq α] : DecidableEq (Tuple α n) := Tuple.hasDecEq
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Basic API
|
-- Basic API
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Returns the number of entries of the `Tuple`.
|
Returns the number of entries of the `Tuple`.
|
||||||
|
@ -118,9 +111,9 @@ def cons : Tuple α n → α → Tuple α (n + 1)
|
||||||
| t[], a => t[a]
|
| t[], a => t[a]
|
||||||
| snoc ts t, a => snoc (cons ts a) t
|
| snoc ts t, a => snoc (cons ts a) t
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Concatenation
|
-- Concatenation
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Join two `Tuple`s together end to end.
|
Join two `Tuple`s together end to end.
|
||||||
|
@ -179,9 +172,9 @@ theorem snoc_eq_init_concat_last (as : Tuple α m) : snoc as a = concat as t[a]
|
||||||
rfl
|
rfl
|
||||||
(fun _ _ => by simp; unfold concat concat; rfl)
|
(fun _ _ => by simp; unfold concat concat; rfl)
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Initial sequences
|
-- Initial sequences
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Take the first `k` entries from the `Tuple` to form a new `Tuple`, or the entire
|
Take the first `k` entries from the `Tuple` to form a new `Tuple`, or the entire
|
|
@ -1,13 +1,11 @@
|
||||||
import Lake
|
import Lake
|
||||||
open Lake DSL
|
open Lake DSL
|
||||||
|
|
||||||
package «Bookshelf»
|
package «Common»
|
||||||
|
|
||||||
require mathlib from git
|
require mathlib from git
|
||||||
"https://github.com/leanprover-community/mathlib4.git" @
|
"https://github.com/leanprover-community/mathlib4.git" @
|
||||||
"0107c50abf149a48b5b9ad08a0b2a2093bcb567a"
|
"0107c50abf149a48b5b9ad08a0b2a2093bcb567a"
|
||||||
|
|
||||||
@[default_target]
|
@[default_target]
|
||||||
lean_lib «Bookshelf» {
|
lean_lib «Common»
|
||||||
-- add library configuration options here
|
|
||||||
}
|
|
|
@ -1,8 +1,7 @@
|
||||||
{"version": 4,
|
{"version": 4,
|
||||||
"packagesDir": "lake-packages",
|
"packagesDir": "lake-packages",
|
||||||
"packages":
|
"packages":
|
||||||
[{"path": {"name": "Bookshelf", "dir": "./../bookshelf"}},
|
[{"git":
|
||||||
{"git":
|
|
||||||
{"url": "https://github.com/leanprover-community/mathlib4.git",
|
{"url": "https://github.com/leanprover-community/mathlib4.git",
|
||||||
"subDir?": null,
|
"subDir?": null,
|
||||||
"rev": "0107c50abf149a48b5b9ad08a0b2a2093bcb567a",
|
"rev": "0107c50abf149a48b5b9ad08a0b2a2093bcb567a",
|
||||||
|
@ -25,4 +24,5 @@
|
||||||
"subDir?": null,
|
"subDir?": null,
|
||||||
"rev": "5507f9d8409f93b984ce04eccf4914d534e6fca2",
|
"rev": "5507f9d8409f93b984ce04eccf4914d534e6fca2",
|
||||||
"name": "std",
|
"name": "std",
|
||||||
"inputRev?": "main"}}]}
|
"inputRev?": "main"}},
|
||||||
|
{"path": {"name": "Common", "dir": "./../common"}}]}
|
||||||
|
|
|
@ -3,7 +3,7 @@ open Lake DSL
|
||||||
|
|
||||||
package «first-course-abstract-algebra»
|
package «first-course-abstract-algebra»
|
||||||
|
|
||||||
require Bookshelf from "../bookshelf"
|
require Common from "../common"
|
||||||
require mathlib from git
|
require mathlib from git
|
||||||
"https://github.com/leanprover-community/mathlib4.git" @
|
"https://github.com/leanprover-community/mathlib4.git" @
|
||||||
"0107c50abf149a48b5b9ad08a0b2a2093bcb567a"
|
"0107c50abf149a48b5b9ad08a0b2a2093bcb567a"
|
||||||
|
|
|
@ -4,15 +4,15 @@ Chapter 0
|
||||||
Useful Facts About Sets
|
Useful Facts About Sets
|
||||||
-/
|
-/
|
||||||
|
|
||||||
import Bookshelf.Tuple
|
import Common.Tuple
|
||||||
|
|
||||||
/--
|
/--
|
||||||
The following describes a so-called "generic" tuple. Like in `Bookshelf.Tuple`,
|
The following describes a so-called "generic" tuple. Like in `Common.Tuple`, an
|
||||||
an `n`-tuple is defined recursively like so:
|
`n`-tuple is defined recursively like so:
|
||||||
|
|
||||||
`⟨x₁, ..., xₙ⟩ = ⟨⟨x₁, ..., xₙ₋₁⟩, xₙ⟩`
|
`⟨x₁, ..., xₙ⟩ = ⟨⟨x₁, ..., xₙ₋₁⟩, xₙ⟩`
|
||||||
|
|
||||||
Unlike `Bookshelf.Tuple`, a "generic" tuple bends the syntax above further. For
|
Unlike `Common.Tuple`, a "generic" tuple bends the syntax above further. For
|
||||||
example, both tuples above are equivalent to:
|
example, both tuples above are equivalent to:
|
||||||
|
|
||||||
`⟨⟨x₁, ..., xₘ⟩, xₘ₊₁, ..., xₙ⟩`
|
`⟨⟨x₁, ..., xₘ⟩, xₘ₊₁, ..., xₙ⟩`
|
||||||
|
@ -20,7 +20,7 @@ example, both tuples above are equivalent to:
|
||||||
for some `1 ≤ m ≤ n`. This distinction is purely syntactic, but necessary to
|
for some `1 ≤ m ≤ n`. This distinction is purely syntactic, but necessary to
|
||||||
prove certain theorems found in [1] (e.g. `lemma_0a`).
|
prove certain theorems found in [1] (e.g. `lemma_0a`).
|
||||||
|
|
||||||
In general, prefer `Bookshelf.Tuple`.
|
In general, prefer `Common.Tuple`.
|
||||||
-/
|
-/
|
||||||
inductive XTuple : (α : Type u) → (size : Nat × Nat) → Type u where
|
inductive XTuple : (α : Type u) → (size : Nat × Nat) → Type u where
|
||||||
| nil : XTuple α (0, 0)
|
| nil : XTuple α (0, 0)
|
||||||
|
@ -38,9 +38,9 @@ namespace XTuple
|
||||||
|
|
||||||
open scoped Tuple
|
open scoped Tuple
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Normalization
|
-- Normalization
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Converts an `XTuple` into "normal form".
|
Converts an `XTuple` into "normal form".
|
||||||
|
@ -97,9 +97,9 @@ theorem norm_snoc_eq_concat {t₁ : XTuple α (p, q)} {t₂ : Tuple α n}
|
||||||
: norm (snoc t₁ t₂) = Tuple.concat t₁.norm t₂ := by
|
: norm (snoc t₁ t₂) = Tuple.concat t₁.norm t₂ := by
|
||||||
conv => lhs; unfold norm
|
conv => lhs; unfold norm
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Equality
|
-- Equality
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Implements Boolean equality for `XTuple α n` provided `α` has decidable
|
Implements Boolean equality for `XTuple α n` provided `α` has decidable
|
||||||
|
@ -108,9 +108,9 @@ equality.
|
||||||
instance BEq [DecidableEq α] : BEq (XTuple α n) where
|
instance BEq [DecidableEq α] : BEq (XTuple α n) where
|
||||||
beq t₁ t₂ := t₁.norm == t₂.norm
|
beq t₁ t₂ := t₁.norm == t₂.norm
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Basic API
|
-- Basic API
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Returns the number of entries in the `XTuple`.
|
Returns the number of entries in the `XTuple`.
|
||||||
|
@ -163,9 +163,9 @@ def snd : XTuple α (m, n) → Tuple α n
|
||||||
| x[] => t[]
|
| x[] => t[]
|
||||||
| snoc _ ts => ts
|
| snoc _ ts => ts
|
||||||
|
|
||||||
/- -------------------------------------
|
-- ========================================
|
||||||
- Lemma 0A
|
-- Lemma 0A
|
||||||
- -------------------------------------/
|
-- ========================================
|
||||||
|
|
||||||
section
|
section
|
||||||
|
|
||||||
|
@ -188,13 +188,13 @@ lemma n_eq_succ_k : n = k + 1 :=
|
||||||
_ = 1 + k + m' - m' := by rw [Nat.add_assoc, Nat.add_comm]
|
_ = 1 + k + m' - m' := by rw [Nat.add_assoc, Nat.add_comm]
|
||||||
_ = 1 + k := by simp
|
_ = 1 + k := by simp
|
||||||
_ = k + 1 := by rw [Nat.add_comm]
|
_ = k + 1 := by rw [Nat.add_comm]
|
||||||
|
|
||||||
lemma n_pred_eq_k : n - 1 = k := by
|
lemma n_pred_eq_k : n - 1 = k := by
|
||||||
have h : k + 1 - 1 = k + 1 - 1 := rfl
|
have h : k + 1 - 1 = k + 1 - 1 := rfl
|
||||||
conv at h => lhs; rw [←n_eq_succ_k p q]
|
conv at h => lhs; rw [←n_eq_succ_k p q]
|
||||||
simp at h
|
simp at h
|
||||||
exact h
|
exact h
|
||||||
|
|
||||||
lemma n_geq_one : 1 ≤ n := by
|
lemma n_geq_one : 1 ≤ n := by
|
||||||
rw [n_eq_succ_k p q]
|
rw [n_eq_succ_k p q]
|
||||||
simp
|
simp
|
||||||
|
@ -221,7 +221,7 @@ def cast_norm : XTuple α (n, m - 1) → Tuple α (m + k)
|
||||||
|
|
||||||
def cast_fst : XTuple α (n, m - 1) → Tuple α (k + 1)
|
def cast_fst : XTuple α (n, m - 1) → Tuple α (k + 1)
|
||||||
| xs => cast (by rw [n_eq_succ_k p q]) xs.fst
|
| xs => cast (by rw [n_eq_succ_k p q]) xs.fst
|
||||||
|
|
||||||
def cast_take (ys : Tuple α (m + k)) :=
|
def cast_take (ys : Tuple α (m + k)) :=
|
||||||
cast (by rw [min_comm_succ_eq p]) (ys.take (k + 1))
|
cast (by rw [min_comm_succ_eq p]) (ys.take (k + 1))
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
{"version": 4,
|
{"version": 4,
|
||||||
"packagesDir": "lake-packages",
|
"packagesDir": "lake-packages",
|
||||||
"packages":
|
"packages":
|
||||||
[{"path": {"name": "Bookshelf", "dir": "./../bookshelf"}},
|
[{"git":
|
||||||
{"git":
|
|
||||||
{"url": "https://github.com/leanprover-community/mathlib4.git",
|
{"url": "https://github.com/leanprover-community/mathlib4.git",
|
||||||
"subDir?": null,
|
"subDir?": null,
|
||||||
"rev": "0107c50abf149a48b5b9ad08a0b2a2093bcb567a",
|
"rev": "0107c50abf149a48b5b9ad08a0b2a2093bcb567a",
|
||||||
|
@ -25,4 +24,5 @@
|
||||||
"subDir?": null,
|
"subDir?": null,
|
||||||
"rev": "5507f9d8409f93b984ce04eccf4914d534e6fca2",
|
"rev": "5507f9d8409f93b984ce04eccf4914d534e6fca2",
|
||||||
"name": "std",
|
"name": "std",
|
||||||
"inputRev?": "main"}}]}
|
"inputRev?": "main"}},
|
||||||
|
{"path": {"name": "Common", "dir": "./../common"}}]}
|
||||||
|
|
|
@ -3,9 +3,7 @@ open Lake DSL
|
||||||
|
|
||||||
package «mathematical-introduction-logic»
|
package «mathematical-introduction-logic»
|
||||||
|
|
||||||
require Bookshelf from "../bookshelf"
|
require Common from "../common"
|
||||||
|
|
||||||
@[default_target]
|
@[default_target]
|
||||||
lean_lib «enderton» {
|
lean_lib «enderton»
|
||||||
-- add library configuration options here
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,9 +4,11 @@ Chapter 2
|
||||||
Dependent Type Theory
|
Dependent Type Theory
|
||||||
-/
|
-/
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 1
|
-- Exercise 1
|
||||||
--
|
--
|
||||||
-- Define the function `Do_Twice`, as described in Section 2.4.
|
-- Define the function `Do_Twice`, as described in Section 2.4.
|
||||||
|
-- ========================================
|
||||||
namespace ex1
|
namespace ex1
|
||||||
|
|
||||||
def double (x : Nat) := x + x
|
def double (x : Nat) := x + x
|
||||||
|
@ -17,9 +19,11 @@ def doTwiceTwice (f : (Nat → Nat) → (Nat → Nat)) (x : Nat → Nat) := f (f
|
||||||
|
|
||||||
end ex1
|
end ex1
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 2
|
-- Exercise 2
|
||||||
--
|
--
|
||||||
-- Define the functions `curry` and `uncurry`, as described in Section 2.4.
|
-- Define the functions `curry` and `uncurry`, as described in Section 2.4.
|
||||||
|
-- ========================================
|
||||||
namespace ex2
|
namespace ex2
|
||||||
|
|
||||||
def curry (f : α × β → γ) : (α → β → γ) :=
|
def curry (f : α × β → γ) : (α → β → γ) :=
|
||||||
|
@ -30,6 +34,7 @@ def uncurry (f : α → β → γ) : (α × β → γ) :=
|
||||||
|
|
||||||
end ex2
|
end ex2
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 3
|
-- Exercise 3
|
||||||
--
|
--
|
||||||
-- Above, we used the example `vec α n` for vectors of elements of type `α` of
|
-- Above, we used the example `vec α n` for vectors of elements of type `α` of
|
||||||
|
@ -39,6 +44,8 @@ end ex2
|
||||||
-- implicit arguments for parameters that can be inferred. Declare some
|
-- implicit arguments for parameters that can be inferred. Declare some
|
||||||
-- variables and check some expressions involving the constants that you have
|
-- variables and check some expressions involving the constants that you have
|
||||||
-- declared.
|
-- declared.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex3
|
namespace ex3
|
||||||
|
|
||||||
universe u
|
universe u
|
||||||
|
@ -64,6 +71,7 @@ variable (c d : vec Prop 2)
|
||||||
|
|
||||||
end ex3
|
end ex3
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 4
|
-- Exercise 4
|
||||||
--
|
--
|
||||||
-- Similarly, declare a constant `matrix` so that `matrix α m n` could represent
|
-- Similarly, declare a constant `matrix` so that `matrix α m n` could represent
|
||||||
|
@ -72,6 +80,8 @@ end ex3
|
||||||
-- (using vec) multiplication of a matrix by a vector. Once again, declare some
|
-- (using vec) multiplication of a matrix by a vector. Once again, declare some
|
||||||
-- variables and check some expressions involving the constants that you have
|
-- variables and check some expressions involving the constants that you have
|
||||||
-- declared.
|
-- declared.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex4
|
namespace ex4
|
||||||
|
|
||||||
universe u
|
universe u
|
||||||
|
|
|
@ -4,10 +4,13 @@ Chapter 3
|
||||||
Propositions and Proofs
|
Propositions and Proofs
|
||||||
-/
|
-/
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 1
|
-- Exercise 1
|
||||||
--
|
--
|
||||||
-- Prove the following identities, replacing the "sorry" placeholders with
|
-- Prove the following identities, replacing the "sorry" placeholders with
|
||||||
-- actual proofs.
|
-- actual proofs.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex1
|
namespace ex1
|
||||||
|
|
||||||
open or
|
open or
|
||||||
|
@ -102,10 +105,13 @@ example : (p → q) → (¬q → ¬p) :=
|
||||||
|
|
||||||
end ex1
|
end ex1
|
||||||
|
|
||||||
-- Example 2
|
-- ========================================
|
||||||
|
-- Exercise 2
|
||||||
--
|
--
|
||||||
-- Prove the following identities, replacing the “sorry” placeholders with
|
-- Prove the following identities, replacing the “sorry” placeholders with
|
||||||
-- actual proofs. These require classical reasoning.
|
-- actual proofs. These require classical reasoning.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex2
|
namespace ex2
|
||||||
|
|
||||||
open Classical
|
open Classical
|
||||||
|
@ -147,9 +153,12 @@ example : (((p → q) → p) → p) :=
|
||||||
|
|
||||||
end ex2
|
end ex2
|
||||||
|
|
||||||
-- Example 3
|
-- ========================================
|
||||||
|
-- Exercise 3
|
||||||
--
|
--
|
||||||
-- Prove `¬(p ↔ ¬p)` without using classical logic.
|
-- Prove `¬(p ↔ ¬p)` without using classical logic.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex3
|
namespace ex3
|
||||||
|
|
||||||
variable (p : Prop)
|
variable (p : Prop)
|
||||||
|
|
|
@ -4,10 +4,13 @@ Chapter 4
|
||||||
Quantifiers and Equality
|
Quantifiers and Equality
|
||||||
-/
|
-/
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 1
|
-- Exercise 1
|
||||||
--
|
--
|
||||||
-- Prove these equivalences. You should also try to understand why the reverse
|
-- Prove these equivalences. You should also try to understand why the reverse
|
||||||
-- implication is not derivable in the last example.
|
-- implication is not derivable in the last example.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex1
|
namespace ex1
|
||||||
|
|
||||||
variable (α : Type _)
|
variable (α : Type _)
|
||||||
|
@ -34,11 +37,14 @@ example : (∀ x, p x) ∨ (∀ x, q x) → ∀ x, p x ∨ q x :=
|
||||||
|
|
||||||
end ex1
|
end ex1
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 2
|
-- Exercise 2
|
||||||
--
|
--
|
||||||
-- It is often possible to bring a component of a formula outside a universal
|
-- It is often possible to bring a component of a formula outside a universal
|
||||||
-- quantifier, when it does not depend on the quantified variable. Try proving
|
-- quantifier, when it does not depend on the quantified variable. Try proving
|
||||||
-- these (one direction of the second of these requires classical logic).
|
-- these (one direction of the second of these requires classical logic).
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex2
|
namespace ex2
|
||||||
|
|
||||||
variable (α : Type _)
|
variable (α : Type _)
|
||||||
|
@ -70,11 +76,14 @@ example : (∀ x, r → p x) ↔ (r → ∀ x, p x) :=
|
||||||
|
|
||||||
end ex2
|
end ex2
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 3
|
-- Exercise 3
|
||||||
--
|
--
|
||||||
-- Consider the "barber paradox," that is, the claim that in a certain town
|
-- Consider the "barber paradox," that is, the claim that in a certain town
|
||||||
-- there is a (male) barber that shaves all and only the men who do not shave
|
-- there is a (male) barber that shaves all and only the men who do not shave
|
||||||
-- themselves. Prove that this is a contradiction.
|
-- themselves. Prove that this is a contradiction.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex3
|
namespace ex3
|
||||||
|
|
||||||
open Classical
|
open Classical
|
||||||
|
@ -91,6 +100,7 @@ example (h : ∀ x : men, shaves barber x ↔ ¬shaves x x) : False :=
|
||||||
|
|
||||||
end ex3
|
end ex3
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 4
|
-- Exercise 4
|
||||||
--
|
--
|
||||||
-- Remember that, without any parameters, an expression of type `Prop` is just
|
-- Remember that, without any parameters, an expression of type `Prop` is just
|
||||||
|
@ -101,6 +111,8 @@ end ex3
|
||||||
-- states that every odd number greater than `5` is the sum of three primes.
|
-- states that every odd number greater than `5` is the sum of three primes.
|
||||||
-- Look up the definition of a Fermat prime or any of the other statements, if
|
-- Look up the definition of a Fermat prime or any of the other statements, if
|
||||||
-- necessary.
|
-- necessary.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex4
|
namespace ex4
|
||||||
|
|
||||||
def even (a : Nat) := ∃ b, a = 2 * b
|
def even (a : Nat) := ∃ b, a = 2 * b
|
||||||
|
@ -132,9 +144,12 @@ def Fermat'sLastTheorem : Prop :=
|
||||||
|
|
||||||
end ex4
|
end ex4
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 5
|
-- Exercise 5
|
||||||
--
|
--
|
||||||
-- Prove as many of the identities listed in Section 4.4 as you can.
|
-- Prove as many of the identities listed in Section 4.4 as you can.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex5
|
namespace ex5
|
||||||
|
|
||||||
open Classical
|
open Classical
|
||||||
|
@ -215,9 +230,12 @@ example (a : α) : (∃ x, r → p x) ↔ (r → ∃ x, p x) :=
|
||||||
|
|
||||||
end ex5
|
end ex5
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 6
|
-- Exercise 6
|
||||||
--
|
--
|
||||||
-- Give a calculational proof of the theorem `log_mul` below.
|
-- Give a calculational proof of the theorem `log_mul` below.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex6
|
namespace ex6
|
||||||
|
|
||||||
variable (log exp : Float → Float)
|
variable (log exp : Float → Float)
|
||||||
|
|
|
@ -4,13 +4,18 @@ Chapter 5
|
||||||
Tactics
|
Tactics
|
||||||
-/
|
-/
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 1
|
-- Exercise 1
|
||||||
--
|
--
|
||||||
-- Go back to the exercises in Chapter 3 and Chapter 4 and redo as many as you
|
-- Go back to the exercises in Chapter 3 and Chapter 4 and redo as many as you
|
||||||
-- can now with tactic proofs, using also `rw` and `simp` as appropriate.
|
-- can now with tactic proofs, using also `rw` and `simp` as appropriate.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex1
|
namespace ex1
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 3.1
|
-- Exercises 3.1
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex3_1
|
section ex3_1
|
||||||
|
|
||||||
|
@ -151,7 +156,9 @@ example : (p → q) → (¬q → ¬p) := by
|
||||||
|
|
||||||
end ex3_1
|
end ex3_1
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 3.2
|
-- Exercises 3.2
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex3_2
|
section ex3_2
|
||||||
|
|
||||||
|
@ -220,7 +227,9 @@ example : (((p → q) → p) → p) := by
|
||||||
|
|
||||||
end ex3_2
|
end ex3_2
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 3.3
|
-- Exercises 3.3
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex3_3
|
section ex3_3
|
||||||
|
|
||||||
|
@ -232,7 +241,9 @@ example (hp : p) : ¬(p ↔ ¬p) := by
|
||||||
|
|
||||||
end ex3_3
|
end ex3_3
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 4.1
|
-- Exercises 4.1
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex4_1
|
section ex4_1
|
||||||
|
|
||||||
|
@ -261,7 +272,9 @@ example : (∀ x, p x) ∨ (∀ x, q x) → ∀ x, p x ∨ q x := by
|
||||||
|
|
||||||
end ex4_1
|
end ex4_1
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 4.2
|
-- Exercises 4.2
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex4_2
|
section ex4_2
|
||||||
|
|
||||||
|
@ -313,7 +326,9 @@ example : (∀ x, r → p x) ↔ (r → ∀ x, p x) := by
|
||||||
|
|
||||||
end ex4_2
|
end ex4_2
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 4.3
|
-- Exercises 4.3
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex4_3
|
section ex4_3
|
||||||
|
|
||||||
|
@ -332,7 +347,9 @@ example (h : ∀ x : men, shaves barber x ↔ ¬ shaves x x) : False := by
|
||||||
|
|
||||||
end ex4_3
|
end ex4_3
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Exercises 4.5
|
-- Exercises 4.5
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
section ex4_5
|
section ex4_5
|
||||||
|
|
||||||
|
@ -443,9 +460,12 @@ end ex4_5
|
||||||
|
|
||||||
end ex1
|
end ex1
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 2
|
-- Exercise 2
|
||||||
--
|
--
|
||||||
-- Use tactic combinators to obtain a one line proof of the following:
|
-- Use tactic combinators to obtain a one line proof of the following:
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex2
|
namespace ex2
|
||||||
|
|
||||||
example (p q r : Prop) (hp : p) : (p ∨ q ∨ r) ∧ (q ∨ p ∨ r) ∧ (q ∨ r ∨ p) :=
|
example (p q r : Prop) (hp : p) : (p ∨ q ∨ r) ∧ (q ∨ p ∨ r) ∧ (q ∨ r ∨ p) :=
|
||||||
|
|
|
@ -4,6 +4,7 @@ Chapter 7
|
||||||
Inductive Types
|
Inductive Types
|
||||||
-/
|
-/
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 1
|
-- Exercise 1
|
||||||
--
|
--
|
||||||
-- Try defining other operations on the natural numbers, such as multiplication,
|
-- Try defining other operations on the natural numbers, such as multiplication,
|
||||||
|
@ -15,6 +16,8 @@ Inductive Types
|
||||||
-- Since many of these are already defined in Lean’s core library, you should
|
-- Since many of these are already defined in Lean’s core library, you should
|
||||||
-- work within a namespace named hide, or something like that, in order to avoid
|
-- work within a namespace named hide, or something like that, in order to avoid
|
||||||
-- name clashes.
|
-- name clashes.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex1
|
namespace ex1
|
||||||
|
|
||||||
-- As defined in the book.
|
-- As defined in the book.
|
||||||
|
@ -74,6 +77,7 @@ end Nat
|
||||||
|
|
||||||
end ex1
|
end ex1
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 2
|
-- Exercise 2
|
||||||
--
|
--
|
||||||
-- Define some operations on lists, like a `length` function or the `reverse`
|
-- Define some operations on lists, like a `length` function or the `reverse`
|
||||||
|
@ -82,6 +86,8 @@ end ex1
|
||||||
-- a. `length (s ++ t) = length s + length t`
|
-- a. `length (s ++ t) = length s + length t`
|
||||||
-- b. `length (reverse t) = length t`
|
-- b. `length (reverse t) = length t`
|
||||||
-- c. `reverse (reverse t) = t`
|
-- c. `reverse (reverse t) = t`
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex2
|
namespace ex2
|
||||||
|
|
||||||
variable {α : Type _}
|
variable {α : Type _}
|
||||||
|
@ -171,6 +177,7 @@ theorem reverse_reverse (t : List α)
|
||||||
|
|
||||||
end ex2
|
end ex2
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 3
|
-- Exercise 3
|
||||||
--
|
--
|
||||||
-- Define an inductive data type consisting of terms built up from the following
|
-- Define an inductive data type consisting of terms built up from the following
|
||||||
|
@ -183,6 +190,8 @@ end ex2
|
||||||
--
|
--
|
||||||
-- Recursively define a function that evaluates any such term with respect to an
|
-- Recursively define a function that evaluates any such term with respect to an
|
||||||
-- assignment of values to the variables.
|
-- assignment of values to the variables.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex3
|
namespace ex3
|
||||||
|
|
||||||
inductive Foo : Type _
|
inductive Foo : Type _
|
||||||
|
|
|
@ -4,12 +4,15 @@ Chapter 8
|
||||||
Induction and Recursion
|
Induction and Recursion
|
||||||
-/
|
-/
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 1
|
-- Exercise 1
|
||||||
--
|
--
|
||||||
-- Open a namespace `Hidden` to avoid naming conflicts, and use the equation
|
-- Open a namespace `Hidden` to avoid naming conflicts, and use the equation
|
||||||
-- compiler to define addition, multiplication, and exponentiation on the
|
-- compiler to define addition, multiplication, and exponentiation on the
|
||||||
-- natural numbers. Then use the equation compiler to derive some of their basic
|
-- natural numbers. Then use the equation compiler to derive some of their basic
|
||||||
-- properties.
|
-- properties.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex1
|
namespace ex1
|
||||||
|
|
||||||
def add : Nat → Nat → Nat
|
def add : Nat → Nat → Nat
|
||||||
|
@ -26,11 +29,14 @@ def exp : Nat → Nat → Nat
|
||||||
|
|
||||||
end ex1
|
end ex1
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 2
|
-- Exercise 2
|
||||||
--
|
--
|
||||||
-- Similarly, use the equation compiler to define some basic operations on lists
|
-- Similarly, use the equation compiler to define some basic operations on lists
|
||||||
-- (like the reverse function) and prove theorems about lists by induction (such
|
-- (like the reverse function) and prove theorems about lists by induction (such
|
||||||
-- as the fact that `reverse (reverse xs) = xs` for any list `xs`).
|
-- as the fact that `reverse (reverse xs) = xs` for any list `xs`).
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex2
|
namespace ex2
|
||||||
|
|
||||||
variable {α : Type _}
|
variable {α : Type _}
|
||||||
|
@ -43,11 +49,14 @@ def reverse : List α → List α
|
||||||
|
|
||||||
end ex2
|
end ex2
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 3
|
-- Exercise 3
|
||||||
--
|
--
|
||||||
-- Define your own function to carry out course-of-value recursion on the
|
-- Define your own function to carry out course-of-value recursion on the
|
||||||
-- natural numbers. Similarly, see if you can figure out how to define
|
-- natural numbers. Similarly, see if you can figure out how to define
|
||||||
-- `WellFounded.fix` on your own.
|
-- `WellFounded.fix` on your own.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex3
|
namespace ex3
|
||||||
|
|
||||||
def below {motive : Nat → Type} : Nat → Type
|
def below {motive : Nat → Type} : Nat → Type
|
||||||
|
@ -58,11 +67,14 @@ def below {motive : Nat → Type} : Nat → Type
|
||||||
|
|
||||||
end ex3
|
end ex3
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 4
|
-- Exercise 4
|
||||||
--
|
--
|
||||||
-- Following the examples in Section Dependent Pattern Matching, define a
|
-- Following the examples in Section Dependent Pattern Matching, define a
|
||||||
-- function that will append two vectors. This is tricky; you will have to
|
-- function that will append two vectors. This is tricky; you will have to
|
||||||
-- define an auxiliary function.
|
-- define an auxiliary function.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex4
|
namespace ex4
|
||||||
|
|
||||||
inductive Vector (α : Type u) : Nat → Type u
|
inductive Vector (α : Type u) : Nat → Type u
|
||||||
|
@ -77,11 +89,14 @@ end Vector
|
||||||
|
|
||||||
end ex4
|
end ex4
|
||||||
|
|
||||||
|
-- ========================================
|
||||||
-- Exercise 5
|
-- Exercise 5
|
||||||
--
|
--
|
||||||
-- Consider the following type of arithmetic expressions. The idea is that
|
-- Consider the following type of arithmetic expressions. The idea is that
|
||||||
-- `var n` is a variable, `vₙ`, and `const n` is the constant whose value is
|
-- `var n` is a variable, `vₙ`, and `const n` is the constant whose value is
|
||||||
-- `n`.
|
-- `n`.
|
||||||
|
-- ========================================
|
||||||
|
|
||||||
namespace ex5
|
namespace ex5
|
||||||
|
|
||||||
inductive Expr where
|
inductive Expr where
|
||||||
|
@ -113,10 +128,12 @@ def sampleVal : Nat → Nat
|
||||||
-- Try it out. You should get 47 here.
|
-- Try it out. You should get 47 here.
|
||||||
-- #eval eval sampleVal sampleExpr
|
-- #eval eval sampleVal sampleExpr
|
||||||
|
|
||||||
|
-- ----------------------------------------
|
||||||
-- Implement "constant fusion," a procedure that simplifies subterms like
|
-- Implement "constant fusion," a procedure that simplifies subterms like
|
||||||
-- `5 + 7` to `12`. Using the auxiliary function `simpConst`, define a function
|
-- `5 + 7` to `12`. Using the auxiliary function `simpConst`, define a function
|
||||||
-- "fuse": to simplify a plus or a times, first simplify the arguments
|
-- "fuse": to simplify a plus or a times, first simplify the arguments
|
||||||
-- recursively, and then apply `simpConst` to try to simplify the result.
|
-- recursively, and then apply `simpConst` to try to simplify the result.
|
||||||
|
-- ----------------------------------------
|
||||||
|
|
||||||
def simpConst : Expr → Expr
|
def simpConst : Expr → Expr
|
||||||
| plus (const n₁) (const n₂) => const (n₁ + n₂)
|
| plus (const n₁) (const n₂) => const (n₁ + n₂)
|
||||||
|
|
Loading…
Reference in New Issue