Skip to content

Commit eccfc09

Browse files
committed
wip
add lemmas used by HumanEval43 and HumanEval110 add required lemmas fix test cleanups improvements extract some changes into separate PR remove exists_mem_iff_... remove LeftIdentity instance parameter try marking sum_append and sum_reverse as simp/grind lemmas remove leftover annotations remove grind annotations on inequalities revert unrelated file revert more unrelated stuff
1 parent c7a9a4e commit eccfc09

File tree

18 files changed

+449
-34
lines changed

18 files changed

+449
-34
lines changed

src/Init/Data/Array.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ public import Init.Data.Array.Zip
3131
public import Init.Data.Array.InsertIdx
3232
public import Init.Data.Array.Extract
3333
public import Init.Data.Array.MinMax
34+
public import Init.Data.Array.Nat
35+
public import Init.Data.Array.Int

src/Init/Data/Array/Find.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module
77

88
prelude
99
public import Init.Data.List.Nat.Find
10+
import Init.Data.List.Nat.Sum
1011
import all Init.Data.Array.Basic
1112
public import Init.Data.Array.Range
1213

@@ -114,7 +115,7 @@ theorem getElem_zero_flatten.proof {xss : Array (Array α)} (h : 0 < xss.flatten
114115
simp only [List.findSome?_toArray, List.findSome?_map, Function.comp_def, List.getElem?_toArray,
115116
List.findSome?_isSome_iff, isSome_getElem?]
116117
simp only [flatten_toArray_map_toArray, List.size_toArray, List.length_flatten,
117-
Nat.sum_pos_iff_exists_pos, List.mem_map] at h
118+
List.sum_pos_iff_exists_pos_nat, List.mem_map] at h
118119
obtain ⟨_, ⟨xs, m, rfl⟩, h⟩ := h
119120
exact ⟨xs, m, by simpa using h⟩
120121

src/Init/Data/Array/Int.lean

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/-
2+
Copyright (c) 2026 Lean FRO, LLC. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kim Morrison, Sebastian Graf, Paul Reichert
5+
-/
6+
module
7+
8+
prelude
9+
public import Init.Data.List.Int.Sum
10+
public import Init.Data.Array.Lemmas
11+
public import Init.Data.Int.DivMod.Bootstrap
12+
import Init.Data.Int.DivMod.Lemmas
13+
import Init.Data.List.MinMax
14+
15+
public section
16+
17+
set_option linter.listVariables true -- Enforce naming conventions for `List`/`Array`/`Vector` variables.
18+
set_option linter.indexVariables true -- Enforce naming conventions for index variables.
19+
20+
namespace Array
21+
22+
@[simp] theorem sum_replicate_int {n : Nat} {a : Int} : (replicate n a).sum = n * a := by
23+
rw [← List.toArray_replicate, List.sum_toArray]
24+
simp
25+
26+
theorem sum_append_int {as₁ as₂ : Array Int} : (as₁ ++ as₂).sum = as₁.sum + as₂.sum := by
27+
simp [sum_append]
28+
29+
theorem sum_reverse_int (xs : Array Int) : xs.reverse.sum = xs.sum := by
30+
simp [sum_reverse]
31+
32+
theorem sum_eq_foldl_int {xs : Array Int} : xs.sum = xs.foldl (init := 0) (· + ·) := by
33+
simp only [foldl_eq_foldr_reverse, Int.add_comm, ← sum_eq_foldr, sum_reverse_int]
34+
35+
end Array

src/Init/Data/Array/Lemmas.lean

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2509,10 +2509,6 @@ theorem flatMap_replicate {f : α → Array β} : (replicate n a).flatMap f = (r
25092509
rw [← List.toArray_replicate, List.isEmpty_toArray]
25102510
simp
25112511

2512-
@[simp] theorem sum_replicate_nat {n : Nat} {a : Nat} : (replicate n a).sum = n * a := by
2513-
rw [← List.toArray_replicate, List.sum_toArray]
2514-
simp
2515-
25162512
/-! ### Preliminaries about `swap` needed for `reverse`. -/
25172513

25182514
@[grind =]
@@ -4298,19 +4294,31 @@ theorem getElem?_range {n : Nat} {i : Nat} : (Array.range n)[i]? = if i < n then
42984294
/-! ### sum -/
42994295

43004296
@[simp, grind =] theorem sum_empty [Add α] [Zero α] : (#[] : Array α).sum = 0 := rfl
4297+
theorem sum_eq_foldr [Add α] [Zero α] {xs : Array α} :
4298+
xs.sum = xs.foldr (init := 0) (· + ·) :=
4299+
rfl
43014300

43024301
-- Without further algebraic hypotheses, there's no useful `sum_push` lemma.
43034302

43044303
@[simp, grind =]
4305-
theorem sum_eq_sum_toList [Add α] [Zero α] {as : Array α} : as.toList.sum = as.sum := by
4304+
theorem sum_toList [Add α] [Zero α] {as : Array α} : as.toList.sum = as.sum := by
43064305
cases as
43074306
simp [Array.sum, List.sum]
43084307

4308+
@[deprecated sum_toList (since := "2026-01-14")]
4309+
def sum_eq_sum_toList := @sum_toList
4310+
4311+
@[simp, grind =]
4312+
theorem sum_append [Zero α] [Add α] [Std.Associative (α := α) (· + ·)]
4313+
[Std.LeftIdentity (α := α) (· + ·) 0] [Std.LawfulLeftIdentity (α := α) (· + ·) 0]
4314+
{as₁ as₂ : Array α} : (as₁ ++ as₂).sum = as₁.sum + as₂.sum := by
4315+
simp [← sum_toList, List.sum_append]
4316+
43094317
@[simp, grind =]
4310-
theorem sum_append_nat {as₁ as₂ : Array Nat} : (as₁ ++ as₂).sum = as₁.sum + as₂.sum := by
4311-
cases as₁
4312-
cases as₂
4313-
simp [List.sum_append_nat]
4318+
theorem sum_reverse [Zero α] [Add α] [Std.Associative (α := α) (· + ·)]
4319+
[Std.Commutative (α := α) (· + ·)]
4320+
[Std.LawfulLeftIdentity (α := α) (· + ·) 0] (xs : Array α) : xs.reverse.sum = xs.sum := by
4321+
simp [← sum_toList, List.sum_reverse]
43144322

43154323
theorem foldl_toList_eq_flatMap {l : List α} {acc : Array β}
43164324
{F : Array β → α → Array β} {G : α → List β}

src/Init/Data/Array/Nat.lean

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/-
2+
Copyright (c) 2026 Lean FRO, LLC. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kim Morrison, Sebastian Graf, Paul Reichert
5+
-/
6+
module
7+
8+
prelude
9+
public import Init.Data.Array.Lemmas
10+
import Init.Data.List.Nat.Sum
11+
12+
public section
13+
14+
set_option linter.listVariables true -- Enforce naming conventions for `List`/`Array`/`Vector` variables.
15+
set_option linter.indexVariables true -- Enforce naming conventions for index variables.
16+
17+
namespace Array
18+
19+
protected theorem sum_pos_iff_exists_pos_nat {xs : Array Nat} : 0 < xs.sum ↔ ∃ x ∈ xs, 0 < x := by
20+
simp [← sum_toList, List.sum_pos_iff_exists_pos_nat]
21+
22+
protected theorem sum_eq_zero_iff_forall_eq_nat {xs : Array Nat} :
23+
xs.sum = 0 ↔ ∀ x ∈ xs, x = 0 := by
24+
simp [← sum_toList, List.sum_eq_zero_iff_forall_eq_nat]
25+
26+
@[simp] theorem sum_replicate_nat {n : Nat} {a : Nat} : (replicate n a).sum = n * a := by
27+
rw [← List.toArray_replicate, List.sum_toArray]
28+
simp
29+
30+
theorem sum_append_nat {as₁ as₂ : Array Nat} : (as₁ ++ as₂).sum = as₁.sum + as₂.sum := by
31+
simp [sum_append]
32+
33+
theorem sum_reverse_nat (xs : Array Nat) : xs.reverse.sum = xs.sum := by
34+
simp [sum_reverse]
35+
36+
theorem sum_eq_foldl_nat {xs : Array Nat} : xs.sum = xs.foldl (init := 0) (· + ·) := by
37+
simp only [foldl_eq_foldr_reverse, Nat.add_comm, ← sum_eq_foldr, sum_reverse_nat]
38+
39+
end Array

src/Init/Data/List.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public import Init.Data.List.MinMaxIdx
2020
public import Init.Data.List.MinMaxOn
2121
public import Init.Data.List.Monadic
2222
public import Init.Data.List.Nat
23+
public import Init.Data.List.Int
2324
public import Init.Data.List.Notation
2425
public import Init.Data.List.Pairwise
2526
public import Init.Data.List.Sublist

src/Init/Data/List/Basic.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,7 @@ def sum {α} [Add α] [Zero α] : List α → α :=
20172017

20182018
@[simp, grind =] theorem sum_nil [Add α] [Zero α] : ([] : List α).sum = 0 := rfl
20192019
@[simp, grind =] theorem sum_cons [Add α] [Zero α] {a : α} {l : List α} : (a::l).sum = a + l.sum := rfl
2020+
theorem sum_eq_foldr [Add α] [Zero α] {l : List α} : l.sum = l.foldr (· + ·) 0 := rfl
20202021

20212022
/-! ### range -/
20222023

src/Init/Data/List/Int.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/-
2+
Copyright (c) 2026 Lean FRO. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Paul Reichert
5+
-/
6+
module
7+
8+
prelude
9+
public import Init.Data.List.Int.Sum

src/Init/Data/List/Int/Sum.lean

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/-
2+
Copyright (c) 2026 Lean FRO, LLC. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kim Morrison, Sebastian Graf, Paul Reichert
5+
-/
6+
module
7+
8+
prelude
9+
public import Init.Data.Int.DivMod.Bootstrap
10+
import Init.Data.Int.DivMod.Lemmas
11+
import Init.Data.List.MinMax
12+
13+
public section
14+
15+
set_option linter.listVariables true -- Enforce naming conventions for `List`/`Array`/`Vector` variables.
16+
set_option linter.indexVariables true -- Enforce naming conventions for index variables.
17+
18+
namespace List
19+
20+
@[simp]
21+
theorem sum_replicate_int {n : Nat} {a : Int} : (replicate n a).sum = n * a := by
22+
induction n <;> simp_all [replicate_succ, Int.add_mul, Int.add_comm]
23+
24+
theorem sum_append_int {l₁ l₂ : List Int} : (l₁ ++ l₂).sum = l₁.sum + l₂.sum := by
25+
simp [sum_append]
26+
27+
theorem sum_reverse_int (xs : List Int) : xs.reverse.sum = xs.sum := by
28+
simp [sum_reverse]
29+
30+
theorem min_mul_length_le_sum_int {xs : List Int} (h : xs ≠ []) :
31+
xs.min h * xs.length ≤ xs.sum := by
32+
induction xs
33+
· contradiction
34+
· rename_i x xs ih
35+
cases xs
36+
· simp_all [List.min_singleton]
37+
· simp only [ne_eq, reduceCtorEq, not_false_eq_true, min_eq_get_min?,
38+
List.min?_cons (α := Int), Option.get_some, length_cons, Int.natCast_add, Int.cast_ofNat_Int,
39+
forall_const] at ih ⊢
40+
rw [Int.mul_add, Int.mul_one, Int.add_comm]
41+
apply Int.add_le_add
42+
· apply Int.min_le_left
43+
· refine Int.le_trans ?_ ih
44+
rw [Int.mul_le_mul_right (by omega)]
45+
apply Int.min_le_right
46+
47+
theorem mul_length_le_sum_of_min?_eq_some_int {xs : List Int} (h : xs.min? = some x) :
48+
x * xs.length ≤ xs.sum := by
49+
cases xs
50+
· simp_all
51+
· simp only [min?_eq_some_min (cons_ne_nil _ _), Option.some.injEq] at h
52+
simpa [← h] using min_mul_length_le_sum_int _
53+
54+
theorem min_le_sum_div_length_int {xs : List Int} (h : xs ≠ []) :
55+
xs.min h ≤ xs.sum / xs.length := by
56+
have := min_mul_length_le_sum_int h
57+
rwa [Int.le_ediv_iff_mul_le]
58+
simp [List.length_pos_iff, h]
59+
60+
theorem le_sum_div_length_of_min?_eq_some_int {xs : List Int} (h : xs.min? = some x) :
61+
x ≤ xs.sum / xs.length := by
62+
cases xs
63+
· simp_all
64+
· simp only [min?_eq_some_min (cons_ne_nil _ _), Option.some.injEq] at h
65+
simpa [← h] using min_le_sum_div_length_int _
66+
67+
theorem sum_le_max_mul_length_int {xs : List Int} (h : xs ≠ []) :
68+
xs.sum ≤ xs.max h * xs.length := by
69+
induction xs
70+
· contradiction
71+
· rename_i x xs ih
72+
cases xs
73+
· simp_all [List.max_singleton]
74+
· simp only [ne_eq, reduceCtorEq, not_false_eq_true, max_eq_get_max?,
75+
List.max?_cons (α := Int), Option.get_some, length_cons, Int.natCast_add, Int.cast_ofNat_Int,
76+
forall_const] at ih ⊢
77+
rw [Int.mul_add, Int.mul_one, Int.add_comm]
78+
apply Int.add_le_add
79+
· apply Int.le_max_left
80+
· refine Int.le_trans ih ?_
81+
rw [Int.mul_le_mul_right (by omega)]
82+
apply Int.le_max_right
83+
84+
theorem sum_le_max_mul_length_of_max?_eq_some_int {xs : List Int} (h : xs.max? = some x) :
85+
xs.sum ≤ x * xs.length := by
86+
cases xs
87+
· simp_all
88+
· simp only [max?_eq_some_max (cons_ne_nil _ _), Option.some.injEq] at h
89+
simpa [← h] using sum_le_max_mul_length_int _
90+
91+
theorem sum_div_length_le_max_int {xs : List Int} (h : xs ≠ []) :
92+
xs.sum / xs.length ≤ xs.max h := by
93+
have := sum_le_max_mul_length_int h
94+
rw [Int.ediv_le_iff_le_mul]
95+
· refine Int.lt_of_le_of_lt this ?_
96+
apply Int.lt_add_of_pos_right
97+
simp [← Nat.ne_zero_iff_zero_lt, h]
98+
· simp [List.length_pos_iff, h]
99+
100+
theorem sum_div_length_le_max_of_max?_eq_some_int {xs : List Int} (h : xs.max? = some x) :
101+
xs.sum / xs.length ≤ x := by
102+
cases xs
103+
· simp_all
104+
· simp only [max?_eq_some_max (cons_ne_nil _ _), Option.some.injEq] at h
105+
simpa [← h] using sum_div_length_le_max_int _
106+
107+
end List

src/Init/Data/List/Lemmas.lean

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1830,12 +1830,17 @@ theorem append_eq_map_iff {f : α → β} :
18301830
rw [eq_comm, map_eq_append_iff]
18311831

18321832
@[simp, grind =]
1833-
theorem sum_append_nat {l₁ l₂ : List Nat} : (l₁ ++ l₂).sum = l₁.sum + l₂.sum := by
1834-
induction l₁ generalizing l₂ <;> simp_all [Nat.add_assoc]
1833+
theorem sum_append [Add α] [Zero α] [Std.LawfulLeftIdentity (α := α) (· + ·) 0]
1834+
[Std.Associative (α := α) (· + ·)] {l₁ l₂ : List α} : (l₁ ++ l₂).sum = l₁.sum + l₂.sum := by
1835+
induction l₁ generalizing l₂ <;> simp_all [Std.Associative.assoc, Std.LawfulLeftIdentity.left_id]
18351836

18361837
@[simp, grind =]
1837-
theorem sum_reverse_nat (xs : List Nat) : xs.reverse.sum = xs.sum := by
1838-
induction xs <;> simp_all [Nat.add_comm]
1838+
theorem sum_reverse [Zero α] [Add α] [Std.Associative (α := α) (· + ·)]
1839+
[Std.Commutative (α := α) (· + ·)]
1840+
[Std.LawfulLeftIdentity (α := α) (· + ·) 0] (xs : List α) : xs.reverse.sum = xs.sum := by
1841+
induction xs <;>
1842+
simp_all [sum_append, Std.Commutative.comm (α := α) _ 0,
1843+
Std.LawfulLeftIdentity.left_id, Std.Commutative.comm]
18391844

18401845
/-! ### concat
18411846
@@ -2366,9 +2371,6 @@ theorem replicateRecOn {α : Type _} {p : List α → Prop} (l : List α)
23662371
exact hi _ _ _ _ h hn (replicateRecOn (b :: l') h0 hr hi)
23672372
termination_by l.length
23682373

2369-
@[simp] theorem sum_replicate_nat {n : Nat} {a : Nat} : (replicate n a).sum = n * a := by
2370-
induction n <;> simp_all [replicate_succ, Nat.add_mul, Nat.add_comm]
2371-
23722374
/-! ### reverse -/
23732375

23742376
@[simp, grind =] theorem length_reverse {as : List α} : (as.reverse).length = as.length := by

0 commit comments

Comments
 (0)