logic 設計
logic パッケージは、カーネルの等号計算を命題論理に変える。結合子をカーネルの定義として定義し、10 個の基本規則から自然演繹の規則を導出し、証明スクリプトが引用できる定理名のカタログを保持する。このページでは定義を示し、規則を導出し、このパッケージが信頼されなくてもこれらを実現できる理由を説明する。
設計目標
カーネルが知っているのは等号と選択だけである。ユーザーは 、、、、、 を通常の規則とともに使いたい。目標は、新たな権限を一切与えずにこれらを提供することである。すべての結合子は DefOK ゲートが受理する定義であり、すべての規則はカーネル規則を呼び出す MoonBit 関数である。このパッケージは何かを証明し損なうという意味では誤りうるが、偽の命題を証明することはできない。
数学的背景
定義としての結合子
QED は HOL Light の定義に従い、すべての結合子を等号に還元する。11 J. Harrison, HOL Light Tutorial, 論理定数の節。これらの定義は Andrews の型理論 Q0 に遡る。QED の選言は HOL Light のものと異なる。後述を参照。 を真を表す項 とする。プレリュードは次を定義する。
ここでプライム付きの名前は定義本体を展開済みのものを表し、各右辺が のみの閉項になるようにしている。各定義の読み方は次のとおりである。
- は REFL のインスタンスであるから真である。
- は、ブール値上の恒等述語が常に真の述語に等しいことを述べる。すなわち としたときの である。 自身が真でなければならなくなるため、標準モデルでは偽である。
- は、対 がどのような関数 によっても と区別できないことを述べる。これは と がともに真であるときに限り成り立つ。
- は である。 に を加えても何も変わらない。
- は である。
- は である。
基底項
prop_mk_and とその仲間は、定数の適用 ではなく、展開済みの右辺である基底形を返す。以下の規則は基底形に対して働く。カーネル規則が直接作用できるのは基底形だけだからである。定数が存在するのは、定義が記録され、引用でき、ユーザーが書く項の中で認識できるようにするためである。
設計判断
仮定せず導出する
このパッケージのすべての規則は導出である。以下の導出はコードが実際に行うものであり、各行がカーネル規則である。
真。 定義 から対称律で を得る。 は REFL であるから、EQ_MP により が得られる(logic_prop_truth_const_thm)。対称律自体も導出される。
証明から真との等式へ。 と から、DEDUCT_ANTISYM_RULE により が得られる。 自身が仮定である場合を除いて であり、仮定である場合も は証明可能なので取り除いても問題ない。この「EQT_INTRO」ステップによって命題が項の中に置かれる。
連言導入。 と から と を得る。新しい変数 に対して、
最後の行が である。ABS が適用できるのは が新しいからである。
連言除去。 の両辺に、MK_COMB と REFL で選択子 を適用し、BETA と TRANS で両辺を簡約する。
対称律と、 を用いた EQ_MP により が得られる。選択子 を使うと が得られる。
含意除去。 と から、対称律により 、EQ_MP により を得て、連言除去により を得る。
含意導入。 である から、 との連言導入により を得る。また仮定からの除去により を得る。すると
となり、仮定集合は である。結論は定義により である。logic_prop_imp_intro_thm は を要求する。存在しない仮定を解消するには、先に弱化が必要になる。
ex falso。 と任意の命題 に対し、 との MK_COMB と 2 回の BETA により 、したがって を得る。否定除去は、結論を とする含意除去である。
選言導入。 から、 を仮定し、これを に対して除去して を得、ex falso により を導き、 を解消する。
からの右導入は、 を と連言にしたうえで、使われていない を解消する。
選言除去は無い
プレリュードは を として定義する。導入は示したとおり導出できる。除去、すなわち 、、 から を推論することはできない。これには についての場合分け、つまり排中律 が必要になる。HOL では排中律は選択公理と外延性から従う(Diaconescu の定理)22 R. Diaconescu, “Axiom of choice and complementation”, Proc. AMS 51, 1975. HOL Light は class.ml でこの方法により EXCLUDED_MIDDLE を導出している。 が、カーネルは選択公理の定理を公開しておらず、このパッケージも排中律を導出しない。正当化できない規則を提供する代わりに、カタログには or_intro_l と or_intro_r があるが or_elim は無く、タクティク層には left と right があるが場合分けは無い。
結合子定数の信頼できる認識
問題。 ユーザーは別の意味を持つ and という名前の定数を宣言できる。prop_dest_and が and という定数のどんな適用も認識するなら、タクティクが任意の項を連言として扱ってしまいうる。
選択。 デストラクタは、構造的に検査される基底形を受け付ける。結合子定数の適用は、状態がその定数の正準な定義定理を(現在の同一性で)保持しているときに限り受け付ける。install_prop_prelude は、名前と型が正しいが定義を持たないプレースホルダ定数の上へのインストールを拒否する。
理由。 認識の誤りは健全性を損なわない。すべての規則はカーネルを通じてリプレイされるからである。しかしその場合、タクティクでの明確な失敗ではなく、リプレイ時の分かりにくい失敗が生じる。また仕様は、結合子の認識が定義に裏付けられることを要求している。
1 つのカタログ、2 つのモード
問題。 exact th と apply th は意味が異なる。exact は結論がゴールである定理を必要とし、apply は帰結がゴールである含意を必要とし、その前件を新たなゴールとして残す。名前を誤ったモードで黙って使えるようにすると、失敗が遅れるか、さらに悪いことに exact が静かに apply のように振る舞ってしまう。
選択。 各カタログ項目は exact_class と apply_class を記録する。exact は前者だけを、apply は後者だけを参照する。存在はするがあるモードでは使えない名前は KnownButUnavailable に解決され、タクティク層がそれを形状または apply の不一致として報告する。ローカルな仮定名は常にカタログ名より優先され、カタログ名にフォールバックすることはない。
理由。 この表はタクティク層、prover のコーパス、対応表、ドキュメントの唯一の情報源であり、ユーザーが書ける定理名がこれらの間でずれることはない。
エラーはカーネルのみから
カーネルのエラーコンストラクタは、カーネルの外では読み取り専用である。このパッケージが返す LogicError と SigError の値は、必要な形で失敗することが分かっている小さなカーネル操作を実行して得る。これによりエラーの語彙はカーネルが所有し続ける。その代償として、エラーは具体性に欠け、多くの補助関数の失敗が TypeMismatch や AlphaMismatch として現れる。
正しさと不変条件
- 健全性。 このパッケージが返すすべての
Thmはカーネル関数の結果であるから、カーネルの健全性の議論がそれをカバーする。上記の導出は、各規則が意図された用途について完全でもあることを示す。前提が規定の形をしていれば、必ず成功する。 - プレリュードの保存性。 6 つの定数は、閉じた右辺を持ち、型変数も循環も無い形で
DefOKに受理される。したがってプレリュードは空の理論の保存拡大である。 - 冪等性。
install_prop_prelude(install_prop_prelude(s))はinstall_prop_prelude(s)に等しい。既存の正準な定義はそのまま受理される。 - 正確なシーケント。 リプレイ補助関数は、仮定を α 同値を除いた集合として検査する。
logic_prop_strengthen_to_hypsは仮定を追加するだけなので、ゴールが持たない仮定を必要とする定理は、余分な仮定付きで受理されるのではなく拒否される。 - β 正規化は証明を生成する。
logic_beta_normalize_eqとlogic_normalize_prop_betaはカーネルの等式を段階的に構築する。項レベルのlogic_beta_nf_*関数は、そのような等式の右辺を返す。正規化は抽象の内部には入らず、上限がある(1 パスあたり 512 ステップ、深い形では 32 パス)。これは結合子のエンコーディングには十分である。
却下した代替案
- 結合子をカーネルのプリミティブにする。 カーネルとその健全性証明に規則が加わる。定義は信頼を一切増やさない。
- HOL Light の選言 。これを使うと排中律なしで除去が導出できるが、すべての選言の内部に命題上の全称量化子が入るという代償がある。プレリュードはより短いエンコーディングを使い、代わりにその限界を明示している。切り替えると、すべての選言項と、それらに基づくコーパスが変わる。
- モードを混在させたリゾルバ。
logic_prop_resolve_refはモードを区別せずに名前を解決する。これはテスト用に残してあり、タクティク層はモード別のリゾルバを使う。
境界
- このパッケージが証明するのは命題の事実だけである。定理ヘッダの束縛子のためにタクティク層が構築するもの以外に、量化子の規則は持たない。
- 選言除去も、排中律も、古典推論も無い。
- ユーザーの定理を保存しない。カタログはソースに固定されており、名前を追加するにはコードとテストを追加する必要がある。
- 権限を追加しない。このパッケージへの変更は、健全性ではなく有用性についてレビューされる。
- 式の解析も出力も行わない。項は parser が構築し、カーネルの構造的プリンタが出力する。