This PR reworks the `simp` set around the `Id` monad, to not elide or unfold `pure` and `Id.run` In particular, it stops encoding the "defeq abuse" of `Id X = X` in the statements of theorems, instead using `Id.run` and `pure` to pass back and forth between these two spellings. Often when writing these with `pure`, they generalize to other lawful monads; though such changes were split off to other PRs. This fixes the problem with the current simp set where `Id.run (pure x)` is simplified to `Id.run x`, instead of the desirable `x`. This is particularly bad because the` x` is sometimes inferred with type `Id X` instead of `X`, which prevents other `simp` lemmas about `X` from firing. Making `Id` reducible instead is not an option, as then the `Monad` instances would have nothing to key on. --------- Co-authored-by: Sebastian Graf <sg@lean-fro.org> Co-authored-by: Kim Morrison <kim@tqft.net> Co-authored-by: Paul Reichert <6992158+datokrat@users.noreply.github.com>
26 lines
651 B
Text
26 lines
651 B
Text
attribute [-simp] Nat.default_eq_zero -- undo changes to simp set after this test was written
|
||
|
||
#check_simp #[1,2,3,4,5][2] ~> 3
|
||
#check_simp #[1,2,3,4,5][2]? ~> some 3
|
||
#check_simp #[1,2,3,4,5][7]? ~> none
|
||
#check_simp #[][0]? ~> none
|
||
#check_simp #[1,2,3,4,5][2]! ~> 3
|
||
#check_simp #[1,2,3,4,5][7]! ~> (default : Nat)
|
||
#check_simp (#[] : Array Nat)[0]! ~> (default : Nat)
|
||
|
||
variable {xs : Array α} in
|
||
#check_simp xs.size = 0 ~> xs = #[]
|
||
|
||
#check_simp
|
||
(Id.run do
|
||
let mut s := 0
|
||
for i in #[1,2,3,4] do
|
||
s := s + i
|
||
pure s) ~> 10
|
||
|
||
#check_simp
|
||
(Id.run do
|
||
let mut s := 0
|
||
for h : i in #[1,2,3,4] do
|
||
s := s + i
|
||
pure s) ~> 10
|