show

show はこれから示すことを宣言するタクティクです.

  • show ... from という形で使う場合と,
  • show 単独で使う場合と

少なくとも2つのパターンがあります.

使い捨ての補題を作る

show ... from は,have のように補題を用意することができますが,have と違って補題に名前がつかず,使い捨てになります.たとえば rw に渡すために一度だけ使いたい補題があるとして,それを have で示すのは大げさすぎると感じたときに使用します.

variable (a b x : ℚ)

example (f : ℚ → ℕ) : f ((a + b) ^ 2) = f (a ^ 2 + 2 * a * b + b ^ 2) := by
  -- `have` をつかって補題を用意しなくても,
  -- `show ... from` で無名の証明を構成してそれを `rw` に渡すことができる
  rw [show (a + b) ^ 2 = a ^ 2 + 2 * a * b + b ^ 2 from by ring]

この話は show と直接関係はありませんが,証明項のところに,頭に ? をつけた変数(メタ変数)を配置すると,証明を後回しにすることができます.

example (h : a * x < b) (ha : a > 0) : x < b / a := by
  -- `b / a` を `r` とおく
  set r := b / a with hr

  -- ここで `b = a * r` というまだ示していない補題に基づいて `h` を書き換える
  rw [show b = a * r from ?lem] at h
  exact (mul_lt_mul_left ha).mp h

  -- 本来証明項が入るべきところに `?lem` をおいたので,
  -- `case lem` でフォーカスできる
  case lem =>
    -- `r` の定義を展開する
    rw [hr]

    -- 分母を払う
    field_simp

ゴールの状態を確認する

show 単独で使った場合,ゴールが特定の命題に等しいかどうかチェックします.show P は, ゴールの中に ⊢ P (に定義上等しい命題)が存在しないときにエラーになり,存在すればそれをメインのゴールにします.たとえば,証明中にこれから示すべきことを明示し,コードを読みやすくする目的で使うことができます.

variable (P Q : Prop)

example (hP : P) (hQ : Q) : P ∧ Q := by
  constructor
  · show P
    exact hP
  · show Q
    exact hQ

ゴールを定義上等しい命題に変形するために使用することもできます.

def factorial : Nat → Nat
  | 0 => 1
  | n + 1 => (n + 1) * factorial n

example : factorial 3 = 6 := by
  -- 定義上等しいのでゴールを変形できる
  show 3 * factorial 2 = 6

  -- 定義上等しいのでゴールを変形できる
  show 3 * (2 * factorial 1) = 6

  rfl