84 lines
1.6 KiB
Text
84 lines
1.6 KiB
Text
def f : nat → nat
|
||
| 0 := 10
|
||
| (n+1) := 20 + n
|
||
|
||
open list tactic
|
||
|
||
meta def check_expr (p : pexpr) (t : expr) : tactic unit :=
|
||
do e ← to_expr p, guard (t = e)
|
||
|
||
meta def check_target (p : pexpr) : tactic unit :=
|
||
do t ← target, check_expr p t
|
||
|
||
local attribute [-simp] map head
|
||
|
||
example (a b c : nat) : head (map f [1, 2, 3]) = 20 :=
|
||
begin
|
||
dsimp [map],
|
||
check_target `(head [f 1, f 2, f 3] = 20),
|
||
dsimp [f],
|
||
check_target `(head [20 + 0, 20 + 1, 20 + 2] = 20),
|
||
dsimp [head],
|
||
check_target `(20 + 0 = 20),
|
||
reflexivity
|
||
end
|
||
|
||
example (a b c : nat) : head (map f [1, 2, 3]) = 20 :=
|
||
begin
|
||
dsimp [map, f, head],
|
||
check_target `(20 + 0 = 20),
|
||
reflexivity
|
||
end
|
||
|
||
@[simp] lemma succ_zero_eq_one : nat.succ 0 = 1 :=
|
||
rfl
|
||
|
||
def g : nat × nat → nat
|
||
| (a, b) := a + b
|
||
|
||
lemma gax (x y) : g (x, y) = x + y :=
|
||
rfl
|
||
|
||
attribute [simp] gax
|
||
|
||
example (a b c : nat) : g (f 1, f 2) = 41 :=
|
||
begin
|
||
dsimp,
|
||
check_target `(f 1 + f 2 = 41),
|
||
dsimp [f],
|
||
reflexivity
|
||
end
|
||
|
||
example (a b c : nat) : g (f 1, f 2) = 41 :=
|
||
begin
|
||
dsimp [f],
|
||
check_target `(20 + 0 + (20 + 1) = 41),
|
||
reflexivity
|
||
end
|
||
|
||
example (a b c : nat) : g (f 1, f 2) = 41 :=
|
||
begin
|
||
dsimp [f] without gax,
|
||
check_target `(g (20 + 0, 20 + 1) = 41),
|
||
dsimp [g],
|
||
check_target `(20 + 0 + (20 + 1) = 41),
|
||
reflexivity
|
||
end
|
||
|
||
local attribute [-simp] gax
|
||
|
||
example (a b c : nat) : g (f 1, f 2) = 41 :=
|
||
begin
|
||
dsimp [f],
|
||
check_target `(g (20 + 0, 20 + 1) = 41),
|
||
dsimp [gax],
|
||
check_target `(20 + 0 + (20 + 1) = 41),
|
||
reflexivity
|
||
end
|
||
|
||
example (a b c : nat) : g (f 1, f 2) = 41 :=
|
||
begin
|
||
dsimp [f, gax],
|
||
check_target `(20 + 0 + (20 + 1) = 41),
|
||
reflexivity
|
||
end
|