Skip to content

Commit d90b44b

Browse files
committed
Start
1 parent 484fa13 commit d90b44b

File tree

1 file changed

+98
-3
lines changed

1 file changed

+98
-3
lines changed

HumanEvalLean/HumanEval96.lean

Lines changed: 98 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,100 @@
1-
def count_up_to : Unit :=
2-
()
1+
import Std.Data.HashSet
2+
import HumanEvalLean.ProvedElsewhere
3+
4+
set_option grind.warning false
5+
6+
def Nat.Prime (p : Nat) : Prop := 2 ≤ p ∧ ∀ (m : Nat), m < p → 2 ≤ m → ¬ m ∣ p
7+
8+
def Nat.relativePrime (p n : Nat) : Prop := 2 ≤ p ∧ ∀ (m : Nat), m < p → m < n → 2 ≤ m → ¬ m ∣ p
9+
10+
theorem Nat.relativePrimeTo2 (p : Nat) (hp : 2 ≤ p) : Nat.relativePrime p 2 := by
11+
simp [Nat.relativePrime, hp]
12+
grind
13+
14+
theorem Nat.relativePrime_succ (p n : Nat) (hn₁ : 2 ≤ n) :
15+
Nat.relativePrime p n ∧ p % n ≠ 0 ↔ Nat.relativePrime p (n + 1) := by
16+
simp [relativePrime]
17+
constructor
18+
· intro h
19+
rcases h with ⟨h₁, h₃⟩
20+
rcases h₁ with ⟨h₁, h₂⟩
21+
apply And.intro h₁
22+
intro m hmp hmn h2m
23+
have : m < n ∨ m = n := by grind
24+
cases this with
25+
| inl h' =>
26+
apply h₂ m hmp h' h2m
27+
| inr h' =>
28+
simp [h', Nat.dvd_iff_mod_eq_zero, h₃]
29+
· intro h
30+
rcases h with ⟨h₁, h₂⟩
31+
constructor
32+
· apply And.intro h₁
33+
intro m hmp hmn h2m
34+
apply h₂ m hmp (by omega) h2m
35+
· rw [← Nat.dvd_iff_mod_eq_zero]
36+
sorry
37+
38+
def fillSieve (n : Nat) : Std.HashSet Nat := Std.HashSet.ofList (List.range' 2 (n-2))
39+
40+
theorem mem_fillSieve {n m : Nat} : m ∈ fillSieve n ↔ m ≥ 2 ∧ m < n := by
41+
simp only [fillSieve, Std.HashSet.mem_ofList, List.contains_eq_mem, List.mem_range'_1,
42+
Bool.decide_and, Bool.and_eq_true, decide_eq_true_eq, ge_iff_le, and_congr_right_iff]
43+
omega
44+
45+
def eratosthenes_sieve (n : Nat) : List Nat :=
46+
if n < 2
47+
then []
48+
else
49+
let sieve := fillSieve n
50+
(eratosthenes_sieve.go n sieve 2).toList.mergeSort
51+
where
52+
go (n : Nat) (sieve : Std.HashSet Nat) (curr : Nat) :=
53+
if curr < n
54+
then
55+
if curr ∈ sieve
56+
then eratosthenes_sieve.go n (sieve.filter (fun x => (x ≤ curr ∨ x % curr != 0))) (curr + 1)
57+
else eratosthenes_sieve.go n sieve (curr + 1)
58+
else
59+
sieve
60+
61+
theorem mem_eratosthenes_sieve_iff_prime_and_less_than (n m : Nat) :
62+
m ∈ eratosthenes_sieve n ↔ m.Prime ∧ m < n := by
63+
simp only [eratosthenes_sieve]
64+
split
65+
· admit
66+
· simp only [List.mem_mergeSort, Std.HashSet.mem_toList]
67+
suffices ∀ (n curr : Nat) (sieve : Std.HashSet Nat), (∀ (k : Nat), 2 ≤ k → (k ∈ sieve ↔ Nat.relativePrime k curr ∧ k < n)) → curr ≤ n →
68+
(m ∈ eratosthenes_sieve.go n sieve curr ↔ m.Prime ∧ m < n) by
69+
apply this n 2 (fillSieve n)
70+
· intro k hk
71+
simp [mem_fillSieve, Nat.relativePrimeTo2, hk]
72+
· omega
73+
intro n curr sieve h₁ h₂
74+
fun_induction eratosthenes_sieve.go with
75+
| case1 sieve curr h₄ h₅ ih =>
76+
unfold eratosthenes_sieve.go
77+
sorry
78+
| case2 sieve curr h₄ h₅ ih =>
79+
sorry
80+
| case3 sieve curr h =>
81+
unfold eratosthenes_sieve.go
82+
simp [h]
83+
sorry
84+
85+
theorem testCase1 : eratosthenes_sieve 5 = [2, 3] := by native_decide
86+
theorem testCase2 : eratosthenes_sieve 6 = [2, 3, 5] := by native_decide
87+
theorem testCase3 : eratosthenes_sieve 7 = [2, 3, 5] := by native_decide
88+
theorem testCase4 : eratosthenes_sieve 10 = [2, 3, 5, 7] := by native_decide
89+
theorem testCase5 : eratosthenes_sieve 0 = [] := by native_decide
90+
theorem testCase6 : eratosthenes_sieve 22 = [2, 3, 5, 7, 11, 13, 17, 19] := by native_decide
91+
theorem testCase7 : eratosthenes_sieve 1 = [] := by native_decide
92+
theorem testCase8 : eratosthenes_sieve 18 = [2, 3, 5, 7, 11, 13, 17] := by native_decide
93+
theorem testCase9 : eratosthenes_sieve 47 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43] := by
94+
native_decide
95+
theorem testCase10 : eratosthenes_sieve 101 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,
96+
47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] := by
97+
native_decide
398

499
/-!
5100
## Prompt
@@ -52,4 +147,4 @@ def check(candidate):
52147
assert candidate(101) == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
53148
54149
```
55-
-/
150+
-/

0 commit comments

Comments
 (0)