lean4-htt/tests/lean/445.lean
Leonardo de Moura f2a418a7ae chore: smartUnfolding cleanup
We remove dead code, update comments, and add new tests

See #445
2021-09-19 15:29:11 -07:00

92 lines
1.6 KiB
Text

import Lean
def f : Nat → Bool
| 0 => true
| n + 1 => (match n with
| 0 => true
| _ + 1 => true) && f n
def g (i j : Nat) : Nat :=
if i < 5 then 0 else
match j with
| Nat.zero => 1
| Nat.succ j => g i j
def h (i j : Nat) : Nat :=
i +
match j with
| Nat.zero => 1
| Nat.succ j => h i j
def r (i j : Nat) : Nat :=
i +
match j with
| Nat.zero => 1
| Nat.succ j =>
i * match j with
| Nat.zero => 2
| Nat.succ j => r i j
def s (i j : Nat) : Nat :=
let z :=
match j with
| Nat.zero => i
| Nat.succ j => s i j
z + z
example : f 0 = true :=
rfl
example : f (i+1) = ((match i with | 0 => true | _ + 1 => true) && f i) :=
rfl
example : g i (j + 1) = if i < 5 then 0 else g i j :=
rfl
example : g i 0 = if i < 5 then 0 else 1 :=
rfl
example : h i 0 = i + 1 :=
rfl
example : h i (j + 1) = i + h i j :=
rfl
example : r i 0 = i + 1 :=
rfl
example : r i 1 = i + i * 2 :=
rfl
example : r i (j + 2) = i + i * r i j :=
rfl
example : s i (j + 1) = let z := s i j; z + z :=
rfl
open Lean
open Lean.Meta
open Lean.Elab
open Lean.Elab.Command
elab "unfold " e:term : command =>
runTermElabM none fun xs => do
let e ← instantiateMVars (← Term.withSynthesize <| Term.elabTerm e none)
match (← unfoldDefinition? e) with
| some e => logInfo m!"{e}"
| none => throwError ""
section end
variable (i j : Nat)
unfold f 0
unfold f (i+1)
unfold g i 0
unfold g i (j+1)
unfold h i 0
unfold h i (j + 1)
unfold r i 0
unfold r i 1
unfold r i (j + 2)
unfold r i j.succ.succ
unfold s i (j + 1)