@@ -19,33 +19,35 @@ if n - s*s < s then (n - s*s, s) else (s, n - s*s - s)
19
19
20
20
theorem mkpair_unpair (n : nat) : mkpair (unpair n).1 (unpair n).2 = n :=
21
21
let s := sqrt n in begin
22
- simp [unpair], change sqrt n with s,
22
+ dsimp [unpair], change sqrt n with s,
23
+ have sm : s * s + (n - s * s) = n := nat.add_sub_cancel' (sqrt_le _),
23
24
by_cases n - s * s < s with h; simp [h, mkpair],
24
- { exact nat.add_sub_cancel' (sqrt_le _) },
25
- simp at h,
26
- suffices : n - s*s - s ≤ s,
27
- { simp [not_lt_of_ge this ],
28
- rw [add_left_comm, nat.add_sub_cancel' h, nat.add_sub_cancel' (sqrt_le _)] },
29
- apply nat.sub_le_left_of_le_add, apply nat.sub_le_left_of_le_add,
30
- rw ← add_assoc, apply sqrt_le_add
25
+ { exact sm },
26
+ { have hl : n - s*s - s ≤ s :=
27
+ nat.sub_le_left_of_le_add (nat.sub_le_left_of_le_add $
28
+ by rw ← add_assoc; apply sqrt_le_add),
29
+ suffices : s * s + (s + (n - s * s - s)) = n, {simpf [not_lt_of_ge hl]},
30
+ rwa [nat.add_sub_cancel' (le_of_not_gt h)] }
31
31
end
32
32
33
33
theorem unpair_mkpair (a b : nat) : unpair (mkpair a b) = (a, b) :=
34
34
begin
35
35
by_cases a < b; simp [h, mkpair],
36
- { have be : sqrt (a + b * b) = b,
36
+ { show unpair (a + b * b) = (a, b),
37
+ have be : sqrt (a + b * b) = b,
37
38
{ rw [add_comm, sqrt_add_eq],
38
39
exact le_trans (le_of_lt h) (le_add_left _ _) },
39
40
simp [unpair, be, nat.add_sub_cancel, h] },
40
- { simp at h ,
41
+ { show unpair (a + (b + a * a)) = (a, b) ,
41
42
have ae : sqrt (a + (b + a * a)) = a,
42
43
{ rw [← add_assoc, add_comm, sqrt_add_eq],
43
- exact add_le_add_left h _ },
44
+ exact add_le_add_left (le_of_not_gt h) _ },
44
45
have : a ≤ a + (b + a * a) - a * a,
45
46
{ rw nat.add_sub_assoc (nat.le_add_left _ _), apply nat.le_add_right },
46
47
simp [unpair, ae, not_lt_of_ge this ],
47
- rw [nat.add_sub_assoc, nat.add_sub_cancel, nat.add_sub_cancel_left],
48
- apply nat.le_add_left }
48
+ show a + (b + a * a) - a * a - a = b,
49
+ rw [nat.add_sub_assoc (nat.le_add_left _ _),
50
+ nat.add_sub_cancel, nat.add_sub_cancel_left] }
49
51
end
50
52
51
53
theorem unpair_lt_aux {n : nat} (n1 : n ≥ 1 ) : (unpair n).1 < n :=
@@ -58,7 +60,8 @@ let s := sqrt n in begin
58
60
exact lt_of_le_of_lt h (nat.sub_lt_self n1 (mul_pos s0 s0)) }
59
61
end
60
62
61
- theorem unpair_lt (n : nat) : (unpair n).1 ≤ n :=
62
- by cases n; [exact dec_trivial, apply le_of_lt (unpair_lt_aux (nat.succ_pos _))]
63
+ theorem unpair_lt : ∀ (n : nat), (unpair n).1 ≤ n
64
+ | 0 := dec_trivial
65
+ | (n+1 ) := le_of_lt (unpair_lt_aux (nat.succ_pos _))
63
66
64
67
end nat
0 commit comments