Skip to content

Commit 89bdc29

Browse files
committed
Rewrite proof with fun_induction
1 parent 95449ea commit 89bdc29

File tree

2 files changed

+114
-25
lines changed

2 files changed

+114
-25
lines changed

HumanEvalLean/HumanEval139.lean

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,31 @@ def Nat.factorial : Nat → Nat
55

66
notation:10000 n "!" => Nat.factorial n
77

8+
@[simp] theorem Nat.factorial_zero : 0! = 1 :=
9+
rfl
10+
11+
theorem Nat.factorial_succ (n : Nat) : (n + 1)! = (n + 1) * n ! :=
12+
rfl
13+
814
def Nat.brazilianFactorial : Nat → Nat
915
| .zero => 1
1016
| .succ n => (Nat.succ n)! * brazilianFactorial n
1117

18+
@[simp] theorem Nat.brazilianFactorial_zero : brazilianFactorial 0 = 1 :=
19+
rfl
20+
21+
theorem Nat.brazilianFactorial_succ (n : Nat) : brazilianFactorial (n + 1) = (n + 1)! * (brazilianFactorial n) :=
22+
rfl
23+
1224
def special_factorial (n : Nat) : Nat :=
1325
special_factorial.go n 1 1 0
14-
where
15-
26+
where
1627
go (n fact brazilFact curr : Nat) : Nat :=
1728
if _h: curr >= n
1829
then brazilFact
1930
else
2031
let fact' := (curr + 1) * fact
21-
let brazilFact' := brazilFact * fact'
32+
let brazilFact' := fact' * brazilFact
2233
special_factorial.go n fact' brazilFact' (Nat.succ curr)
2334
termination_by n - curr
2435

@@ -31,26 +42,21 @@ theorem special_factorial_func_correct {n : Nat} :
3142
· simp [Nat.factorial]
3243
· simp [Nat.brazilianFactorial]
3344
· simp
34-
intro curr
35-
induction h: n - curr generalizing curr with
36-
| zero =>
37-
intro _ brazil _ hbrazil hcurr
38-
rw [Nat.sub_eq_zero_iff_le] at h
39-
have : n = curr := by omega
40-
simp [special_factorial.go, h, this, hbrazil]
41-
| succ m ih =>
42-
intro fact brazilFact hfact hbrazil hcurr
43-
have : ¬ curr ≥ n := by omega
45+
intro curr fact brazil_fact h₁ h₂ h₃
46+
fun_induction special_factorial.go with
47+
| case1 fact brazil_fact curr h =>
48+
rw [h₂]
49+
unfold special_factorial.go
50+
simp [h]
51+
have : curr = n := by omega
52+
rw [this]
53+
| case2 fact brazilFact curr h fact' brazilFact' ih =>
54+
simp only [ge_iff_le, Nat.not_le] at h
55+
simp only [h₁, Nat.succ_eq_add_one, Nat.factorial_succ, h₂, Nat.brazilianFactorial_succ,
56+
Nat.succ_le_of_lt h, forall_const, fact', brazilFact'] at ih
57+
have : ¬ curr >= n := by omega
4458
unfold special_factorial.go
45-
simp only [ge_iff_le, this, ↓reduceDIte, Nat.succ_eq_add_one]
46-
have : n - (curr + 1) = m := by omega
47-
specialize ih (curr + 1) this ((curr + 1) * fact) (brazilFact * ((curr + 1) * fact))
48-
simp only [hfact, Nat.factorial, Nat.succ_eq_add_one, hbrazil, Nat.brazilianFactorial,
49-
forall_const] at ih
50-
simp only [hfact, hbrazil]
51-
apply ih
52-
· ac_rfl
53-
· omega
59+
simp [this, h₁, h₂, ih]
5460

5561
theorem test1 : special_factorial 4 = 288 := by native_decide
5662
theorem test2 : special_factorial 5 = 34560 := by native_decide

HumanEvalLean/HumanEval63.lean

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,88 @@
1-
def fibfib : Unit :=
2-
()
1+
def fibfib (n : Nat): Nat :=
2+
match n with
3+
| 0 => 0
4+
| 1 => 0
5+
| 2 => 1
6+
| (n+3) => fibfib (n+2) + fibfib (n+1) + fibfib n
7+
8+
theorem fibfib_of_three_le {n : Nat} (hn : 3 ≤ n) :
9+
fibfib n = fibfib (n - 1) + fibfib (n -2) + fibfib (n - 3) := by
10+
conv =>
11+
lhs
12+
unfold fibfib
13+
cases n with
14+
| zero => simp at hn
15+
| succ m =>
16+
cases m with
17+
| zero => simp at hn
18+
| succ n =>
19+
cases n with
20+
| zero => simp at hn
21+
| succ m =>
22+
simp
23+
24+
def computeFibfib (n : Nat) : Nat :=
25+
match n with
26+
| 0 => 0
27+
| 1 => 0
28+
| 2 => 1
29+
| (m + 3) => go (m + 3) 1 0 0 3 where
30+
31+
go (m prev1 prev2 prev3 curr : Nat) : Nat :=
32+
if curr ≥ m
33+
then prev1 + prev2 + prev3
34+
else go m (prev1 + prev2 + prev3) prev1 prev2 (curr + 1)
35+
termination_by m - curr
36+
37+
theorem testCase1 : computeFibfib 2 = 1 := by native_decide
38+
theorem testCase2 : computeFibfib 1 = 0 := by native_decide
39+
theorem testCase3 : computeFibfib 5 = 4 := by native_decide
40+
theorem testCase4 : computeFibfib 8 = 24 := by native_decide
41+
theorem testCase5 : computeFibfib 10 = 81 := by native_decide
42+
theorem testCase6 : computeFibfib 12 = 274 := by native_decide
43+
theorem testCase7 : computeFibfib 14 = 927 := by native_decide
44+
45+
theorem computeFibfib_correct (n : Nat) : computeFibfib n = fibfib n := by
46+
unfold computeFibfib
47+
unfold fibfib
48+
cases n with
49+
| zero => simp[fibfib]
50+
| succ m =>
51+
cases m with
52+
| zero => simp[fibfib]
53+
| succ n =>
54+
cases n with
55+
| zero => simp[fibfib]
56+
| succ m =>
57+
simp only
58+
suffices ∀ (m curr prev1 prev2 prev3 : Nat), 3 ≤ curr → curr ≤ m → prev1 = fibfib (curr - 1) →
59+
prev2 = fibfib (curr - 2) → prev3 = fibfib (curr - 3) →
60+
computeFibfib.go m prev1 prev2 prev3 curr = fibfib (m - 1) + fibfib (m - 2) + fibfib (m-3) by
61+
apply this
62+
· omega
63+
· omega
64+
· simp [fibfib]
65+
· simp [fibfib]
66+
· simp [fibfib]
67+
intro m curr
68+
induction h : m - curr generalizing curr with
69+
| zero =>
70+
simp [Nat.sub_eq_zero_iff_le] at h
71+
intro prev1 prev2 prev3 hcurr1 hcurr2 hprev1 hprev2 hprev3
72+
have : curr = m := by omega
73+
simp [computeFibfib.go, this, hprev1, hprev2, hprev3]
74+
| succ n ih =>
75+
intro prev1 prev2 prev3 hcurr1 hcurr2 hprev1 hprev2 hprev3
76+
unfold computeFibfib.go
77+
have : ¬ curr ≥ m := by omega
78+
simp only [ge_iff_le, this, ↓reduceIte]
79+
apply ih
80+
· omega
81+
· omega
82+
· omega
83+
· simp [fibfib_of_three_le, hcurr1, hprev1, hprev2, hprev3]
84+
· simp [hprev1]
85+
· simp [hprev2]
386

487
/-!
588
## Prompt
@@ -53,4 +136,4 @@ def check(candidate):
53136
assert candidate(14) == 927
54137
55138
```
56-
-/
139+
-/

0 commit comments

Comments
 (0)