Zulip Chat Archive

Stream: new members

Topic: list can't get longer by filter_map


Martin Dvořák (Jul 14 2022 at 21:24):

I need a proof that a list can't get longer by applying filter_map to it.

MWE:

example (l : list ) (f :   option ) :
  (list.filter_map f l).length  l.length :=
begin
  sorry,
end

Eric Wieser (Jul 14 2022 at 22:00):

My guess would be docs#list.length_filter_map

Eric Wieser (Jul 14 2022 at 22:00):

But that doesn't exist!

Junyan Xu (Jul 14 2022 at 23:20):

I think this is the way to show it:

import data.list.basic

variables {α β : Type*} (f : α  option β) (l : list α)

theorem map_filter_map_some_eq_filter_map_is_some :
  (l.filter_map f).map some = (l.map f).filter (λ b, b.is_some) :=
begin
  rw [ list.filter_map_eq_filter, list.filter_map_map, list.map_filter_map],
  congr, ext,
  simp only [option.mem_def, option.guard_eq_some, option.map_eq_some'],
  rw option.is_some_iff_exists,
  split,
  { rintro a, h, rfl⟩, exact h, a, h },
  { rintro rfl, a, h⟩, exact a, h, h.symm },
end

theorem length_filter_map_le : (list.filter_map f l).length  l.length :=
begin
  rw [ list.length_map some, map_filter_map_some_eq_filter_map_is_some],
  convert list.length_le_of_sublist (list.filter_sublist _),
  rw list.length_map,
end

The first theorem could probably be golfed (it's possible that induction is faster).

Kyle Miller (Jul 15 2022 at 00:01):

Refactored and golfed:

import data.list.basic

variables {α β : Type*} (f : α  option β) (l : list α)

theorem list.map_filter_map_some_eq_filter_map_is_some :
  (l.filter_map f).map some = (l.map f).filter (λ b, b.is_some) :=
begin
  induction l with x xs ih,
  { simp },
  { cases h : f x; rw [list.filter_map_cons, h]; simp [h, ih] },
end

theorem list.length_filter_le (p : α  Prop) [decidable_pred p] :
  (l.filter p).length  l.length :=
list.length_le_of_sublist (list.filter_sublist _)

theorem list.length_filter_map_le : (list.filter_map f l).length  l.length :=
begin
  rw [ list.length_map some, list.map_filter_map_some_eq_filter_map_is_some,  list.length_map f],
  apply list.length_filter_le,
end

example (l : list ) (f :   option ) :
  (list.filter_map f l).length  l.length :=
list.length_filter_map_le _ _

Martin Dvořák (Jul 15 2022 at 00:04):

In the meanwhile, I wrote a simple proof by induction. Do you want me to commit my proof, or will you create a PR with your proof?

Notification Bot (Jul 15 2022 at 00:04):

Martin Dvořák has marked this topic as unresolved.

Junyan Xu (Jul 15 2022 at 00:06):

I like @Kyle Miller 's refactor and proofs!

Eric Wieser (Jul 15 2022 at 00:06):

Do we not have docs#list.length_filter_le?

Eric Wieser (Jul 15 2022 at 00:06):

I would expect it to appear next to docs#list.length_filter_lt_length_iff_exists

Eric Wieser (Jul 15 2022 at 00:06):

Oh, it follows from docs#list.countp_eq_length_filter

Kyle Miller (Jul 15 2022 at 00:09):

It also has the very direct proof list.length_le_of_sublist (list.filter_sublist _) that uses sublists rather than going through arithmetic and countp.

Kyle Miller (Jul 15 2022 at 00:09):

(I just fixed the naming in my code snippet.)

Martin Dvořák (Jul 15 2022 at 00:09):

OK, will you @Kyle Miller create the PR with your code please?

Kyle Miller (Jul 15 2022 at 00:11):

Would @Martin Dvořák or @Junyan Xu please do it? :smile: Feel free to add me as a reviewer.

Martin Dvořák (Jul 15 2022 at 00:14):

I can do it, but I don't know whether it is ethical to commit someone else's code under my name.

Junyan Xu (Jul 15 2022 at 00:23):

Free free to open a PR! You may add co-authored-by lines as appropriate.

Martin Dvořák (Jul 15 2022 at 00:28):

OK.

Martin Dvořák (Jul 15 2022 at 00:56):

https://github.com/leanprover-community/mathlib/pull/15369

Martin Dvořák (Jul 29 2022 at 15:31):

Is anybody interested in having the lemma in mathlib? Or should I close the PR?

Alex J. Best (Jul 29 2022 at 15:39):

Seems like a useful enough lemma to me, not that I have a use for it in mind.

Alex J. Best (Jul 29 2022 at 15:40):

I just re-started the CI as it seems to have not completed for some reason

Martin Dvořák (Jul 29 2022 at 15:44):

Alex J. Best said:

I just re-started the CI as it seems to have not completed for some reason

Should I rebase the branch (currently more than 2 weeks behind) and try again?

Andrew Yang (Jul 29 2022 at 15:55):

When your PR is ready for review, you can mark the PR using the tag "awaiting-review". If not, the PR will not show up on the #queue and decrease the chance of your PR getting reviewed. For more such tips before PRing, checkout the page How to contribute to mathlib.

Martin Dvořák (Jul 29 2022 at 16:08):

Should I use "awaiting-review" even if my PR was already reviewed and I need a reply rather than another review?

Andrew Yang (Jul 29 2022 at 16:14):

Yes. See the Lifecycle of a PR section of that page. A typical PR will jump between the "awaiting-review" tag and the "awaiting-author" tag several times before it is merged.

Martin Dvořák (Aug 15 2022 at 19:15):

Is anybody interested in a finishing the PR? Or do you want me to close it?


Last updated: Dec 20 2023 at 11:08 UTC