cases
Summary
cases
is a general-purpose tactic for “deconstructing” hypotheses. If h
is a hypothesis which somehow “bundles up” two pieces of information, then cases h with h1 h2
will make hypothesis h
vanish and will replace it with the two “components” which made the proof of h
in the first place.
Examples
The way to make a proof of
P ∧ Q
is to use a proof ofP
and a proof ofQ
. If you have a hypothesish : P ∧ Q
, thencases h
will delete the hypothesis and replace it with hypothesesh_left : P
andh_right : Q
. These are not the best names for hypotheses; better to typecases h with hP hQ
.The way to make a proof of
P ↔ Q
is to proveP → Q
andQ → P
. So faced withh : P ↔ Q
one thing you can do iscases h with hPQ hQP
which removesh
and replaces it withhPQ: P → Q
andhQP: Q → P
. Note however that this might not be the best way to proceed; whilst you canapply hPQ
andhQP
, you lose the ability to rewriteh
withrw h
. If you really need to keep a copy ofh
around, you could always tryhave h2 := h, cases h with hPQ hQP
.There are two ways to make a proof of
P ∨ Q
. You either use a proof ofP
, or a proof ofQ
. So ifh : P ∨ Q
thencases h with hP hQ
has a different effect to the first two examples; after the tactic you will be left with two goals, one with a new hypothesishP : P
and the other withhQ : Q
. One way of understanding why this happens is that the inductive typeor
has two constructors, whereasand
only has one.There are two ways to make a natural number
n
. Every natural number is either0
orsucc(m)
for some natural numberm
. So ifn : ℕ
thencases n with m
gives two goals; one wheren
is replaced by0
and the other where it is replaced bysucc(m)
. Note that this is a strictly weaker version of theinduction
tactic, becausecases
does not give us the inductive hypothesis.If you have a hypothesis
h : ∃ a, a^3 + a = 37
thencases h with x hx
will give you a numberx
and a proofhx : x^3 + x = 37
.
Further notes
Note that ∧
is right associative: P ∧ Q ∧ R
means ``P ∧ (Q ∧ R)
. So if h : P ∧ Q ∧ R
then cases h with h1 h2
will give you h1 : P
and h2 : Q ∧ R
and then you have to do cases h2
to get to the proofs of Q
and R
. The syntax cases h with h1 h2 h3
doesn’t work (h3
just gets ignored). A more refined version of the cases
tactic is the rcases
tactic (although the syntax is slightly different; you need to use pointy brackets ⟨,⟩
with rcases
). For example if h : P ∧ Q ∧ R
then you can do rcases h with ⟨hP, hQ, hR⟩
.