Zulip Chat Archive

Stream: general

Topic: squeeze_simp and simp only disagreeing


Yakov Pechersky (Sep 10 2020 at 03:43):

Is there something I don't understand about simplifying in a dite conditional? Why do the first two examples work, but the third one doesn't?

import data.fin

variables {n : }

open fin

@[simp] lemma succ_above_lt_iff (p : fin (n + 1)) (i : fin n) : p.succ_above i < p  i.cast_succ < p :=
begin
  refine iff.intro _ _,
  { intro h,
    cases succ_above_lt_ge p i with H H,
    { exact H },
    { rw succ_above_above _ _ H at h,
      exact lt_trans (cast_succ_lt_succ i) h } },
  { intro h,
    rw succ_above_below _ _ h,
    exact h }
end

example (p : fin (n + 1)) (i : fin n) :
  p.pred_above (p.succ_above i) (succ_above_ne _ _) = i :=
begin
  rw pred_above,
  simp, -- it's able to simp in the dite condition
  /-
n : ℕ,
p : fin (n + 1),
i : fin n
⊢ dite (i.cast_succ < p) (λ (h : i.cast_succ < p), (p.succ_above i).cast_lt _)
      (λ (h : ¬i.cast_succ < p), (p.succ_above i).pred _) =
    i
-/
  sorry
end

example (p : fin (n + 1)) (i : fin n) :
  p.pred_above (p.succ_above i) (succ_above_ne _ _) = i :=
begin
  rw pred_above,
  squeeze_simp, -- still able to simp in the dite condition, suggests succ_above_lt_iff
  sorry
end

example (p : fin (n + 1)) (i : fin n) :
  p.pred_above (p.succ_above i) (succ_above_ne _ _) = i :=
begin
  rw pred_above,
  simp only [succ_above_lt_iff], -- simplify tactic failed to simplify
  sorry
end

Johan Commelin (Sep 10 2020 at 05:13):

Yes, this is really annoying. I don't understand the details, but it's a known issue. And I think people have ideas on how to improve this.


Last updated: Dec 20 2023 at 11:08 UTC