We recently discovered inconsistencies in Mathlib and Std over the ordering of the arguments for `==`. The most common usage puts the "more variable" term on the LHS, and the "more constant" term on the RHS, however there are plenty of exceptions, and they cause unnecessary pain when switching (particularly, sometimes requiring otherwise unneeded `LawfulBEq` hypotheses). This convention is consistent with the (obvious) preference for `x == 0` over `0 == x` when one term is a literal. We recently updated Std to use this convention https://github.com/leanprover/std4/pull/430 This PR changes the two major places in Lean that use the opposite convention, and adds a suggestion to the docstring for `BEq` about the preferred convention.
12 lines
607 B
Text
12 lines
607 B
Text
theorem Array.sizeOf_lt_of_mem' [DecidableEq α] [SizeOf α] {as : Array α} (h : as.contains a) : sizeOf a < sizeOf as := by
|
||
simp [Membership.mem, contains, any, Id.run, BEq.beq, anyM] at h
|
||
let rec aux (j : Nat) : anyM.loop (m := Id) (fun b => decide (b = a)) as as.size (Nat.le_refl ..) j = true → sizeOf a < sizeOf as := by
|
||
unfold anyM.loop
|
||
intro h
|
||
split at h
|
||
· simp only [bind, decide_eq_true_eq, pure] at h; split at h
|
||
next he => subst a; apply sizeOf_get
|
||
next => have ih := aux (j+1) h; assumption
|
||
· contradiction
|
||
termination_by as.size - j
|
||
apply aux 0 h
|