@@ -6,52 +6,51 @@ def Nat.factorial : Nat → Nat
66notation :10000 n "!" => Nat.factorial n
77
88def Nat.brazilianFactorial : Nat → Nat
9- | .zero => 1
10- | .succ n => (Nat.succ n)! * brazilianFactorial n
9+ | .zero => 1
10+ | .succ n => (Nat.succ n)! * brazilianFactorial n
1111
1212def special_factorial (n : Nat) : Nat :=
13- special_factorial.go n 1 1 0
14- where
15-
16- go (n fact brazilFact curr : Nat) : Nat :=
17- if _h: curr >= n
18- then brazilFact
19- else
20- let fact' := (curr + 1 ) * fact
21- let brazilFact' := brazilFact * fact'
22- special_factorial.go n fact' brazilFact' (Nat.succ curr)
23- termination_by n - curr
13+ special_factorial.go n 1 1 0
14+ where
15+
16+ go (n fact brazilFact curr : Nat) : Nat :=
17+ if _h: curr >= n
18+ then brazilFact
19+ else
20+ let fact' := (curr + 1 ) * fact
21+ let brazilFact' := brazilFact * fact'
22+ special_factorial.go n fact' brazilFact' (Nat.succ curr)
23+ termination_by n - curr
2424
2525theorem special_factorial_func_correct {n : Nat} :
26- special_factorial n = n.brazilianFactorial := by
27- simp [special_factorial]
28- suffices ∀ (curr fact brazilFact : Nat), fact = curr ! → brazilFact = curr.brazilianFactorial →
29- curr ≤ n → special_factorial.go n fact brazilFact curr = n.brazilianFactorial by
30- apply this
31- · simp [Nat.factorial]
32- · simp [Nat.brazilianFactorial]
33- · 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
44- 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- · -- omega does not work
53- rw [Nat.mul_comm, Nat.mul_assoc]
54- · omega
26+ special_factorial n = n.brazilianFactorial := by
27+ simp [special_factorial]
28+ suffices ∀ (curr fact brazilFact : Nat), fact = curr ! → brazilFact = curr.brazilianFactorial →
29+ curr ≤ n → special_factorial.go n fact brazilFact curr = n.brazilianFactorial by
30+ apply this
31+ · simp [Nat.factorial]
32+ · simp [Nat.brazilianFactorial]
33+ · 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
44+ 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
5554
5655theorem test1 : special_factorial 4 = 288 := by native_decide
5756theorem test2 : special_factorial 5 = 34560 := by native_decide
0 commit comments