show .. from

show T from e は、型 T の項 e を表す構文です。項に対して型 T を明示することができます。

-- とても単純な使用例
#check show Nat from 1

-- `#eval` コマンドに式を渡す際に、期待される型を明示するために show を用いている例
#eval show IO Unit from do
  IO.println "Hello, world!"
  IO.println "Goodbye, world!"

また、Lean においては命題 P : Prop は型なので、命題 P の証明を show P from ... の形で構成することができます。

example (P : Prop) (h : P) : P :=
  show P from h

よく似た構文を持つものとして、show タクティクがあります。

用途

show .. from 構文を使用すると、have タクティクのように補題を用意することができますが、have と違って補題に名前がつかず、使い捨てになります。たとえば rw タクティクに渡すために一度だけ使いたい補題があるときに有用です。

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]

また証明項のところに メタ変数(metavariable) 1を配置すると、証明を後回しにすることができます。

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
1

頭に ? がついている変数のこと。