Zulip Chat Archive

Stream: general

Topic: suffices to prove


Kevin Buzzard (Dec 28 2019 at 17:28):

Idly proving that equivalence relations are the same as partitions (thinking about a future Lean maths challenge). Here's a goal:

1 goal
X : Type,
R : {R // equivalence R},
c d : set X,
hc : c ∈ {S : set X | ∃ (x : X), S = equivalence_class ↑R x},
hd : d ∈ {S : set X | ∃ (x : X), S = equivalence_class ↑R x},
x : X,
hx : x ∈ c ∩ d
⊢ c = d

I want to prove this by saying "it suffices to prove c \sub d and d \sub c, but by symmetry we only need to prove c \sub d". I know I can factor out a lemma saying "if all the things in the local context are true then c \sub d" and then I can just apply this lemma twice -- but I don't see any obstruction in theory to having a tactic where I say "by set.subset.antisymm and the underlying symmetry, change the goal to c \sub d please" and maybe Lean replies "just convince me that x ∈ d ∩ c and you're good to go".

Can this already be done with some wlog trickery? I couldn't see how.

Kevin Buzzard (Dec 28 2019 at 17:29):

PS def equivalence_class {X : Type} (R : X → X → Prop) (x : X) := {y : X | R x y}, not that it matters here (all that matters is that the local context is symmetric in c and d)

Patrick Massot (Dec 28 2019 at 17:49):

I came across the same question last week, and I don't think wlog helps here.

Patrick Massot (Dec 28 2019 at 17:52):

If you post a realistic MWE I can try to cook up something.

Kevin Buzzard (Dec 28 2019 at 17:55):

Is this realistic:

def equivalence_class {X : Type} (R : X  X  Prop) (x : X) := {y : X | R x y}

example (X : Type) (R : X  X  Prop) (HR : equivalence R) :  (c d : set X),
  c  {S : set X |  (x : X), S = equivalence_class R x} 
  d  {S : set X |  (x : X), S = equivalence_class R x}  c  d    c = d :=
begin
  intros c d hc hd hcd,
  sorry
end

?

Yury G. Kudryashov (Dec 28 2019 at 18:25):

wlog not (c ⊂ d)?

Kevin Buzzard (Dec 28 2019 at 18:40):

I don't think that's syntactically correct (but I don't know much about wlog). wlog not (c ⊂ d) gives me complaints about unknown identifiers c and d. wlog h: not (c ⊂ d) gives me

To generate cases at least two permutations are required, i.e. `using [x y, y x]` or exactly 0 or 2 variables
state:
X : Type,
R : X → X → Prop,
HR : equivalence R,
c d : set X,
hc : c ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
hd : d ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
hcd : c ∩ d ≠ ∅
⊢ c = d

Patrick Massot (Dec 28 2019 at 18:41):

Can you write a tactic script that you would like to see reduced to one tactic?

Yury G. Kudryashov (Dec 28 2019 at 18:52):

Sorry, does wlog h : (not (c ⊂ d)) work?

Kevin Buzzard (Dec 28 2019 at 18:56):

I get the same error "To generate cases at least two permutations..." as above.

Kevin Buzzard (Dec 28 2019 at 19:10):

import tactic

def equivalence_class {X : Type} (R : X  X  Prop) (x : X) := {y : X | R x y}

example (X : Type) (R : X  X  Prop) (HR : equivalence R) :  (c d : set X),
  c  {S : set X |  (x : X), S = equivalence_class R x} 
  d  {S : set X |  (x : X), S = equivalence_class R x}  c  d    c = d :=
begin
  intros c d hc hd hcd,
  /-
  1 goal
X : Type,
R : X → X → Prop,
HR : equivalence R,
c d : set X,
hc : c ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
hd : d ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
hcd : c ∩ d ≠ ∅
⊢ c = d
-/
  suffices htemp :  (X : Type) (R : X  X  Prop) (HR : equivalence R) (c d : set X)
    (hc : c  {S : set X |  (x : X), S = equivalence_class R x})
    (hd : d  {S : set X |  (x : X), S = equivalence_class R x})
    (hcd : c  d  ), c  d, -- I want this to be my final goal
    apply set.subset.antisymm,
      exact htemp X R HR c d (by assumption) (by assumption) (by assumption),
    suffices htemp2 : d  c  , -- I want this to be the last but one goal
      exact htemp X R HR d c (by assumption) (by assumption) (htemp2), -- `by assumption` fails for htemp2
    /- currently two goals.
     first is
     ⊢ d ∩ c ≠ ∅
     and we have a hypothesis
     hcd : c ∩ d ≠ ∅,
    -/
    sorry,
    /- other goal is overkill currently:

      X : Type,
      R : X → X → Prop,
      HR : equivalence R,
      c d : set X,
      hc : c ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
      hd : d ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
      hcd : c ∩ d ≠ ∅
      ⊢ ∀ (X : Type) (R : X → X → Prop),
        equivalence R →
        ∀ (c d : set X),
        c ∈ {S : set X | ∃ (x : X), S = equivalence_class R x} →
        d ∈ {S : set X | ∃ (x : X), S = equivalence_class R x} → c ∩ d ≠ ∅ → c ⊆ d
    -/
    clear hcd hd hc c d HR R X,
    intros X R HR c d hc hd hcd,
    /-
    X : Type,
    R : X → X → Prop,
    HR : equivalence R,
    c d : set X,
    hc : c ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
    hd : d ∈ {S : set X | ∃ (x : X), S = equivalence_class R x},
    hcd : c ∩ d ≠ ∅
    ⊢ c ⊆ d
    -/
    sorry
  end

Kevin Buzzard (Dec 28 2019 at 19:24):

It's the "suffices : htemp" line which I can't be bothered to write. On the blackboard I'd just say "we want c=d, but it suffices to prove c sub d as the other inclusion then follows by symmetry"

Kevin Buzzard (Dec 28 2019 at 19:24):

I don't have to quantify over X and R, I could have left them as constants

Kenny Lau (Dec 29 2019 at 00:11):

import tactic.wlog

def equivalence_class {X : Type} (R : X  X  Prop) (x : X) := {y : X | R x y}

example (X : Type) (R : X  X  Prop) (HR : equivalence R) :  (c d : set X),
  c  {S : set X |  (x : X), S = equivalence_class R x} 
  d  {S : set X |  (x : X), S = equivalence_class R x}  c  d    c = d :=
begin
  classical, intros c d hc hd hcd,
  rw set.subset.antisymm_iff, by_contra h, rw not_and_distrib at h,
  wlog h1 : ¬c  d := h using [c d, d c],
end

Kevin Buzzard (Dec 29 2019 at 01:34):

Oh nice :-) I think this is what Yury was thinking of?


Last updated: Dec 20 2023 at 11:08 UTC