chasenorman/CanonicalLean

A Lean tactic for Canonical, a search procedure for terms in dependent type theory.

Lean

136

125 commits

updated Sep 18, 2026

See the code

README

Canonical

Canonical exhaustively searches for terms in dependent type theory. The canonical tactic proves theorems, synthesizes programs, and constructs objects in Lean.

https://github.com/user-attachments/assets/ec13ad85-7d09-4a32-9c73-3b5b501722a4

Installation

Add the following dependency to your lakefile.toml:

[[require]]
name = "Canonical"
scope = "chasenorman"

Or, if you are using a lakefile.lean:

require "chasenorman" / "Canonical"

You should then be prompted to run lake update Canonical.

Usage

Basic examples:

import Canonical

-- prove properties by induction
def add_assoc (a b c : Nat) : (a + b) + c = a + (b + c) := 
  by canonical

-- enumerate over elements of a type
example : List Nat := by canonical (count := 10)

-- supply premises
def Set (X : Type) := X → Prop
axiom P_ne_not_P : P ≠ ¬ P
theorem Cantor (f : X → Set X) : ¬ ∀ y, ∃ x, f x = y :=
  by canonical [P_ne_not_P, congrFun]

More examples can be found in the Canonical repository.

automated-reasoning
dependent-types
dependent-type-theory
formal-methods
lean4
program-synthesis
theorem-prover
theorem-proving

Contributors

chasenorman

125 commits

chasenorman/CanonicalLean

A Lean tactic for Canonical, a search procedure for terms in dependent type theory.

Lean

136

125 commits

updated Sep 18, 2026

See the code

README

Canonical

Canonical exhaustively searches for terms in dependent type theory. The canonical tactic proves theorems, synthesizes programs, and constructs objects in Lean.

https://github.com/user-attachments/assets/ec13ad85-7d09-4a32-9c73-3b5b501722a4

Installation

Add the following dependency to your lakefile.toml:

[[require]]
name = "Canonical"
scope = "chasenorman"

Or, if you are using a lakefile.lean:

require "chasenorman" / "Canonical"

You should then be prompted to run lake update Canonical.

Usage

Basic examples:

import Canonical

-- prove properties by induction
def add_assoc (a b c : Nat) : (a + b) + c = a + (b + c) := 
  by canonical

-- enumerate over elements of a type
example : List Nat := by canonical (count := 10)

-- supply premises
def Set (X : Type) := X → Prop
axiom P_ne_not_P : P ≠ ¬ P
theorem Cantor (f : X → Set X) : ¬ ∀ y, ∃ x, f x = y :=
  by canonical [P_ne_not_P, congrFun]

More examples can be found in the Canonical repository.

automated-reasoning
dependent-types
dependent-type-theory
formal-methods
lean4
program-synthesis
theorem-prover
theorem-proving

Contributors

chasenorman

125 commits

Languages

Lean

80.6%

JavaScript

19.4%