This PR fixes an issue when including a hard line break in a `Format` that caused subsequent (ordinary) line breaks to be erroneously flattened to spaces. This issue is especially important for displaying notes and hints in error messages, as these components could appear garbled due to improper line-break rendering.
124 lines
3 KiB
Text
124 lines
3 KiB
Text
theorem le_of_not_lt {a b : Nat} (_: ¬ a < b): b ≤ a := sorry
|
|
theorem lt_of_succ_lt (_: a + 1 < b): a < b := sorry
|
|
theorem succ_pred_eq_of_pos (_: 0 < v): v - 1 + 1 = v := sorry
|
|
|
|
set_option trace.Meta.Tactic.simp true
|
|
--set_option trace.Debug.Meta.Tactic.simp true
|
|
|
|
set_option Elab.async false -- for stable message ordering in #guard_msgs
|
|
|
|
/--
|
|
warning: declaration uses 'sorry'
|
|
---
|
|
trace: [Meta.Tactic.simp.rewrite] h₁:1000:
|
|
k ≤ v - 1
|
|
==>
|
|
True
|
|
[Meta.Tactic.simp.discharge] succ_pred_eq_of_pos discharge ✅️
|
|
0 < v
|
|
[Meta.Tactic.simp.rewrite] h₂:1000:
|
|
0 < v
|
|
==>
|
|
True
|
|
[Meta.Tactic.simp.rewrite] succ_pred_eq_of_pos:1000:
|
|
v - 1 + 1
|
|
==>
|
|
v
|
|
[Meta.Tactic.simp.rewrite] ite_true:1000:
|
|
if True then ⟨v, ⋯⟩ else ⟨v - 1, ⋯⟩
|
|
==>
|
|
⟨v, ⋯⟩
|
|
[Meta.Tactic.simp.rewrite] eq_self:1000:
|
|
⟨v, ⋯⟩ = ⟨v, ⋯⟩
|
|
==>
|
|
True
|
|
-/
|
|
#guard_msgs in
|
|
example (h₁: k ≤ v - 1) (h₂: 0 < v):
|
|
(if k ≤ v - 1 then Fin.mk (v-1+1) sorry else Fin.mk (v-1) sorry) = Fin.mk v sorry (n:=n) := by
|
|
simp only [
|
|
h₁, h₂,
|
|
ite_true,
|
|
succ_pred_eq_of_pos
|
|
----------------
|
|
, le_of_not_lt
|
|
, lt_of_succ_lt
|
|
]
|
|
|
|
-- it works
|
|
|
|
/--
|
|
warning: declaration uses 'sorry'
|
|
---
|
|
trace: [Meta.Tactic.simp.rewrite] h₁:1000:
|
|
k ≤ v - 1
|
|
==>
|
|
True
|
|
[Meta.Tactic.simp.discharge] succ_pred_eq_of_pos discharge ✅️
|
|
0 < v
|
|
[Meta.Tactic.simp.rewrite] h₂:1000:
|
|
0 < v
|
|
==>
|
|
True
|
|
[Meta.Tactic.simp.rewrite] succ_pred_eq_of_pos:1000:
|
|
v - 1 + 1
|
|
==>
|
|
v
|
|
[Meta.Tactic.simp.rewrite] ite_true:1000:
|
|
if True then ⟨v, ⋯⟩ else ⟨v - 1, ⋯⟩
|
|
==>
|
|
⟨v, ⋯⟩
|
|
[Meta.Tactic.simp.rewrite] eq_self:1000:
|
|
⟨v, ⋯⟩ = ⟨v, ⋯⟩
|
|
==>
|
|
True
|
|
-/
|
|
#guard_msgs in
|
|
example (h₁: k ≤ v - 1) (h₂: 0 < v):
|
|
(if k ≤ v - 1 then Fin.mk (v-1+1) sorry else Fin.mk (v-1) sorry) = Fin.mk v sorry (n:=n) := by
|
|
simp (config := { memoize := false}) only [
|
|
h₁, h₂,
|
|
ite_true,
|
|
succ_pred_eq_of_pos
|
|
----------------
|
|
, le_of_not_lt
|
|
, lt_of_succ_lt
|
|
]
|
|
|
|
/--
|
|
warning: declaration uses 'sorry'
|
|
---
|
|
trace: [Meta.Tactic.simp.rewrite] h₁:1000:
|
|
k ≤ v - 1
|
|
==>
|
|
True
|
|
[Meta.Tactic.simp.discharge] succ_pred_eq_of_pos discharge ✅️
|
|
0 < v
|
|
[Meta.Tactic.simp.rewrite] h₂:1000:
|
|
0 < v
|
|
==>
|
|
True
|
|
[Meta.Tactic.simp.rewrite] succ_pred_eq_of_pos:1000:
|
|
v - 1 + 1
|
|
==>
|
|
v
|
|
[Meta.Tactic.simp.rewrite] ite_true:1000:
|
|
if True then ⟨v, ⋯⟩ else ⟨v - 1, ⋯⟩
|
|
==>
|
|
⟨v, ⋯⟩
|
|
[Meta.Tactic.simp.rewrite] eq_self:1000:
|
|
⟨v, ⋯⟩ = ⟨v, ⋯⟩
|
|
==>
|
|
True
|
|
-/
|
|
#guard_msgs in
|
|
example (h₁: k ≤ v - 1) (h₂: 0 < v):
|
|
(if k ≤ v - 1 then Fin.mk (v-1+1) sorry else Fin.mk (v-1) sorry) = Fin.mk v sorry (n:=n) := by
|
|
simp only [
|
|
h₁, h₂,
|
|
ite_true,
|
|
succ_pred_eq_of_pos
|
|
----------------
|
|
--, le_of_not_lt
|
|
--, lt_of_succ_lt
|
|
]
|