Zulip Chat Archive

Stream: Is there code for X?

Topic: element of list of lists that is minimal subset


Paige Thomas (Apr 04 2025 at 06:29):

I'm wondering if there is an existing proof of this, or a more generic lemma that would specialize to this?

example
  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss) :
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ ys) → zs = ys :=
  sorry

Kim Morrison (Apr 04 2025 at 07:07):

Isn't it false because of reordering? e.g. take xss := [[0,1], [1,0]].

Kim Morrison (Apr 04 2025 at 07:07):

(Nerd-snipe: now make by plausible show you this counterexample.)

Paige Thomas (Apr 04 2025 at 07:12):

Sorry, I'm not familiar with plausible.

Paige Thomas (Apr 04 2025 at 07:16):

Hmm, I think your right though.

Paige Thomas (Apr 04 2025 at 07:16):

Maybe

example
  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss) :
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ ys) → ys ⊆ zs :=
  sorry

?

Kevin Buzzard (Apr 04 2025 at 07:17):

Did you try plausible?

Paige Thomas (Apr 04 2025 at 07:18):

I got an error message with

import Mathlib

example
  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss) :
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ ys) → zs = ys :=
  by plausible

Paige Thomas (Apr 04 2025 at 07:20):

Failed to create a `testable` instance for `∀ {α : Type} (xss : List (List α)),
  ∀ xs ∈ xss, ∃ ys ∈ xss, ys ⊆ xs ∧ ∀ (zs : List α), zs ∈ xss ∧ zs ⊆ ys → zs = ys`.

Kevin Buzzard (Apr 04 2025 at 07:32):

What happens if you change alpha to Nat? Or maybe it's beyond the scope of the tactic

Paige Thomas (Apr 04 2025 at 07:34):

I seem to get the same error.

Paige Thomas (Apr 04 2025 at 07:39):

I'm basically trying to show that if there is some element xs of xss, then there is also an element ys of xss that is the minimal subset of xs.

Paige Thomas (Apr 04 2025 at 07:40):

Even if ys is xs itself.

Kim Morrison (Apr 04 2025 at 10:19):

It's not beyond the scope of the tactic, someone just needs to write some Decidable instances, probably for "for all elements of some list such that" type quantifiers.

Bhavik Mehta (Apr 04 2025 at 12:05):

That decidable instance exists in core, it's docs#List.decidableBAll, but it's not firing because of the ∧ near the end. Uncurrying that, or just calling simp first, plausible still fails, but it tries this time:

import Mathlib

example
    {α : Type}
    (xss : List (List α))
    (xs : List α)
    (h1 : xs ∈ xss) :
    ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ ys) → zs = ys := by
  simp
  plausible -- Gave up after failing to generate values that fulfill the preconditions 87 times.

example
    {α : Type}
    (xss : List (List α))
    (xs : List α)
    (h1 : xs ∈ xss) :
    ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List α), zs ∈ xss → zs ⊆ ys → zs = ys := by
  plausible -- Gave up after failing to generate values that fulfill the preconditions 86 times.

Bhavik Mehta (Apr 04 2025 at 12:55):

Kim Morrison said:

(Nerd-snipe: now make by plausible show you this counterexample.)

Try as I might, I can't make it find a counterexample:

example (xss : List (List Nat)) :
    ∀ xs ∈ xss, ∃ (ys : List Nat), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List Nat), zs ∈ xss → zs ⊆ ys → zs = ys := by
  plausible

and turning on the trace options

import Mathlib

set_option trace.plausible.discarded true

example (xss : List (List Nat)) :
    ∀ xs ∈ xss, ∃ (ys : List Nat), ys ∈ xss ∧ ys ⊆ xs ∧ ∀ (zs : List Nat), zs ∈ xss → zs ⊆ ys → zs = ys := by
  plausible (config := {numInst := 4})

shows the things it tried. (I had to decrease the number of attempts otherwise it takes too long to show anything, and the live editor disconnects itself because of the time). This looks like the Sampleable instance for lists is doing something suboptimal, at least for this problem.

Paige Thomas (Apr 04 2025 at 16:47):

I think maybe this is a formalization of the idea I am trying to prove:

  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss) :
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧
    ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ xs) → ys ⊆ zs :=
  by
  sorry

Aaron Liu (Apr 04 2025 at 16:59):

That particular version is false:

import Mathlib

example : ¬∀
  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss),
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧
    ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ xs) → ys ⊆ zs :=
  by
  intro h
  simp_rw [and_imp] at h
  specialize @h (Fin 3) [[1, 2, 3], [0, 1], [0, 2]] [1, 2, 3] List.mem_cons_self
  revert h
  decide

Paige Thomas (Apr 04 2025 at 17:04):

argh

Paige Thomas (Apr 04 2025 at 18:59):

example
  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss) :
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧
    ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ ys) → ys ⊆ zs :=
  by
  sorry

?

Aaron Liu (Apr 04 2025 at 19:14):

import Mathlib

example
  {α : Type}
  (xss : List (List α))
  (xs : List α)
  (h1 : xs ∈ xss) :
  ∃ (ys : List α), ys ∈ xss ∧ ys ⊆ xs ∧
    ∀ (zs : List α), (zs ∈ xss ∧ zs ⊆ ys) → ys ⊆ zs :=
  by
  classical
  obtain ⟨ys, hys, hall⟩ := (xss.finite_toSet.inter_of_left {ys | ys ⊆ xs}).exists_minimal_wrt List.toFinset _  ⟨xs, h1, fun _ => id⟩
  use ys, hys.left, hys.right
  intro zs hzs x hx
  specialize hall zs ⟨hzs.left, hzs.right.trans hys.right⟩ fun x hx => List.mem_toFinset.mpr (hzs.right (List.mem_toFinset.mp hx))
  rwa [← List.mem_toFinset, ← hall, List.mem_toFinset]

Paige Thomas (Apr 04 2025 at 19:17):

Thank you!


Last updated: Feb 28 2026 at 14:05 UTC