lean theorem prover
play

Lean Theorem Prover Tom van Bussel June 14, 2017 Goals It aims to - PowerPoint PPT Presentation

Lean Theorem Prover Tom van Bussel June 14, 2017 Goals It aims to bridge the gap between interactive and automated theorem proving, by situating automated tools and methods in a framework that supports user interaction and the construction


  1. Lean Theorem Prover Tom van Bussel June 14, 2017

  2. Goals “It aims to bridge the gap between interactive and automated theorem proving, by situating automated tools and methods in a framework that supports user interaction and the construction of fully specified axiomatic proofs”

  3. Background ◮ Developed at Microsoft Research and Carnegie Mellon University ◮ Original authors: ◮ Leonardo de Moura ◮ Soonho Kong ◮ Jeremy Avigad ◮ Floris van Doorn ◮ Jakob von Raumer Since then, many other people have worked on Lean

  4. Background ◮ Calculus of Inductive Constructions ◮ Implemented in C++ ◮ Relatively small kernel of 6000 lines ◮ Additional features such as inductive type families implemented on top in 700 lines ◮ Proofs and tactics are written in Lean ◮ Emacs and VS Code plug-ins ◮ Browser version written in Javascript

  5. Tactic-style proofs example (a b : Prop) : a /\ b -> b /\ a := 1 begin 2 intro h, 3 cases h, 4 split, 5 assumption, 6 assumption 7 end 8

  6. Declarative proofs example (a b : Prop) : a /\ b -> b /\ a := 1 fun h, and.intro (and.right h) (and.left h) 2

  7. Declarative proofs example (a b : Prop) : a /\ b -> b /\ a := 1 fun h, and.intro (and.right h) (and.left h) 2 example (a b : Prop) : a /\ b -> b /\ a := 1 assume h : a /\ b, 2 have ha : a, from and.left h, 3 have hb : b, from and.right h, 4 show b /\ a, from and.intro hb ha 5

  8. Demo

  9. Features ◮ Recursive equations ◮ Coercions ◮ Ad-hoc polymorphism notation a + b := add a b notation a + b := bor a b ◮ Type classes ◮ Haskell-style monads ◮ Namespaces open classical (renaming em -> excluded_middle) ◮ C++ code generation

  10. Structures ◮ Special kind of inductive datatype with only one constructor ◮ Projections are generated automatically ◮ Subtyping/Inheritance structure prod (a b : Type) := 1 mk :: (fst : a) (snd : b) 2 3 structure has_mul (a : Type u) := 4 (mul : a -> a -> a) 5 6 structure semigroup [class] (A : Type) 7 extends has_mul A := 8 (mul_assoc : forall a b c, 9 mul (mul a b) c = mul a (mul b c)) 10

  11. Types nat : Type Type : Type

  12. Types nat : Type Type : Type Hierarchy of Types Type.{0} : Type.{1} : Type.{2} : Type.{3} : ... fun (A : Type.{u}) (a : A), a

  13. Automation ◮ Implemented as tactics ◮ Resolution prover ◮ Isabelle’s auto ◮ SMT-like automation: Congruence closure, E-matching ◮ Superposition (similar to metis)

  14. Small demo

  15. Lean vs Coq Freek: “It has proof irrelevance, function extensionality, classical logic, even a choice operator as part of the standard setup (exactly which of those are hardwired in, and which ones are just conventionally available in the library, I don’t know.)”

  16. Proof Irrelevance Proof irrelevance for Prop is built in. lemma proof_irrel {a : Prop} (h1 h2 : a) : h1 = h2 := rfl

  17. Axiom of Choice class inductive nonempty (a : Sort u) : Prop | intro : a -> nonempty axiom choice {a : Sort u} : nonempty a -> a Hilbert’s epsilon operator noncomputable def epsilon {a : Sort u} [h : nonempty a] (p : a -> Prop) : a := ...

  18. Function extensionality Function extensionality is proved from the quotient construction, which is also defined in the standard library and requires a few extra axioms. theorem funext {f1 f2 : forall x : a, b x} (h : forall x, f1 x = f2 x) : f1 = f2 := ...

  19. Classical logic The law of excluded middle follows from Diaconescu’s lemma using function extensionality, propositional extensionality and the axiom of choice. theorem em : p \/ not p := ...

  20. Demo

  21. Additional information https://leanprover.github.io

Recommend


More recommend