Zulip Chat Archive
Stream: lean4
Topic: understanding simp and interaction with iff and hypotheses
Yakov Pechersky (Oct 23 2022 at 22:46):
Consider the following example, pbind_eq_some_iff, which is a mwe of pbind_eq_some, in porting in Mathlib.Data.Option.Basic for mathlib4. Some questions: why is the only working proof here the one that is simp only ... <;> intro h <;> simp at h? Why does just simp not work? Does one need the new simp_intros? Why does the simp at * version not work? That issue is regardless of whether the intro-d hypothesis named or not:
@[simp] theorem not_exists {α : Sort _} {p : α → Prop} : (¬∃ x, p x) ↔ ∀ x, ¬p x := sorry
namespace Option
instance : Membership α (Option α) := ⟨fun a b => b = some a⟩
variable {x : Option α}
@[simp] theorem mem_def {a : α} {b : Option α} : a ∈ b ↔ b = some a := .rfl
@[simp]
def pbind : ∀ x : Option α, (∀ a : α, a ∈ x → Option β) → Option β
| none, _ => none
| some a, f => f a rfl
theorem pbind_eq_some_imp {f : ∀ a : α, a ∈ x → Option β} {y : β} :
x.pbind f = some y → ∃ (z : α) (H : z ∈ x), f z H = some y := by
cases x
· simp
· sorry
-- why does this not work when the `imp` version does?
theorem pbind_eq_some_iff {f : ∀ a : α, a ∈ x → Option β} {y : β} :
x.pbind f = some y ↔ ∃ (z : α) (H : z ∈ x), f z H = some y := by
cases x
· simp -- doesn't work all the way
sorry
· sorry
theorem pbind_eq_some_iff' {f : ∀ a : α, a ∈ x → Option β} {y : β} :
x.pbind f = some y ↔ ∃ (z : α) (H : z ∈ x), f z H = some y := by
cases x
· simp only [pbind, false_iff, not_exists]
intro z h
simp at h
· sorry
-- why does this not work when the previous `intro h, simp at h` did?
theorem pbind_eq_some_iff'' {f : ∀ a : α, a ∈ x → Option β} {y : β} :
x.pbind f = some y ↔ ∃ (z : α) (H : z ∈ x), f z H = some y := by
cases x
· simp only [pbind, false_iff, not_exists] -- also red line is here and not at `simp at *`
intro z h
simp at * -- doesn't work
· sorry
end Option
Kevin Buzzard (Oct 24 2022 at 05:47):
In Lean 3 there was something like simp {something:=tt} which would do the intros for you
Mario Carneiro (Oct 24 2022 at 06:10):
you mean simp {contextual := tt}?
Mario Carneiro (Oct 24 2022 at 06:10):
that's spelled simp (config := {contextual := true}) now
Kevin Buzzard (Oct 24 2022 at 06:11):
I never really understood whether that was simp_intros or whether it just happened to do what simp_intros did
Mario Carneiro (Oct 24 2022 at 06:11):
Oh, simp_intros is something else
Mario Carneiro (Oct 24 2022 at 06:12):
maybe that's what you want here, I didn't read closely
Mario Carneiro (Oct 24 2022 at 06:12):
simp {contextual := tt} will make use of hypotheses that enter the context when it "rewrites under binders"
Mario Carneiro (Oct 24 2022 at 06:13):
so for example \forall (h : a = b), a + a = 1 will simp to \forall (h : a = b), b + b = 1
Last updated: May 02 2025 at 03:31 UTC