@@ -5,20 +5,31 @@ def Nat.factorial : Nat → Nat
55
66notation :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+
814def 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+
1224def 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
5561theorem test1 : special_factorial 4 = 288 := by native_decide
5662theorem test2 : special_factorial 5 = 34560 := by native_decide
0 commit comments