構文ガイド
- ステータス:active
- 対象読者:ユーザー、コントリビューター
- 権威:現在リリース済みの入力面に関するユーザー向け構文リファレンス。QED 形式仕様、現在のコード/テスト、ユーザーマニュアルに従属する
- 範囲:現在の theorem-script の表層構文、CLI 向けのファイル形式、サポートされる証明ステップ、既知の未サポート形式
- 最終レビュー:2026-04-20
本書は、QED が現在提供しているユーザー入力構文のクイックリファレンスである。
本書が答えるのは次の 1 点のみである。src/cmd が現在どのような定理スクリプトを受け付けるか。機能の境界、サポート表、失敗の意味論、実装契約については、ユーザーマニュアルが引き続き主要な入口である。
クイックスタート
現在のコマンドラインのエントリポイントは次のとおりである。
moon run src/cmd <file>
moon run src/cmd -- -d <file>
moon run src/cmd -- --no-warn <file>
-d は結論の要約全体を出力する。--no-warn は、警告のみでエラーがない場合に成功の終了コードを返す。moon run 経由で起動する場合は、-- を使って残りの引数を QED CLI に転送する。スタンドアロンの実行ファイルにコンパイルした後は、qed-cmd -d --no-warn <file> を直接実行できる。
入力は定理スクリプトファイルであり、例えば次のようなものである。
theorem truth_file : ⊢ T := by exact truth
リポジトリ内の実行可能な例:
examples/truth_file.qedexamples/demo_and.qedexamples/and_comm.qedexamples/multi_theorems.qedexamples/multi_with_hole.qedexamples/bad_branch.qedexamples/unfinished_branch.qed
リポジトリのルートには prelude/ もあり、直接実行できる定理アセットファイルを収めている。これらは実行可能なスクリプトであり、現在の定理名カタログの公開サーフェスではない。
ファイルの形
現在提供されている定理スクリプトの形は次のとおりである。
theorem <name> [(binder...)] : <goal> := by <steps>
ファイルに複数の定理が含まれる場合は、先行する各定理ブロックを小文字の qed で終える。
theorem t1 : ⊢ T := by exact truth
qed
theorem t2 : ⊢ T := by exact truth
qed
ここで、
<name>は定理名である。[(binder...)]は現在、定理ヘッダ束縛子を 0 個以上サポートする。<goal>はシーケントである。<steps>は証明ステップであり、1 行の逐次形式、または改行区切りのブロック形式で書く。
既存の例との互換性のため、単一定理のファイルでは末尾の qed を省略できる。複数定理のファイルでは、次のトップレベルの theorem の前に、先行する各定理の後ろに qed が必要である。
定理ヘッダ
定理名
最小の例:
theorem truth_file : ⊢ T := by exact truth
定理ヘッダ束縛子
現在提供されている束縛子の形式は次のとおりである。
(x : bool)
例えば次のとおりである。
theorem id_bool (x : bool) : ⊢ x -> x := by
intro h
exact h
qed
現在のドキュメントと例において、ファイル優先で最も安全な使い方は、bool の束縛子から始めることである。
現在サポートされる量化ゴール
次のような素の forall 定理ゴールは、ゴール専用の糖衣構文として受理されるようになった。
theorem quant_raw_intro_ok : ⊢ forall (x : bool), x -> x := by
intro h
exact h
qed
括弧付きの形も受理される。
theorem quant_raw_intro_paren_ok : ⊢ (forall (x : bool), x -> x) := by
intro h
exact h
qed
言い換えると、
- 定理ヘッダ束縛子
(x : bool)と、素のforall/∀定理ゴールは、いずれも現在提供されている量化子向けのユーザー構文の一部である。 - 素の
forall (x : A), body/∀ (x : A), bodyは、定理スクリプトのゴール /parse_goalのエントリポイントでのみ受理される。項レベルの構文ではない。 - 素の
forall経路は現在ゴールの糖衣構文にすぎない。同じローワリング / リプレイ / CLI 診断の契約に従い、カーネルの新たな量化子の権威を導入しない。
ゴールの形
現在提供されているサーフェスはシーケントのゴールを用いる。
⊢ goal
A ⊢ B
A, B ⊢ goal
README と examples/ にある最小の実行可能な例は、主に次を用いる。
⊢ T⊢ x -> x⊢ x -> x ∧ x⊢ x -> x ∨ x
CLI を初めて使う場合は、T、F、定理ヘッダ束縛子を使った、状態を必要としない例から始めるのが最も安全である。
証明ステップ
現在提供されているステップは次のものだけである。
introexactapplyassumptionsplitleftrighthole
intro
intro h
現在のゴールが A -> B のとき、ローカルの仮定を導入し、後件の証明に進む。
exact
exact h
exact truth
現在のゴールを直接閉じる。
apply
apply and_elim_l
含意に裏付けられた定理、またはローカルの含意の仮定を現在のゴールに適用し、新たなサブゴールを生成する。
assumption
assumption
現在のローカルの仮定の中から、現在のゴールに一致する証拠を探す。
split
逐次形式:
split
構造化分岐形式:
split { exact h } { exact h }
left / right
逐次形式:
left
right
構造化分岐形式:
left { exact h }
right { right { hole h1 } }
hole
hole
hole h1
hole は成功を偽装しない。現在は構造化された未完了の結果を返す。
逐次ブロックと構造化分岐ブロック
<steps> は現在、1 行で書ける。
theorem t1 (x : bool) : ⊢ x -> x := by intro h; exact h
あるいは複数行のブロックとして書ける。
theorem t1 (x : bool) : ⊢ x -> x := by
intro h
exact h
qed
ステップが明示的な分岐を必要とする場合、現在は最小限の構造化分岐ブロックがサポートされている。
theorem demo_and (x : bool) : ⊢ x -> x ∧ x := by
intro h
split { exact h } { exact h }
qed
古典命題論理に近い例:
theorem and_comm (p : bool) (q : bool) : ⊢ p ∧ q -> q ∧ p := by
intro h
split { exact and_elim_r } { exact and_elim_l }
qed
theorem bad_branch (x : bool) : ⊢ x -> x ∨ x := by
intro h
left { exact truth }
qed
現在の主な制限事項
- 現在の
src/cmdのワークフローはファイル優先である。単一定理のファイルでは末尾のqedを省略でき、複数定理のファイルではqedを区切りとして用いる。 - 直接実行できる公開例には、
examples/にある既存のスクリプトを優先して用いるのが望ましい。 - 定理ヘッダ束縛子は提供済みである。素の
forall定理ゴールはゴール専用の糖衣構文としてサポートされるが、項レベルの形式は依然としてサポートされない。 - 未サポートのパスはフェイルクローズでなければならず、定理の成功を偽装してはならない。
holeは未完了を返し、定理の成功は返さない。
出力の形
現在の CLI の出力は 3 種類に分かれる。
- 成功: 既定では定理ごとに 1 行
ok <theorem_name>。-dを付けると出力はok <theorem_name>: <conclusion_summary>となる。 - 失敗:
error[kind] ... - 未完了:
warning[unfinished] ...。定理の権威は生まれないが、後続の定理の検査は継続される。
moon run src/cmd -- -d --no-warn <file> の -- は moon run の引数転送にのみ属する。スタンドアロンの実行ファイルでは不要なので、qed-cmd -d --no-warn <file> を直接実行すること。
失敗フィールド、未完了フィールド、および安定した例の全容については、ユーザーマニュアルを参照のこと。