Zulip Chat Archive

Stream: new members

Topic: Decomposing hypotheses


Ken Roe (Jul 25 2018 at 16:46):

theorem test_split { P : Prop } { Q : Prop } { R : Prop } { S : Prop } :
    (P  (Q  R))  (Q  S)  (R  S)  (P  S) :=
begin
    intros, sorry
end

Is there a nice way to decompose the hypotheses to prove the above theorem? What should "sorry" be replaced with?

Reid Barton (Jul 25 2018 at 16:51):

tauto gets the job done in this case

Reid Barton (Jul 25 2018 at 16:52):

Manually, you could use cases, for example

    cases pqr with p qr,
    refine p, _⟩,
    cases qr with q r,
    { exact qs q },
    { exact rs r }

Ken Roe (Jul 25 2018 at 16:58):

Where can I find tauto? It is not in the standard libraries.

Reid Barton (Jul 25 2018 at 16:59):

It's in mathlib

Ken Roe (Jul 25 2018 at 18:10):

Now for a more complex example,

theorem test_split { P :   Prop } { Q :   Prop } { R :   Prop } { S :   Prop } :
    ( x, P x  (Q x  R x))  ( x, Q x  S x)  ( x, R x  S x)  ( x, P x  S x) :=
begin
    intros, sorry
end

After the intros, is there a nice way to decompose these hypotheses?

Patrick Massot (Jul 25 2018 at 18:14):

I'm not sure what you are looking for, but here is a short proof using tauto:

Patrick Massot (Jul 25 2018 at 18:14):

theorem test_split { P :   Prop } { Q :   Prop } { R :   Prop } { S :   Prop } :
    ( x, P x  (Q x  R x))  ( x, Q x  S x)  ( x, R x  S x)  ( x, P x  S x) :=
begin
    intros h h' h'' x,
    specialize h x,
    specialize h' x,
    specialize h'' x,
    tauto
end

Patrick Massot (Jul 25 2018 at 18:16):

I'm not sure we currently have any tactic that can guess the specialize steps.

Patrick Massot (Jul 25 2018 at 18:16):

If you really really want one, then the standard procedure is to hope Simon will pity you.

Simon Hudon (Jul 25 2018 at 18:36):

Haha! I'm pretty merciful though

Simon Hudon (Jul 25 2018 at 18:37):

Have you tried solve_by_elim?

Patrick Massot (Jul 25 2018 at 18:38):

It doesn't work

Patrick Massot (Jul 25 2018 at 18:42):

Btw Simon, how was your tauto lecture?

Simon Hudon (Jul 25 2018 at 18:45):

You can shrink the proof down to:

theorem test_split { P :   Prop } { Q :   Prop } { R :   Prop } { S :   Prop } :
    ( x, P x  (Q x  R x))  ( x, Q x  S x)  ( x, R x  S x)  ( x, P x  S x) :=
begin
    intros h h' h'' x,
    specialize h x,
    split; tauto,
end

Simon Hudon (Jul 25 2018 at 18:46):

I'm giving it tonight and I decided to talk about pi_instances after all. 5 minutes is so incredibly short :D

Patrick Massot (Jul 25 2018 at 18:47):

Did you prepare a heavily commented version of the source?

Simon Hudon (Jul 25 2018 at 18:53):

What I decided to do is write an instance for group and show how automation shrinks it. And then I mention that refine_struct is written in Lean

Mario Carneiro (Jul 26 2018 at 01:19):

rintro is a really nice way of doing all that

theorem test_split {P Q R S : Prop} :
  P ∧ (Q ∨ R) → (Q → S) → (R → S) → P ∧ S :=
begin
  rintro ⟨hp, hq | hr⟩ qs rs,
  { exact ⟨hp, qs hq⟩ },
  { exact ⟨hp, rs hr⟩ }
end

Last updated: Dec 20 2023 at 11:08 UTC