Zulip Chat Archive

Stream: Is there code for X?

Topic: Destruct multiple disjunctions


Adam Topaz (Oct 08 2020 at 15:49):

Suppose I have a number of disjunctions (or some other inductive type) are hypotheses in my context. Is there a tactic that will case split on all of them and give the appropriate number of subgoals? Is there some rcases magic that will do this?

Here is a silly example:

import tactic

variables (p1 p2 q1 q2 c11 c12 c21 c22 : Prop)
  (h11 : p1  q1  c11)
  (h12 : p1  q2  c12)
  (h21 : p2  q1  c21)
  (h22 : p2  q2  c22)

include h11 h12 h21 h22

example : p1  p2  q1  q2  c11  c12  c21  c22 :=
begin
  intros h1 h2,
  cases h1,
  { cases h2,
    { left, finish [h11] },
    { right, left, finish [h12] }},
  { cases h2,
    { right, right, left, finish [h21] },
    { right, right, right, finish [h22] }},
end

I would be much happier if I didn't have to write cases h2 twice.

Adam Topaz (Oct 08 2020 at 15:52):

It would be nice if, in this case, I could write something along the lines of

  rcases [h1,h2] with [h1|h1,h2|h2],

Shing Tak Lam (Oct 08 2020 at 16:01):

example : p1  p2  q1  q2  c11  c12  c21  c22 :=
begin
  rintros (h1 | h1) (h2 | h2),
  -- 4 goals here
  all_goals {finish}
end

Adam Topaz (Oct 08 2020 at 16:01):

okay, sure that works for this example. But my actual assumptions are a bit more complicated than this.

Reid Barton (Oct 08 2020 at 16:02):

rcases h1 with h1 | h1; rcases h2 with h2 | h2,

Adam Topaz (Oct 08 2020 at 16:03):

Yeah that's exactly what I'm looking for. Didn't think of using ; thanks!

Floris van Doorn (Oct 08 2020 at 21:40):

Another way to do this:

obtain hp1|hp2, hq1|hq12 : _  _ := h1, h2⟩,

Adam Topaz (Oct 08 2020 at 21:43):

That's a nice trick!

Mario Carneiro (Oct 11 2020 at 07:15):

This is now supported as of #4569:

example : p1  p2  q1  q2  c11  c12  c21  c22 :=
begin
  intros h1 h2,
  rcases e1, e2 with h1 | h1, h2 | h2⟩,
end
example : p1  p2  q1  q2  c11  c12  c21  c22 :=
begin
  intros h1 h2,
  obtain h1 | h1, h2 | h2 := e1, e2⟩,
end

in addition to the already supported rintros (h1 | h1) (h2 | h2), form that was mentioned


Last updated: Dec 20 2023 at 11:08 UTC