This PR fixes a mismatch between the behavior of `foldlM` and
`foldlMUnsafe` in the three array
types. This mismatch is only exposed when manually specifying a `stop`
value greater than the size
of the array and only exploitable through `native_decide`.
The mismatch was introduced as part of
4ba21ea10c which introduced
`foldlMUnsafe` and thus likely a mistake when building the `unsafe`
implementation instead of a
specification mistake.
Closes #11773
29 lines
888 B
Text
29 lines
888 B
Text
/-! This is a regression test for an issue with the implemented_by of Array.foldlM -/
|
|
|
|
/--
|
|
error: Tactic `native_decide` evaluated that the proposition
|
|
foldl (fun x1 x2 => x1 + x2) 0 #[1, 2, 3] 0 5 = 0
|
|
is false
|
|
-/
|
|
#guard_msgs in
|
|
theorem Array.foldl_broken : False := by
|
|
let x := #[1,2,3].foldl (. + .) 0 (stop := 5)
|
|
have : x = 6 := by rfl
|
|
have : x = 0 := by native_decide
|
|
contradiction
|
|
|
|
example : #[1,2,3].foldl (. + .) 0 (stop := 5) = 6 := by native_decide
|
|
|
|
/--
|
|
error: Tactic `native_decide` evaluated that the proposition
|
|
foldl (fun x1 x2 => x1 + x2) 0 { data := #[1, 2, 3] } 0 5 = 0
|
|
is false
|
|
-/
|
|
#guard_msgs in
|
|
theorem ByteArray.foldl_broken : False := by
|
|
let x := (ByteArray.mk #[1,2,3]).foldl (. + .) 0 (stop := 5)
|
|
have : x = 6 := by rfl
|
|
have : x = 0 := by native_decide
|
|
grind
|
|
|
|
example : (ByteArray.mk #[1,2,3]).foldl (. + .) 0 (stop := 5) = 6 := by native_decide
|