Zulip Chat Archive
Stream: new members
Topic: Merge condense lists into lists of ranges
Iocta (Feb 21 2025 at 20:38):
Why does by decide fail here?
import Mathlib
open List
set_option diagnostics true
structure Range where
first : Int
last : Int
deriving Repr
def mergeListsOfDisjointRanges (xs ys : List Range) : List Range :=
match xs, ys with
| [], ys => ys
| xs, [] => xs
| (x'::xs'), (y'::ys') =>
let lastx := xs'.getLastD x'
if lastx.last + 1 = y'.first
then xs.dropLast ++ [⟨lastx.first, y'.last⟩] ++ ys'
else xs ++ ys
def XS : List Int := [1, 2, 3, 4, 6, 8, 9, 10, 15]
def condense : List Int → List Range :=
foldl mergeListsOfDisjointRanges [] ∘ map (fun x => [Range.mk x x])
example : condense XS = [⟨1,4⟩, ⟨6,6⟩, ⟨8,10⟩, ⟨15,15⟩] := by decide
/-
failed to synthesize
Decidable
(condense XS =
[{ first := 1, last := 4 }, { first := 6, last := 6 }, { first := 8, last := 10 }, { first := 15, last := 15 }]) -/
Edward van de Meent (Feb 21 2025 at 20:44):
you likely need DecidableEq Range
Edward van de Meent (Feb 21 2025 at 20:44):
yup, playground confirms
Edward van de Meent (Feb 21 2025 at 20:44):
a simple deriving DecidableEq fixes it
Edward van de Meent (Feb 21 2025 at 20:46):
(to be more verbose about how i got there: lean complains it doesn't know Decidable (condense XS = bla), where condense XS has type List Range. Deciding if two lists are equal is done elementwise, so you (likely) need DecidableEq Range. there is "likely" because deciding equality can happen in other ways)
Last updated: May 02 2025 at 03:31 UTC