This PR makes `simp` consult its own cache more often, to avoid replicating work. Before, the simp cache was checked upon entry of `simpImpl` only, which then calls `simpLoop`, which recursively iterates the `pre`-lemmas, without checking the cache again. Now, `simpLoop` itself checks the cache. This seems more principled, given that `simpLoop` is actually putting entries into the cache for each of its calls, so it’s more uniform if it checks the cache itself. This avoids repeated rewrites. For example given ``` theorem ab : a = b := testSorry theorem bc : b = c := testSorry example (h : P c) : P b ∧ P a := by simp [ab, bc, h] ``` simp would rewrite `b ==> c` twice (once as part of `b ==> c` and then again as part of `a ==> b ==> c`). And it’d be order dependent: With ``` example (h : P c) : P a ∧ P b := by simp [ab, bc, h] ``` the `a ==> b ==> c` chain would insert `b ==> c` into the cache, and picked up by `simpImpl` when rewriting `P b`. With this change, `b ==> c` is performed only once in both examples. Instruction counts on stdlib and mathlib both show a mild improvement across the board (0.5%), with individual modules improving by up to 4% in stdlib and even more in mathlib. (This does not check the cache before applying `post`, which explains where there are still some repeated rewrites in the trace logs. But I’m less sure about inserting a cache check here and so I am treading carefully here. It’s also going to be at most one `post` application that’s duplicated, because if `post` returns `.visit`, we go back to `pre` and thus a cache check.)
45 lines
1.9 KiB
Text
45 lines
1.9 KiB
Text
decreasing_by.lean:34:0-39:17: error: Could not find a decreasing measure.
|
|
The basic measures relate at each recursive call as follows:
|
|
(<, ≤, =: relation proved, ? all proofs failed, _: no proof attempted)
|
|
n m
|
|
1) 34:29-43 = ?
|
|
2) 34:46-62 ? _
|
|
Please use `termination_by` to specify a decreasing measure.
|
|
decreasing_by.lean:61:0-67:19: error: Could not find a decreasing measure.
|
|
The basic measures relate at each recursive call as follows:
|
|
(<, ≤, =: relation proved, ? all proofs failed, _: no proof attempted)
|
|
n m
|
|
1) 61:29-43 = ?
|
|
2) 61:46-62 ? _
|
|
Please use `termination_by` to specify a decreasing measure.
|
|
decreasing_by.lean:75:13-77:3: error: unexpected token 'end'; expected '{' or tactic
|
|
decreasing_by.lean:75:0-75:13: error: unsolved goals
|
|
n m : Nat
|
|
⊢ Prod.Lex (fun x1 x2 => x1 < x2) (fun x1 x2 => x1 < x2) (n, dec2 m) (n, m)
|
|
|
|
n m : Nat
|
|
⊢ Prod.Lex (fun x1 x2 => x1 < x2) (fun x1 x2 => x1 < x2) (dec1 n, 100) (n, m)
|
|
decreasing_by.lean:85:0-85:22: error: unsolved goals
|
|
case a
|
|
n m : Nat
|
|
⊢ Prod.Lex (fun x1 x2 => x1 < x2) (fun x1 x2 => x1 < x2) (n, dec2 m) (n, m)
|
|
|
|
n m : Nat
|
|
⊢ Prod.Lex (fun x1 x2 => x1 < x2) (fun x1 x2 => x1 < x2) (dec1 n, 100) (n, m)
|
|
decreasing_by.lean:93:0-94:22: error: Could not find a decreasing measure.
|
|
The basic measures relate at each recursive call as follows:
|
|
(<, ≤, =: relation proved, ? all proofs failed, _: no proof attempted)
|
|
n m
|
|
1) 93:29-43 = ?
|
|
2) 93:46-62 ? _
|
|
Please use `termination_by` to specify a decreasing measure.
|
|
decreasing_by.lean:104:0-106:17: error: unsolved goals
|
|
n m : Nat
|
|
⊢ Prod.Lex (fun x1 x2 => x1 < x2) (fun x1 x2 => x1 < x2) (dec1 n, 100) (n, m)
|
|
decreasing_by.lean:114:0-117:17: error: Could not find a decreasing measure.
|
|
The basic measures relate at each recursive call as follows:
|
|
(<, ≤, =: relation proved, ? all proofs failed, _: no proof attempted)
|
|
n m
|
|
1) 114:29-43 = ?
|
|
2) 114:46-62 ? _
|
|
Please use `termination_by` to specify a decreasing measure.
|