Zulip Chat Archive

Stream: lean4

Topic: Arithmetic sequence


Scott N. Walck (Mar 19 2024 at 19:22):

Hi Folks,

I'm trying to write a function in Lean that produces an
arithmetic sequence, much like [a, a+dx .. b] in Haskell. Here a
is the initial element, dx is the step, and b is the maximum
element, or something close to it.

As the code below shows, I can do this with rational numbers and
with Floats. The code is essentially identical. I use a gas
tank to satisfy the termination checker. I believe I should be
able to do this with any number system that admits decidable
ordering.

But, as the final code segment shows, I do not know how to tell
Lean that "greater than" is decidable.

I'd appreciate any help.

Thanks,
Scott

import Lean.Data.Rat
open Lean

def arithSeqRatHelper (gastank : Nat) (dx : Rat) (b : Rat) (xs : List Rat) : List Rat :=
  match gastank with
  | 0          => xs
  | Nat.succ l => match xs with
                  | []        => arithSeqRatHelper l dx b [dx]
                  | (y :: ys) => if y + dx > b
                                 then xs
                                 else arithSeqRatHelper l dx b ((y+dx)::y::ys)

def arithSeqRat (gastank : Nat) (a : Rat) (dx : Rat) (b : Rat) : List Rat :=
  (arithSeqRatHelper gastank dx b [a]).reverse

def arithSeqFloatHelper (gastank : Nat) (dx : Float) (b : Float) (xs : List Float) : List Float :=
  match gastank with
  | 0          => xs
  | Nat.succ l => match xs with
                  | []        => arithSeqFloatHelper l dx b [dx]
                  | (y :: ys) => if y + dx > b
                                 then xs
                                 else arithSeqFloatHelper l dx b ((y+dx)::y::ys)

def arithSeqFloat (gastank : Nat) (a : Float) (dx : Float) (b : Float) : List Float :=
  (arithSeqFloatHelper gastank dx b [a]).reverse

#eval arithSeqRat 10 (mkRat 3 1) (mkRat 1 10) (mkRat 32 10)

#eval arithSeqFloat 10 3 0.1 3.2



def arithSeqHelper {w1 w2 : n} [Add n] [OfNat n 0] [LT n] [Decidable (w1 > w2)] (gastank : Nat) (dx : n) (b : n) (xs : List n) : List n :=
  match gastank with
  | 0          => xs
  | Nat.succ l => match xs with
                  | []        => arithSeqHelper l dx b [dx]
                  | (y :: ys) => if y + dx > b
                                 then xs
                                 else arithSeqHelper l dx b ((y+dx)::y::ys)

Kim Morrison (Mar 19 2024 at 21:51):

Hi @Scott N. Walck, please use #backticks when posting code examples; much easier to read!

Alex J. Best (Mar 19 2024 at 22:17):

Do you really want to use the Lean.Rat rationals? https://leanprover-community.github.io/mathlib4_docs/Lean/Data/Rat.html they don't have many instances on them.
[DecidableRel ((· > ·) : n → n → Prop)] is the standard way to assume > is decidable


Last updated: May 02 2025 at 03:31 UTC