TL;DR
- 論理積
P ∧ Qはconstructorか⟨⟩で示し、仮定にあるときは.leftと.rightで取り出す。 - 論理和
P ∨ Qはleftかrightで示し、仮定にあるときはcasesで場合分けする。
内容
論理積
constructor を使うと、ゴール ⊢ P ∧ Q を ⊢ P と ⊢ Q の 2 つのゴールに分けられる。
example (P Q : Prop) (hp : P) (hq : Q) : P ∧ Q := by
constructor
· exact hp
· exact hq⟨⟩ を使うと、もっと短く書ける。
example (P Q : Prop) (hp : P) (hq : Q) : P ∧ Q := by
exact ⟨hp, hq⟩仮定に h : P ∧ Q があるときは、h.left で P を、h.right で Q を取り出せる。
example (P Q : Prop) (h : P ∧ Q) : P := by
exact h.left
example (P Q : Prop) (h : P ∧ Q) : Q := by
exact h.right論理和
ゴールが ⊢ P ∨ Q のとき、left タクティクを使うとゴールが ⊢ P に、right タクティクを使うと ⊢ Q に変わる。
example (P Q : Prop) (hp : P) : P ∨ Q := by
left
exact hpexample (P Q : Prop) (hq : Q) : P ∨ Q := by
right
exact hq仮定に h : P ∨ Q があるときに cases タクティクを使うと、 が成り立つ場合と が成り立つ場合の 2 つのゴールが作られ、それぞれで仮定を取り出せる。inl と inr は自動で付くゴールの名前である。
example (P Q : Prop) (h : P ∨ Q) : Q ∨ P := by
cases h with
| inl hp =>
right
exact hp
| inr hq =>
left
exact hqcase タクティクと組み合わせて、次のようにも書ける。
example (P Q : Prop) (h : P ∨ Q) : Q ∨ P := by
cases h
case inl hp =>
right
exact hp
case inr hq =>
left
exact hq