基本概念と実装

混合コンテキストが、次のレベルで提供される。

  1. ライブラリ
  2. パッケージ
  3. モジュール
  4. 名前空間
  5. セクション
  6. 関数・定理(のボディブロック)
  7. 入れ子ブロック(by, doなど)

これらの組織化機構〈organizing mechanism / feature〉は独立ではないし、一様でもない。構成される混合コンテキストは恣意的に区切られた〈fenced〉テレスコープになる。

コンテキスト/テレスコープの基本は名前の集合で、名前は:

  1. 宣言定数名: 代入〈割り当て〉ができない型付きの名前、axiom で導入。
  2. イミュータブル変数名: 代入〈割り当て〉が一度だけできる型付きの名前 variable で導入。引数リストでも導入される。
  3. 割り当て済み名前: イミュータブル変数名に割り当てを行ったもの。変更はできない。def, let, have で導入。
  4. ミュータブル変数名: 値の変更ができる名前、let mut で導入。

名前〈ラベル〉の型〈プロファイル〉宣言(命題宣言含む)と、型宣言済みの名前への項〈ボディ〉割り当てがテレスコープの中心。他に、定義的等式と項書き換え規則がコンテキストに入る。

関数のコンテキスト〈環境〉と引数、定理のコンテキストと前提の境界は曖昧で、どうとでも移動できる。構文的正規形として、コンテキストを最小化したパック形式〈カリー化形式〉と、コンテキストを最大化したアンパック形式〈アンカリー化形式〉がある。

名前達は、名前空間階層のなかに配置される。名前構造の操作に、open, export, namespace, section が使われる。Cリンケージとの名前のやり取りには、@[extern "名前"]、@[export 名前]。importはモジュールの操作だが、そのモジュールで定義された/取り込まれた名前の操作になる。

特定の機能性を持つ名前(関数名、定理名、型名/命題名)を探すのは困難。この困難が大きな障害になっている。

次は名付けの例:

namespace MyArith

def one_plus_one_equals_two : Prop := 1 + 1 = 2
def one_plus_one_equals_three : Prop := 1 + 1 = 3
def x_plus_y_equals_ten (x y :Nat) : Prop := x + y = 10

end MyArith
#check MyArith.one_plus_one_equals_two
#check MyArith.x_plus_y_equals_ten

関数や定理は、名前で呼び出して使う。呼び出し時に、実引数を渡すかも知れない。関数を呼び出せば、戻り値と戻り型〈return type〉が得られる。得られた戻り値は名前に束縛されるかも知れない〈let, have〉。

宣言定数〈公理〉や関数〈定理〉から作られる項とは別に、コマンドとコマンドスクリプトがある。証明生成コマンドには、FRコマンド〈forward reasoning command〉とBRコマンド〈backward reasoning command〉がある。BRコマンドをタクティクとも呼ぶ。

リーズニングコマンドが相手にするのは、判断と質問〈問題 | ゴール〉が混じった証明状態〈proof state〉。コマンドは証明状態を遷移させる。証明状態の時間的遷移を空間的に描いた図をリーズニング図と呼ぶ。シーケント計算の証明図はリーズニング図である。

リーズニング図は、項を図示したストリング図や横棒図とは別物。しばしば混同される、無理もないが。

証明状態を遷移させるプログラムをリーズニング・コマンドスクリプトと言う。特にBRコマンド=タクティクから作ったスクリプトはタクティク・スクリプト。

判断と質問が混じった証明状態を混合証明状態という。混合証明状態の遷移を記述した図を混合リーズニング図という。混合リーズニング図はツリーとは限らない。

リーズニング図は180度回転する反転〈inversion | conversse〉がある。反転は双対性と関係がある。

項の図示とリーズニングの図示は混同される。その理由のひとつは、項の図はリーズニング図に変換して埋め込めるから。項のスクリプトのノードは、post-composition, pre-composition としてリーズニングコマンドになり、図のリーズニングノードになる。