Zulip Chat Archive
Stream: new members
Topic: about the sigma type mismatch
Isaac Li (Mar 07 2025 at 05:46):
Probably a dumb question:
-- current i, prime list primes, sieve f
-- linear sieve from i to n
def linearSieveAux (n i : Nat) (ps : List Nat) (f : Nat → Nat)
(hi : 2 ≤ i) (hiub : i ≤ n + 1)
(hps : list_sorted ps)
(hinps₁ : ∀ x ∈ ps, x < i) (hinps₂ : ∀ x ∈ ps, 2 ≤ x) :
(Nat → Nat) × { l : List Nat // (list_sorted l) ∧ (∀ x, x ∈ l → 2 ≤ x ∧ x ≤ n) } :=
if heq : i = n + 1 then
have hinps' : ∀ x, x ∈ ps → 2 ≤ x ∧ x ≤ n := by
intros x hx
constructor
· exact hinps₂ x hx
· have h : x ≤ i - 1 := by
apply Nat.lt_succ_iff.mp
aesop
rw [heq] at h
exact h
(f, ⟨ps, hps, hinps'⟩) -- end of recursion
--rest of the code
I defined this funcition and it returns (f, ⟨ps, hps, hinps'⟩), everything is just fine.
but when I want to record the output of linearSieveAux, something went wrong:
lemma linearSieveAux_preserves {n : Nat} {f : Nat → Nat} {ps : List Nat}
(hn : 2 ≤ n) (hi : 2 ≤ i) (hiub : i ≤ n + 1) (hge: ∀ prime ∈ ps, 2 ≤ prime)
(hps: list_sorted ps) (hinps₁ : ∀ x ∈ ps, x < i) (hinps₂ : ∀ x ∈ ps, 2 ≤ x)
/-
application type mismatch
⟨hps', hinps'⟩
argument
hinps'
has type
?m.454529 : Sort ?u.454528
but is expected to have type
∀ x ∈ ps', 2 ≤ x ∧ x ≤ n : Prop
-/
(hpre : linearSieveAux n i ps f hi hiub hps hinps₁ hinps₂ = (f', ⟨ps', hps', hinps'⟩)) :
linearSieveAux (n + 1) i ps f hi (by linarith) hps hinps₁ hinps₂ =
linearSieveAux (n + 1) (n + 1) ps' f' (by linarith) (by linarith) hps' (sorry) (sorry):= by
sorry
I know I should attach a mwe but I havent quite figure out how to minimize my work, so I just upload my full file. I am a beginner and i am truely sorry for that :smiling_face_with_tear:
linear sieve.lean
Kyle Miller (Mar 07 2025 at 05:55):
My best guess is that hinps'
is not defined
Isaac Li (Mar 07 2025 at 06:43):
But how should I define it here? I want to use it to simplify the goal statement, or else the lemma will be a mess like this:
-- linearSieveAux preserves states
lemma linearSieveAux_preserves {n : Nat} {f : Nat → Nat} {ps : List Nat}
(hn : 2 ≤ n) (hi : 2 ≤ i) (hiub : i ≤ n + 1) (hge: ∀ prime ∈ ps, 2 ≤ prime)
(hps: list_sorted ps) (hinps₁ : ∀ x ∈ ps, x < i) (hinps₂ : ∀ x ∈ ps, 2 ≤ x):
linearSieveAux (n + 1) i ps f hi (by linarith) hps hinps₁ hinps₂ =
linearSieveAux (n + 1) (n + 1) (linearSieveAux n i ps f hi hiub hps hinps₁ hinps₂).2.1 (linearSieveAux n i ps f hi hiub hps hinps₁ hinps₂).1
(by linarith) (by linarith) (linearSieveAux n i ps f hi hiub hps hinps₁ hinps₂).2.2.left (fun x hx => Nat.lt_of_le_of_lt (((linearSieveAux n i ps f hi hiub hps hinps₁ hinps₂).2.2.right) x hx).right (Nat.lt_succ_self n))
(fun x hx => (((linearSieveAux n i ps f hi hiub hps hinps₁ hinps₂).2.2.right) x hx).left)
:= by
sorry
Kyle Miller (Mar 07 2025 at 07:12):
I would add an argument like (hinps' : ∀ x ∈ ps', 2 ≤ x ∧ x ≤ n)
Last updated: May 02 2025 at 03:31 UTC