lean4-htt/tests/lean/run/eqThm.lean
Leonardo de Moura 5caf1bc692 chore: style
Use `·` instead of `.` for structuring tactics.
2022-03-11 16:12:46 -08:00

45 lines
1.4 KiB
Text

def f : Nat → Bool → Nat
| 0, true => 1
| 0, false => 2
| 1, true => 3
| 1, _ => 4
| x+2, true => f x true
| x+2, b => f x (not b)
macro "urfl" : tactic => `(set_option smartUnfolding false in rfl)
theorem f_main_eq : f x b = f.match_1 (fun _ _ => Nat) x b (fun _ => 1) (fun _ => 2) (fun _ => 3) (fun _ => 4) (fun x => f x true) (fun x b => f x (not b)) := by
split <;> (first | rfl | (conv => lhs; delta f; whnf; simp_match); try urfl)
#check @f_main_eq
def g : List Nat → List Nat → Nat
| [], y::ys => y
| [], ys => 0
| x1::x2::xs, ys => g xs ys
| x::xs, y::ys => g xs ys + y
| x::xs, [] => g xs []
theorem g_main_eq (xs ys : List Nat) : g xs ys = g.match_1 (fun _ _ => Nat) xs ys (fun y ys => y) (fun _ => 0) (fun _ _ xs ys => g xs ys) (fun _ xs y ys => g xs ys + y) (fun _ xs => g xs []) := by
split <;> (first | rfl | (conv => lhs; delta g; whnf; simp_match); try urfl)
#check @g_main_eq
def foo (xs : List Nat) : List Nat :=
match xs with
| [] => []
| x::xs =>
let y := 2 * x;
match xs with
| [] => []
| x::xs => (y + x) :: foo xs
theorem foo_main_eq (xs : List Nat) : foo xs = foo.match_1 (fun _ => List Nat) xs (fun _ => []) (fun x xs => let y := 2*x; foo.match_1 (fun _ => List Nat) xs (fun _ => []) (fun x xs => (y + x)::foo xs)) := by
split
· rfl
· split
· rfl
· rfl
#check @foo_main_eq