show_term
show_term
は、タクティクで作られた項を明示的に表示します。
タクティクは、表面的には「証明を行うためのツール」として振る舞いますが、実際には「示すべき命題に対して、その命題を型に持つような証明項を生成するプログラム」です。裏で生成されている項は普段ユーザからは隠されていますが、show_term
はそれを見えるようにします。
import Lean
example (n : Nat) : n + 0 = n := by
rfl
-- `show_term` で `rfl` が生成している具体的な項を表示
/-- info: Try this: Eq.refl (n + 0) -/
#guard_msgs in
example (n : Nat) : n + 0 = n := show_term by
rfl
by? 構文
by
を by?
に変えることでも、show_term
を呼び出すことができます。
/-- info: Try this: Eq.refl (n + 0) -/
#guard_msgs in
example (n : Nat) : n + 0 = n := by?
rfl
実際、by?
は show_term
に展開されるマクロです。
/-- `#expand` の入力に渡すための構文カテゴリ -/
syntax macro_stx := command <|> tactic <|> term
open Lean in
/-- マクロを展開するコマンド -/
elab "#expand " t:macro_stx : command => do
let t : Syntax := match t.raw with
| .node _ _ #[t] => t
| _ => t.raw
match ← Elab.liftMacroM <| Macro.expandMacro? t with
| none => logInfo m!"Not a macro"
| some t => logInfo m!"{t}"
/-- info: show_term by rfl -/
#guard_msgs in
#expand by? rfl