Zulip Chat Archive

Stream: general

Topic: how to fill this `sorry`?


Asei Inoue (Nov 23 2025 at 12:31):

import Batteries

open Std

@[grind <=]
theorem Array.sorted_take_swap {α : Type} [LE α] [IsPreorder α] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise (·  ·) (arr.take s))
  (le1 : arr[s]  arr[t])
  (le2 :  (i : Nat) (_ : i < t), arr[i]  arr[s])
    : Array.Pairwise (·  ·) ((arr.swap s t).take s) := by
  simp [Array.pairwise_iff_getElem] at h 
  grind

@[grind <=]
theorem Array.pairwise_take_swap {α : Type} {R : α  α  Prop} [Refl R] [Trans R R R] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise R (arr.take s))
  (le1 : R arr[s] arr[t])
  (le2 :  (i : Nat) (_ : i < t), R arr[i] arr[s])
    : Array.Pairwise R ((arr.swap s t).take s) := by
  simp [Array.pairwise_iff_getElem] at h 
  sorry

Asei Inoue (Nov 23 2025 at 12:33):

Background

I'm refactoring the grind lemmas.
Some of them assume stronger conditions than necessary, so I'd like to refactor the theorems so that they work with the minimal required assumptions.
Since Array.sorted_take_swap is already proved, I believe Array.pairwise_take_swap should be provable as well.

Aaron Liu (Nov 23 2025 at 12:34):

Can you make a #mwe?

Asei Inoue (Nov 23 2025 at 12:36):

removed

Asei Inoue (Nov 23 2025 at 12:37):

@Aaron Liu sorry, I have fixed the code

Aaron Liu (Nov 23 2025 at 12:39):

import Batteries

open Std

@[grind <=]
theorem Array.sorted_take_swap {α : Type} [LE α] [IsPreorder α] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise (·  ·) (arr.take s))
  (le1 : arr[s]  arr[t])
  (le2 :  (i : Nat) (_ : i < t), arr[i]  arr[s])
    : Array.Pairwise (·  ·) ((arr.swap s t).take s) := by
  simp [Array.pairwise_iff_getElem] at h 
  grind

@[grind <=]
theorem Array.pairwise_take_swap {α : Type} {R : α  α  Prop} [Refl R] [Trans R R R] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise R (arr.take s))
  (le1 : R arr[s] arr[t])
  (le2 :  (i : Nat) (_ : i < t), R arr[i] arr[s])
    : Array.Pairwise R ((arr.swap s t).take s) :=
  @Array.sorted_take_swap α R (@IsPreorder.mk α R Refl.refl (@Trans.trans α α α R R R _))
    arr s t hs ht h le1 le2

Asei Inoue (Nov 23 2025 at 12:40):

Thank you but IsPreorder.mk is needed?

Aaron Liu (Nov 23 2025 at 12:41):

is this better?

import Batteries

open Std

@[grind <=]
theorem Array.sorted_take_swap {α : Type} [LE α] [IsPreorder α] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise (·  ·) (arr.take s))
  (le1 : arr[s]  arr[t])
  (le2 :  (i : Nat) (_ : i < t), arr[i]  arr[s])
    : Array.Pairwise (·  ·) ((arr.swap s t).take s) := by
  simp [Array.pairwise_iff_getElem] at h 
  grind

@[grind <=]
theorem Array.pairwise_take_swap {α : Type} {R : α  α  Prop} [Refl R] [Trans R R R] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise R (arr.take s))
  (le1 : R arr[s] arr[t])
  (le2 :  (i : Nat) (_ : i < t), R arr[i] arr[s])
    : Array.Pairwise R ((arr.swap s t).take s) :=
  let : LE α := {
    le := R
  }
  have : IsPreorder α := {
    le_refl := Refl.refl
    le_trans _ _ _ := trans
  }
  Array.sorted_take_swap s t hs ht h le1 le2

Asei Inoue (Nov 23 2025 at 12:42):

oh sorry
I wanted to say "a proof without Array.sorted_take_swap is better"

Aaron Liu (Nov 23 2025 at 12:45):

import Batteries

open Std

@[grind <=]
theorem Array.pairwise_take_swap {α : Type} {R : α  α  Prop} [Refl R] [Trans R R R] {arr : Array α}
  (s t : Nat) (hs : s < arr.size) (ht : t < arr.size)
  (h : Array.Pairwise R (arr.take s))
  (le1 : R arr[s] arr[t])
  (le2 :  (i : Nat) (_ : i < t), R arr[i] arr[s])
    : Array.Pairwise R ((arr.swap s t).take s) := by
  obtain ⟨_, _, rfl :  o : LE α, IsPreorder α  R = o.le :=
    ⟨⟨R, @IsPreorder.mk α R (Refl.refl) (@Trans.trans α α α R R R _), rfl
  simp [Array.pairwise_iff_getElem] at h 
  grind

Asei Inoue (Nov 23 2025 at 12:50):

oh... grind can only treat IsPreorder? grind does not treat Refl, Trans?

Aaron Liu (Nov 23 2025 at 12:50):

I guess not :shrug:

Asei Inoue (Nov 23 2025 at 12:50):

@Aaron Liu Thank you anyway


Last updated: Dec 20 2025 at 21:32 UTC