test(tests/lean): standard induction

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2014-01-07 10:18:31 -08:00
parent d9c41e7282
commit 8f3c97ca98
2 changed files with 53 additions and 0 deletions

View file

@ -0,0 +1,37 @@
import macros -- loads the take, assume, obtain macros
using Nat -- using the Nat namespace (it allows us to suppress the Nat:: prefix)
axiom Induction : ∀ P : Nat → Bool, P 0 ⇒ (∀ n, P n ⇒ P (n + 1)) ⇒ ∀ n, P n.
-- induction on n
theorem Comm1 : ∀ n m, n + m = m + n
:= Induction
◂ _ -- I use a placeholder because I do not want to write the P
◂ (take m, -- Base case
calc 0 + m = m : add::zerol m
... = m + 0 : symm (add::zeror m))
◂ (take n, -- Inductive case
assume (iH : ∀ m, n + m = m + n),
take m,
calc n + 1 + m = (n + m) + 1 : add::succl n m
... = (m + n) + 1 : { iH ◂ m }
... = m + (n + 1) : symm (add::succr m n))
-- indunction on m
theorem Comm2 : ∀ n m, n + m = m + n
:= take n,
Induction
◂ _
◂ (calc n + 0 = n : add::zeror n
... = 0 + n : symm (add::zerol n))
◂ (take m,
assume (iH : n + m = m + n),
calc n + (m + 1) = (n + m) + 1 : add::succr n m
... = (m + n) + 1 : { iH }
... = (m + 1) + n : symm (add::succl m n))
print environment 1

View file

@ -0,0 +1,16 @@
Set: pp::colors
Set: pp::unicode
Imported 'macros'
Using: Nat
Assumed: Induction
Proved: Comm1
Proved: Comm2
theorem Comm2 : ∀ n m : , n + m = m + n :=
forall::intro
(λ n : ,
Induction ◂ (λ x : , n + x == x + n) ◂ (Nat::add::zeror n ⋈ symm (Nat::add::zerol n)) ◂
forall::intro
(λ m : ,
discharge
(λ iH : n + m = m + n,
Nat::add::succr n m ⋈ subst (refl (n + m + 1)) iH ⋈ symm (Nat::add::succl m n))))