rcases

rcasescases をパターンに従って再帰的(recursive)に適用します。cases の上位互換という立ち位置です。

variable (P Q R : Prop)

example : P ∨ Q → (P → R) → (Q → R) → R := by
  intro h hPR hQR

  -- 場合分けをする
  rcases h with hP | hQ
  · apply hPR hP
  · apply hQR hQ

-- 論理積 ∧ に対しても使える
example : P ∧ Q → Q ∧ P := by
  -- `h: P ∧ Q` と仮定する
  intro h

  -- `h: P ∧ Q` を `hP: P` と `hQ: Q` に分解する
  rcases h with ⟨hP, hQ⟩

  -- `Q ∧ P` を証明する
  exact ⟨hQ, hP⟩

rcases は一般には ⟨x₁, x₂, ...⟩ | ⟨y₁, y₂, ...⟩ | ... という記法で帰納型の分解が可能です。

inductive Sample where
  | foo (x y : Nat)
  | bar (z : String)

example (s : Sample) : True := by
  rcases s with ⟨x, y⟩ | ⟨z⟩

  case foo =>
    -- `x`, `y` が取り出せている
    guard_hyp x : Nat
    guard_hyp y : Nat

    trivial

  case bar =>
    -- `z` が取り出せている
    guard_hyp z : String

    trivial

rfl パターン

rcases のパターンには rfl も使えます。等式の仮定 h : a = b に対して rcases h with rfl と書くと、ba に書き変わります。つまり、rw タクティクで書き換える手間が省けます。

example {a b c : Nat} (h : a = b) : a + c = b + c := by
  rcases h with rfl

  -- `b` が `a` に書き変わる
  guard_target =ₛ a + c = a + c

  rfl

example {a b : Nat} (h : a = b ∧ b = 3) : a = 3 := by
  rcases h with ⟨rfl, hb⟩

  -- `b` が `a` に書き変わる
  guard_target =ₛ a = 3

  exact hb