36 lines
1.2 KiB
Text
36 lines
1.2 KiB
Text
/-
|
||
Copyright (c) 2024 Lean FRO. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Author: Kim Morrison
|
||
-/
|
||
module
|
||
|
||
prelude
|
||
import Init.Data.Array.Basic
|
||
import Init.Data.Nat.Lemmas
|
||
import Init.Data.Range
|
||
|
||
set_option linter.listVariables true -- Enforce naming conventions for `List`/`Array`/`Vector` variables.
|
||
set_option linter.indexVariables true -- Enforce naming conventions for index variables.
|
||
|
||
namespace Array
|
||
|
||
/--
|
||
Compares arrays lexicographically with respect to a comparison `lt` on their elements.
|
||
|
||
Specifically, `Array.lex as bs lt` is true if
|
||
* `bs` is larger than `as` and `as` is pairwise equivalent via `==` to the initial segment of `bs`,
|
||
or
|
||
* there is an index `i` such that `lt as[i] bs[i]`, and for all `j < i`, `as[j] == bs[j]`.
|
||
-/
|
||
def lex [BEq α] (as bs : Array α) (lt : α → α → Bool := by exact (· < ·)) : Bool := Id.run do
|
||
for h : i in [0 : min as.size bs.size] do
|
||
-- TODO: `omega` should be able to find this itself.
|
||
have : i < min as.size bs.size := Membership.get_elem_helper h rfl
|
||
if lt as[i] bs[i] then
|
||
return true
|
||
else if as[i] != bs[i] then
|
||
return false
|
||
return as.size < bs.size
|
||
|
||
end Array
|