Zulip Chat Archive

Stream: general

Topic: calc iff


Patrick Massot (Dec 20 2018 at 09:30):

Is there anything we can do to get something like

example (p q r s : Prop) (h : p  q) (h' : q  r) (h'' : r  s) : p  s :=
λ hp, (calc p  q : h
...  r : h'
...  s : h'') hp

to work?

Patrick Massot (Dec 20 2018 at 09:33):

I'm trying to please Johannes who doesn't like

example (p q r s : Prop) (h : p  q) (h' : q  r) (h'' : r  s) : p  s :=
begin
  rw h,
  rwa h'' at h',
end

which I admit is less transparent...

Johan Commelin (Dec 20 2018 at 09:36):

If only Prop were a category... then you could write

example (p q r s : Prop) (h : p  q) (h' : q  r) (h'' : r  s) : p  s :=
h.mp  h'  h''.mp

Patrick Massot (Dec 20 2018 at 09:38):

Maybe I should say that the actual proof would rather look like

example (p q r s : Prop) (h : ...) (h' : ...) (h'' : ...) : p  s :=
λ hp, (calc p  q : by rw h
...  r : by h'
...  s : by rw h'') hp

Mario Carneiro (Dec 20 2018 at 09:52):

unfortunately no. Here's the best we can do:

abbreviation imp (p q : Prop) := p  q
infixr `→→`:25 := imp
@[trans] theorem imp_of_iff_of_imp {p q r : Prop}
  (h₁ : p  q) (h₂ : q →→ r) : p →→ r := h₂  h₁.1

@[trans] theorem iff_of_imp_of_imp {p q r : Prop}
  (h₁ : p →→ q) (h₂ : q  r) : p →→ r := h₂.1  h₁

example (p q r s : Prop) (h : p  q) (h' : q  r) (h'' : r  s) : p  s :=
λ hp, (calc p  q : h
... →→ r : h'
...  s : h'') hp

Mario Carneiro (Dec 20 2018 at 09:53):

If you replace →→ with the trans lemmas are rejected

Mario Carneiro (Dec 20 2018 at 09:54):

because is a bit magic for a binary operator

Patrick Massot (Dec 20 2018 at 09:54):

This magic obstruction is what I suspected when I tried to define those trans lemmas

Patrick Massot (Dec 20 2018 at 09:55):

Here is the best I could do in order to rewrite my continuity proof so that it looks like what I see on paper:

lemma uniform_continuous.continuous [uniform_space β] {f : α  β}
  (hf : uniform_continuous f) : continuous f :=
let ff := (λ p : α×α, (f p.1, f p.2)) in
continuous_iff_tendsto.mpr $ λ a,
have key : prod.mk (f a)  f = ff  prod.mk a, by ext x ; simp,
have map ff uniformity  uniformity, from hf,
have uniformity  comap ff uniformity, from map_le_iff_le_comap.1 this,
have comap (prod.mk a) (@uniformity α _)  (comap (prod.mk a) (comap ff uniformity)), from comap_mono this,
have nhds a  comap (ff  prod.mk a) uniformity, by rwa [comap_comap_comp, nhds_eq_comap_uniformity] at this,
have nhds a  comap (prod.mk (f a)  f) uniformity, by rwa key at this,
have nhds a  comap f (comap (prod.mk (f a)) uniformity), by rwa comap_comap_comp at this,
have nhds a  comap f (nhds (f a)), by rwa nhds_eq_comap_uniformity at this,
tendsto_iff_comap.2 this

Patrick Massot (Dec 20 2018 at 09:56):

How do you like that style?

Kenny Lau (Dec 20 2018 at 10:02):

too long

Patrick Massot (Dec 20 2018 at 10:07):

Variation:

lemma uniform_continuous.continuous [uniform_space β] {f : α  β}
  (hf : uniform_continuous f) : continuous f :=
let ff := (λ p : α×α, (f p.1, f p.2)) in
continuous_iff_tendsto.mpr $ λ a,
have key : prod.mk (f a)  f = ff  prod.mk a, by ext x ; simp,
have map ff uniformity  uniformity, from hf,
have uniformity  comap ff uniformity, from map_le_iff_le_comap.1 this,
have comap (prod.mk a) (@uniformity α _)  (comap (prod.mk a) (comap ff uniformity)), from comap_mono this,
let this := calc
nhds a  comap (ff  prod.mk a) uniformity : by rwa [comap_comap_comp, nhds_eq_comap_uniformity] at this
   ...  comap (prod.mk (f a)  f) uniformity : by simp[key, le_refl]
   ...  comap f (comap (prod.mk (f a)) uniformity) : by rw comap_comap_comp ; exact le_refl _
   ...  comap f (nhds (f a)) : by rw nhds_eq_comap_uniformity ; exact le_refl _  in
tendsto_iff_comap.2 this

Patrick Massot (Dec 20 2018 at 10:07):

It's really a pain that le_refl isn't inserted automatically

Kenny Lau (Dec 20 2018 at 10:09):

what's wrong with the current proof?

Sebastien Gouezel (Dec 20 2018 at 10:15):

I have added le_refl to the simp set in my mathlib. I will probably PR it one day, together with a lot of other stuff (but cut into atomic pieces, if this is the way we should do PRs), once (or if?) my two topology PRs are merged.

Patrick Massot (Dec 20 2018 at 10:16):

Kenny, the current proof is inelegant. Remember that only Lean thinks proofs are irrelevant

Kenny Lau (Dec 20 2018 at 10:17):

eh, I also think they're irrelevant

Johan Commelin (Dec 20 2018 at 10:20):

@Kevin Buzzard You've created little monsters :scream:. Clearly they need to be brought up in the ways of the old masters, who value the esthetics of a good proof, and whose proofs illuminate and inspire understanding.

Kevin Buzzard (Dec 20 2018 at 10:36):

Kids these days

Scott Morrison (Dec 20 2018 at 10:37):

... uphill both ways.

Johan Commelin (Dec 20 2018 at 11:00):

I will probably PR it one day, ... once (or if?) my two topology PRs are merged.

O.o... that doesn't sound good.

Kenny Lau (Dec 20 2018 at 11:02):

looks like he will PR it after Lean 4 has been released

Sebastien Gouezel (Dec 20 2018 at 11:04):

It's just that all my constructions build on these two PRs, so there is no way I can PR anything before those two are merged. But this does not prevent me of working steadily on my own branch, I have almost proved now that the Gromov-Hausdorff distance is a distance, which involves a lot of material (several thousands of line, I would say :)

Mario Carneiro (Dec 20 2018 at 11:19):

yeah okay. I've been putting it off because it's a big PR and I had to check it out and fiddle with stuff, but I will work on that now


Last updated: Dec 20 2023 at 11:08 UTC