Lean 4 on FreeBSD 15
Table of Contents
- 1. Overview
- 2. Prerequisites
- 3. Installation
- 4. Basic Validation
- 5. Example: Natural Numbers
- 6. Example: Propositional Logic
- 7. Example: List Operations
- 8. Example: Type Classes
- 9. Lake Project Setup
- 10. Mathlib4 (Optional)
- 11. Emacs Integration
- 12. Validation Summary
- 13. Comparison: 14.3 vs 15.0
- 14. Full Diagnostic Commands
- 15. References
1. Overview
Validation of Lean4 theorem prover on FreeBSD 15.0-RELEASE, updated from the FreeBSD 14 validation document.
1.1. Version Information
| Component | Version |
|---|---|
| OS | FreeBSD 15.0-RELEASE-p1 |
| Lean | 4.27.0-pre |
| Lake | 5.0.0-src |
| Package | lean4-4.25.2.20251201 |
2. Prerequisites
2.1. procfs (Required)
Lean4 requires procfs to be mounted.
mount | grep proc
procfs on /proc (procfs, local) linprocfs on /compat/linux/proc (linprocfs, local)
Ensure it's in /etc/fstab:
proc /proc procfs rw 0 0
3. Installation
pkg install lean4
Verify installation:
lean --version
lake --version
Lean (version 4.27.0-pre, x86_64-unknown-freebsd15.0, Release) Lake version 5.0.0-src (Lean version 4.27.0, commit )
4. Basic Validation
4.1. Theorem Proving
theorem test : 1 + 1 = 2 := rfl
#check test
4.2. Evaluation
#eval 2 + 2
4.3. Standard Library Access
#check Nat.add_comm
5. Example: Natural Numbers
-- Natural number examples on FreeBSD 15.0
-- Basic theorem
theorem add_zero (n : Nat) : n + 0 = n := rfl
-- Proof by induction
theorem add_succ (n m : Nat) : n + Nat.succ m = Nat.succ (n + m) := rfl
-- Commutativity (from stdlib)
#check Nat.add_comm
-- Simple evaluation
#eval (List.range 10).map (· * 2)
6. Example: Propositional Logic
-- Propositional logic examples
-- Modus ponens
theorem modus_ponens (P Q : Prop) (hp : P) (hpq : P → Q) : Q :=
hpq hp
-- Conjunction introduction
theorem and_intro (P Q : Prop) (hp : P) (hq : Q) : P ∧ Q :=
⟨hp, hq⟩
-- Conjunction elimination
theorem and_left (P Q : Prop) (h : P ∧ Q) : P :=
h.left
theorem and_right (P Q : Prop) (h : P ∧ Q) : Q :=
h.right
-- Disjunction
theorem or_intro_left (P Q : Prop) (hp : P) : P ∨ Q :=
Or.inl hp
-- Double negation (classical)
theorem dne (P : Prop) : ¬¬P → P := by
intro hnnp
by_contra hnp
exact hnnp hnp
7. Example: List Operations
-- List operations and proofs
def myLength : List α → Nat
| [] => 0
| _ :: xs => 1 + myLength xs
def myReverse : List α → List α
| [] => []
| x :: xs => myReverse xs ++ [x]
-- Prove length is preserved by reverse
theorem reverse_length (xs : List α) : (myReverse xs).length = xs.length := by
induction xs with
| nil => rfl
| cons x xs ih =>
simp [myReverse, List.length_append]
omega
-- Map preserves length
theorem map_length (f : α → β) (xs : List α) : (xs.map f).length = xs.length := by
induction xs with
| nil => rfl
| cons x xs ih => simp [ih]
#eval myReverse [1, 2, 3, 4, 5]
#eval myLength ["a", "b", "c"]
8. Example: Type Classes
-- Type class examples
class Monoid (α : Type) where
unit : α
op : α → α → α
left_unit : ∀ x, op unit x = x
right_unit : ∀ x, op x unit = x
assoc : ∀ x y z, op (op x y) z = op x (op y z)
-- Natural numbers under addition form a monoid
instance : Monoid Nat where
unit := 0
op := (· + ·)
left_unit := Nat.zero_add
right_unit := Nat.add_zero
assoc := Nat.add_assoc
-- List concatenation forms a monoid
instance : Monoid (List α) where
unit := []
op := (· ++ ·)
left_unit := List.nil_append
right_unit := List.append_nil
assoc := List.append_assoc
-- Generic fold using monoid
def mconcat [Monoid α] (xs : List α) : α :=
xs.foldl Monoid.op Monoid.unit
#eval mconcat [[1,2], [3,4], [5,6]] -- [1, 2, 3, 4, 5, 6]
#eval mconcat [1, 2, 3, 4, 5] -- 15
9. Lake Project Setup
9.1. Creating Projects
lake new creates a new project in a subdirectory:
lake new myproject
cd myproject && lake build
info: myproject: no previous manifest, creating one from scratch info: toolchain not updated; no toolchain information found ✔ [8/8] Built myproject:exe Build completed successfully (8 jobs).
9.2. Initializing in Existing Directory
lake init initializes a project in the current directory:
mkdir -p /tmp/existingdir
cd /tmp/existingdir
lake init myproj
9.3. Common Mistake
Passing a path to lake init fails because it interprets the entire path as a package name:
lake init /tmp/test 2>&1 || true
error: illegal package name '/tmp/test'
Correct usage: navigate to directory first, then run lake init projectname.
9.4. Building a Project
cd myproject && lake build 2>&1 | head -10
info: myproject: no previous manifest, creating one from scratch info: toolchain not updated; no toolchain information found ✔ [2/8] Built Myproject.Basic ✔ [3/8] Built Myproject.Basic:c.o ✔ [4/8] Built Myproject ✔ [5/8] Built Myproject:c.o ✔ [6/8] Built Main ✔ [7/8] Built Main:c.o ✔ [8/8] Built myproject:exe Build completed successfully (8 jobs).
10. Mathlib4 (Optional)
For advanced mathematics, add Mathlib4:
-- In lakefile.lean, add:
require mathlib from git
"https://github.com/leanprover-community/mathlib4"
Then:
lake update
lake build
Note: Mathlib4 takes significant time to build (~30-60 min).
11. Emacs Integration
11.1. lean4-mode Setup
;; Lean4 mode for Emacs
(use-package lean4-mode
:straight (lean4-mode
:type git
:host github
:repo "leanprover/lean4-mode"
:files ("*.el" "data"))
:commands lean4-mode
:mode ("\\.lean\\'" . lean4-mode)
:config
(setq lean4-keybinding-lean4-toggle-info "C-c C-i"))
11.2. Org-Babel Support
;; Add to init.el for org-babel lean4 support
(defun org-babel-execute:lean4 (body params)
"Execute Lean4 code in org-babel."
(let ((tmp-file (make-temp-file "lean4-" nil ".lean")))
(with-temp-file tmp-file
(insert body))
(shell-command-to-string
(format "lean --run %s 2>&1 || lean %s 2>&1" tmp-file tmp-file))))
(add-to-list 'org-babel-load-languages '(lean4 . t))
12. Validation Summary
| Test | Status | Notes |
|---|---|---|
| Installation | ✓ | pkg install lean4 |
| procfs mounted | ✓ | Required for Lean |
lean --version |
✓ | 4.27.0-pre |
lake --version |
✓ | 5.0.0-src |
| Theorem proving | ✓ | rfl, induction work |
#eval |
✓ | Evaluation works |
| Standard library | ✓ | Nat, List, etc. accessible |
lake new |
✓ | Creates project in subdirectory |
lake init |
✓ | Initializes in current dir |
lake build |
✓ | Compiles projects successfully |
13. Comparison: 14.3 vs 15.0
| Aspect | FreeBSD 14.3 | FreeBSD 15.0 |
|---|---|---|
| Lean version | 4.23.0 | 4.27.0-pre |
| Lake version | 4.x | 5.0.0-src |
| procfs | Required | Required |
| Core proving | ✓ | ✓ |
| Lake projects | ✓ | ✓ |
| Package size | 1.90 GiB | 2.20 GiB |
14. Full Diagnostic Commands
echo "=== Full System Info ==="
echo "OS: $(uname -srm)"
echo "Lean: $(lean --version 2>&1)"
echo "Lake: $(lake --version 2>&1)"
echo "procfs: $(mount | grep 'procfs on /proc' || echo 'NOT MOUNTED')"
echo "pkg: $(pkg info lean4 2>&1 | grep Version || echo 'NOT INSTALLED')"
=== Full System Info === OS: FreeBSD 15.0-RELEASE amd64 Lean: Lean (version 4.27.0-pre, x86_64-unknown-freebsd15.0, Release) Lake: Lake version 5.0.0-src (Lean version 4.27.0, commit ) procfs: procfs on /proc (procfs, local) pkg: Version : 4.25.2.20251201