lean4による論理学の形式化
目標
- lean3で書いたlean-logicをlean4で書き直す ✅
- 完全性定理の証明をする ✅
- カット除去定理を証明する ✅
- 主に算術のメタ数学を展開するにあたって適切な記法やDSL、環境を整備する
-
などの略記を適当に行えるようにするa \le b \iff a = b \lor a < b -
SubTerm.Operator
,FirstOrder.SubFormula.Operator
を整備する
-
- 現状
Principia
のDSLは補題などの宣言をformulaSyntaxToExpr
などでExpr
に変換して扱っているが、これではformulaSyntaxToExpr
で対応していない記法は対応できないので、term
に変換してelabTerm
など汎用的な方法でExpr
に変換するようにする
-
- Gödelの不完全性定理を証明する
自動証明
proveTauto
やprove
に関するメモ
戦略
素朴な方法だがTait計算の証明探索をそのまま行う。論理式をその構造で分解して
メタプログラミング
証明探索に用いる論理式の推件は論理式SyntacticFormula L
のExpr
のリストG : List Q(SyntacticFormula $L)
として扱う(Lean4の証明ではtoQList G : Q(List (SyntacticFormula $L))
に変換して埋め込む)。論理式の導出規則において上の推件の論理式を改変することがあるが、改変を計算するために論理式の正規化(この呼称が適切なのかわからない)が必要になる。
正規化
Lean4やMathlibでは何らかの項の正規化のために以下のような関数を用いることが多いようである:
result : (e : Q($α)) → MetaM ((res : Q($α)) × Q($e = $res))
(例:Lean.Meta.Simp.Result
, Mathlib.Tactic.Ring.Result
およびMathlib.Tactic.Ring.eval
)
これらを参考にし同様のresultを定義した:FirstOrder.SubFormula.Meta.result
。加えて実際の計算では何らかの関数f : α → β
による計算の正規化が必要になるため以下のような関数
result : (e : Q($α)) → MetaM ((res : Q($β)) × Q(f $e = $res))
矛盾の検出h : G.elem q(p) = true
というLean4のメタ証明からQ(p ∈ toQList G)
を生成する必要があるが、これはQq.toQListOfElem {α : Q(Type u)} {a : Q($α)} : {l : List Q($α)} → l.elem a → Q($a ∈ $(toQList (u := u) l))
で行っている(これはもっと効率的な方法がある気がする)。
証明探索
hypothesisの証明のチェックではisImplementationDetail
でLean.MonadLCtx.getLCtx
からゴールの命題や表示されない命題を除外できる。
proveTauto
は量化子を考慮しない論理式の証明をおこなう。prove
は量化子にも対応しており、... by prove [t, u, ...]
のように書くことでt, u, ...
を存在量化子の証明に使用されるwitnessに指定できる
example : Valid “((!p → !q) → !p) → !p” := by proveTauto
example : Valid “!p ∧ !q ∧ !r ↔ !r ∧ !p ∧ !q” := by proveTauto
example (_ : Valid p) : Valid “!p ∨ !q” := by proveTauto
example : Valid (L := oring) “&0 < &1 → ∃ ∃ #0 < #1” := by prove
example (_ : Valid (L := oring) “0 < 4 + 9”) :
Valid (L := oring) “⊤ ∧ (∃ 0 < 4 + #0)” := by prove [T“9”]
実装はできたがあまり速くはない。
一階論理の完全性定理の証明
Tait計算の証明探索を用いて完全性定理を証明する。ただし証明探索は可算言語にのみ行える点に注意する。
証明の道筋
定理
-
を可算言語の論理式の有限集合とする。以下が成り立つ\Gamma -
の証明探索木がwell-foundedならば\Gamma は証明可能\Gamma FirstOrder.SearchTree.syntacticMainLemma_top
-
の証明探索木がwell-foundedでないならば\Gamma のすべてが成立しない構造が存在する\Gamma FirstOrder.SearchTree.semanticMainLemma_top
-
定理:可算言語の狭義の完全性定理
- 可算言語
の有限集合L が以下を満たすとき\Gamma は証明可能\Gamma - 任意の
の構造L について、あるM が存在して\psi \in \Gamma M \models \psi
- 任意の
FirstOrder.completenessₙ_of_encodable
定理:狭義の完全性定理
- 言語
の有限集合L が以下を満たすとき\Gamma は証明可能\Gamma - 任意の
の構造L について、あるM が存在して\psi \in \Gamma M \models \psi
- 任意の
FirstOrder.completenessₙ
定理:完全性定理
- 言語
の理論L , 文T について、\sigma ならばT \models \sigma T \vdash \sigma FirstOrder.completeness
参考文献
- Wolfram Pohlers, Proof Theory: The First Step into Impredicativity
- この本では可算言語の完全性定理を証明探索から直接証明しているが、ここでは狭義のもので十分なのでその方法を用いた
- その代わり言語の変換の意味論に関する諸定理やコンパクト性定理などを証明する必要がある
- 田中 一之, 計算理論と数理論理学
- 狭義の完全性定理からコンパクト性定理を用いて一般の完全性定理を証明するという方法はこれを参考にした
証明探索
リストの組み合わせ論的な?性質を証明するのが面倒だったため、証明方法は標準的でない。
論理式(ここではSyntacticFormula L
: 自然数の変項
FirstOrder.SearchTreeAt s
(\prec_s) を定義する
順序-
を自然数にエンコードしたものを\varphi, t と表記する\ulcorner \varphi \urcorner, \ulcorner t \urcorner - 自然数の3つ組ペアをエンコードした自然数を
と表記する\braket{n, m, i}
順序$\Delta \prec_s \Gamma$の定義
-
かつR(\vec v) \in \Gamma のとき\lnot R(\vec v) \notin \Gamma
-
かつ\lnot R(\vec v) \in \Gamma のときR(\vec v) \notin \Gamma
-
のとき\bot \in \Gamma
-
のとき\varphi \land \psi \in \Gamma
-
のとき\varphi \lor \psi \in \Gamma
-
のとき(\forall x) \varphi(x) \in \Gamma - ただし
はv_\Gamma に登場する変数の最大値\Gamma の自然数とする+1
- ただし
-
のとき(\exists x) \varphi(x) \in \Gamma
-
を満たすようなs = \braket{\ulcorner \varphi \urcorner, \ulcorner t \urcorner, i} が存在しないとき\varphi \in \Gamma, t
FirstOrder.SearchTree
(\prec) を定義する
順序
lean4-logicの証明系のDSLのためにまずかんたんなモデルの上で試作をした。