Zulip Chat Archive

Stream: new members

Topic: iteration, ranges, and Fin n


JJ (Aug 29 2024 at 02:35):

i am attempting to iterate through and mutate a fixed-size array. i am encountering some issues, however. the following code fails to compile with failed to synthesize: Decidable (prev = pixel). i don't quite understand what this means, though. does anyone have any tips on what could be causing this?

import Batteries
open Batteries

abbrev UInt6 := BitVec 6
abbrev Byte := UInt8

structure Pixel where
  (r g b a : Byte)

def index? (seen : Vector Pixel 64) (pixel : Pixel) : Option UInt6 := do
  for i in [0:64] do
    -- failed to synthesize: Inhabited Pixel
    if seen[i]! = pixel then
      return i
  failure

also, the []! probably shouldn't be necessary, given that [0:64] is exclusive on the 64 and Vector has a fixed size 64. it appears to be though. what is the cause of this?

my guess would be that Range is not appropriately treating its elements as Fin n, but i am not quite sure. i have also tried to manually apply the Membership.mem.upper theorem, but it does not appear to prove what i was hoping it to. (i have yet to learn the theorem proving parts of lean, though.)

Daniel Weber (Aug 29 2024 at 02:38):

What is the definition of Pixel?

JJ (Aug 29 2024 at 02:40):

whoops, sorry, updated

Alexander Hilbert (Aug 29 2024 at 03:12):

There is a def finRange (n : ℕ) : List (Fin n) in Mathlib.Data.List.Range.
Maybe you can use that to get rid of []!.

Daniel Weber (Aug 29 2024 at 04:06):

You should derive BEq and DecidableEq for Pixel

JJ (Aug 29 2024 at 04:19):

thanks, that was it!

JJ (Aug 29 2024 at 04:21):

the []! thing still confuses me a bit. i did play around some, and found [] works fine for a Fin 64 (which makes sense). so, i guess lean's iterators on ranges are not treating their elements as being Fin n, despite them being evidently so?

JJ (Aug 29 2024 at 04:30):

re: derivations, i also had to derive Inhabited. that's a cool little tidbit for why it's needed on the documentation page. docs#Inhabited


Last updated: May 02 2025 at 03:31 UTC