Gödelの第一不完全性定理の形式的証明をする
はじめに
これは定理証明支援系 Advent Calendar 2023の記事です。参加してくださった皆さんありがとうございます。
証明支援言語であるLean4を用いてlean4-logicというプロジェクトでGödelの第一不完全性定理の証明を行ったので、その解説を書きます。数理論理学や不完全性定理の詳しい解説はしないので、適切な教科書を参考にしてください。ある程度Lean4の構文を知っているとわかりやすいかもしれません。
背景
他の重要な定理と比べて第一不完全性定理のコンピュータ等による形式的証明の歴史はかなり古く、おそらく最古のものはNqthmを使用した第一不完全性の証明で、1986年にはすでに形式化されています[1]。また2005年にはCoqによる形式化[2]、2009年にHOL Lightによる形式化が行われています。第二不完全性定理の証明の形式化は最近になって2013年にIsabelleによって(おそらく初めて?)形式化されました[3]。
Leanによる一階論理やその完全性定理、連続体仮説の独立性の証明の形式化はすでになされていますが[4]、Missing theorems from Freek Wiedijk's list of 100 theoremsの記述によると2023年時点では不完全性定理はまだ証明されていないようなので、おそらく最初の例でしょう。
不完全性定理には様々な表現方法がありますが、現代的な形では以下のように表現されることが多いようです[5]。
第一不完全性定理:
を含む計算可能で \mathbf{PA} -無矛盾な理論 \omega において、 T から証明も反証もできない文が存在する。 T
第二不完全性定理:
を含む計算可能で無矛盾な理論 \mathbf{PA} において、その無矛盾性を示す文は証明も反証もできない。 T
lean4-logicでは上に述べたものより強い以下の定理を証明します。
第一不完全性定理':
を含む計算可能で \mathbf{PA}^- -健全な理論 \Sigma_1 において、 T から証明も反証もできない文が存在する。 T
基礎
まず論理式や証明や意味論と言った基礎的な道具を揃える必要があります。Lean4の標準的なライブラリであるmathlib4でも論理式や意味論などの概念は定義されていますが[6]、後述するようにTait計算を証明の基礎に用いたかったため、独自に定義します。
項・論理式
一階論理の論理式を定義する方法は色々ありますが、De Bruijn indexによる方法がhydra-battles(Coq)やflypitch(Lean)などでは採用されています。lean4-logicでもこの方法で形式化しています[7]。
言語FirstOrder.Language
はアリティL.func k
と関係記号L.rel k
の組です。
structure Language where
func : Nat → Type u
rel : Nat → Type u
型μ
の変数を持つ言語L
の項Term L μ
は以下のように定義されます[8]。
inductive Subterm (L : Language) (μ : Type v) (n : ℕ)
| bvar : Fin n → Subterm L μ n
| fvar : μ → Subterm L μ n
| func {arity: ℕ} :
L.func arity → (Fin arity → Subterm L μ n) → Subterm L μ n
abbrev Term (L : Language) (μ : Type v) := Subterm L μ 0
ここでSubterm.bvar x : Subterm L μ n
はx : Fin n
番目の束縛変数、Subterm.fvar x : Subterm L μ n
はx : μ
の自由変数を意味します(すなわち、Subterm L μ n
は型μ
の自由変数と最大n
個の束縛変数を持つ項を意味します)。Subterm.bvar x
は#x
, Subterm.fvar x
は&x
と略記されます。
同様に論理式Formula L μ
は以下のように定義されます。[9]
inductive Subformula (L : Language.{u}) (μ : Type v) :
ℕ → Type (max u v) where
| verum {n} : Subformula L μ n
| falsum {n} : Subformula L μ n
| rel {n} {arity : ℕ} :
L.rel arity → (Fin arity → Subterm L μ n) → Subformula L μ n
| nrel {n} {arity : ℕ} :
L.rel arity → (Fin arity → Subterm L μ n) → Subformula L μ n
| and {n} : Subformula L μ n → Subformula L μ n → Subformula L μ n
| or {n} : Subformula L μ n → Subformula L μ n → Subformula L μ n
| all {n} : Subformula L μ (n + 1) → Subformula L μ n
| ex {n} : Subformula L μ (n + 1) → Subformula L μ n
abbrev Formula (L : Language) (μ : Type v) := Subformula L μ 0
一般的な論理学の用語では、これは
- アリティ
の関係記号k 、r \in L 個の項k についてt_0,t_1,...,t_{k-1} は論理式であるr(t_0,t_1,...,t_{k-1}), r^{-}(t_0,t_1,...,t_{k-1}) -
は論理式である。\top, \bot -
が論理式であるとき、\varphi, \psi は論理式である\varphi \land \psi, \varphi \lor \psi, \forall x. \varphi, \exists x. \varphi
論理式の否定を示す論理式
\lnot r(t_0,t_1,...,t_{k-1}) \coloneqq r^{-}(t_0,t_1,...,t_{k-1}) \lnot r^{-}(t_0,t_1,...,t_{k-1}) \coloneqq r(t_0,t_1,...,t_{k-1}) \lnot \top \coloneqq \bot \lnot \bot \coloneqq \top \lnot (\varphi \land \psi) \coloneqq (\lnot\varphi) \lor (\lnot\psi) \lnot (\varphi \lor \psi) \coloneqq (\lnot\varphi) \land (\lnot\psi) \lnot (\forall x. \varphi) \coloneqq \exists x. (\lnot \varphi) \lnot (\exists x. \varphi) \coloneqq \forall x. (\lnot \varphi)
古典論理において論理式は
分かりやすさのため論理式の記法を定義します(→
や∧
などはLean4の予約語で使えないため似た文字を用いています)。
通常の記法 | lean4-logicにおける記法 | |
---|---|---|
真 | ⊤ |
|
偽 | ⊥ |
|
論理積 | p ⋏ q |
|
論理和 | p ⋎ q |
|
否定 | ~p |
|
含意 | p ⟶ q |
|
同値 | p ⟷ q |
|
全称量化子 | ∀' |
|
存在量化子 | ∃' |
またLean4の強力なメタプログラミング能力を用いて、“ ... ”
の記法で自然に論理式が書けるようにしました。例えば<
の推移律を表す文を“∀ ∀ ∀ (#2 < #1 → #1 < #0 → #2 < #0)”
のように書くことが可能です。
Tait計算
Tait計算はGentzenの推件計算に似た証明体系で、以下の推論規則からなります。
- (AxL):アリティ
の関係記号k 、r 個の項k についてt_0,t_1,...,t_{k-1} \vdash_\mathsf{T} r(t_0,t_1,...,t_{k-1}), r^{-}(t_0,t_1,...,t_{k-1}), \Delta - (
):\top \vdash_\mathsf{T} \top, \Delta - (
):\land かつ\vdash_\mathsf{T} \varphi, \Delta ならば\vdash_\mathsf{T} \psi, \Delta \vdash_\mathsf{T} \varphi \land \psi, \Delta - (
):\lor ならば\vdash_\mathsf{T} \varphi, \psi, \Delta \vdash_\mathsf{T} \varphi \lor \psi, \Delta - (
):\forall ならば\vdash_\mathsf{T} \varphi(x), \Delta . ただし変数記号\vdash_\mathsf{T} \forall x. \varphi(x), \Delta はx に登場しないとする\Delta - (
):\exists ならば\vdash_\mathsf{T} \varphi(t), \Delta \vdash_\mathsf{T} \exists x. \varphi(x), \Delta - (Cut):
かつ\vdash_\mathsf{T} \varphi, \Delta のとき\vdash_\mathsf{T} \lnot\varphi, \Delta \vdash_\mathsf{T} \Delta
Tait計算が優れているのは推論規則が少ないことです。Gentzenの推件計算では
証明体系の形式化においては『ただし変数記号
-
を、\varphi^+ に登場する自由変数\varphi をインクリメントした論理式とする(例えばv_0, v_1, ... )。また(v_0 < v_1 + v_2)^+ = (v_1 < v_2 + v_3) とする。\Delta^+ \coloneqq \{\varphi^+ | \varphi \in \Delta\} -
を、束縛変数\mathsf{fr}\varphi を自由変数x に変換し、自由変数v_0 をインクリメントした論理式とする(例えばv_0, v_1, ... )\mathsf{fr}(x \cdot v_0 < v_1) = (v_0 \cdot v_1 < v_2) - 以下の推論規則を(
)の代わりに導入する:\forall -
ならば\vdash_\mathsf{T} \mathsf{fr}\varphi, \Delta^+ \vdash_\mathsf{T} \forall x. \varphi, \Delta
-
inductive DerivationCR (P : SyntacticFormula L → Prop) :
Sequent L → Type u
| axL : ∀ (Δ : Sequent L) {k} (r : L.rel k) (v : Fin k → SyntacticTerm L),
rel r v ∈ Δ → nrel r v ∈ Δ → DerivationCR P Δ
| verum : ∀ (Δ : Sequent L), ⊤ ∈ Δ → DerivationCR P Δ
| or : ∀ (Δ : Sequent L) (p q : SyntacticFormula L),
DerivationCR P (insert p $ insert q Δ) →
DerivationCR P (insert (p ⋎ q) Δ)
| and : ∀ (Δ : Sequent L) (p q : SyntacticFormula L),
DerivationCR P (insert p Δ) →
DerivationCR P (insert q Δ) →
DerivationCR P (insert (p ⋏ q) Δ)
| all : ∀ (Δ : Sequent L) (p : SyntacticSubformula L 1),
DerivationCR P (insert (Rew.free.hom p) (shifts Δ)) →
DerivationCR P (insert (∀' p) Δ)
| ex : ∀ (Δ : Sequent L) (t : SyntacticTerm L) (p : SyntacticSubformula L 1),
DerivationCR P (insert ([→ t].hom p) Δ) →
DerivationCR P (insert (∃' p) Δ)
| cut : ∀ (Δ Γ : Sequent L) (p : SyntacticFormula L), P p →
DerivationCR P (insert p Δ) → DerivationCR P (insert (~p) Γ) →
DerivationCR P (Δ ∪ Γ)
SyntacticTerm
, SyntacticFormula
は自由変数が
(上の形式化においてP : SyntacticFormula L → Prop
のパラメータを用いているのはカット除去定理の証明のために(Cut)の使用が制限されたTait計算が必要だからです)
理論
structure DerivationCRWA (P : SyntacticFormula L → Prop) (T : Theory L) (Δ : Sequent L) where
leftHand : Finset (Sentence L)
hleftHand : ↑leftHand ⊆ (~·) '' T
derivation : ⊢ᶜ[P] Δ ∪ (leftHand.image Rew.emb.hom)
scoped notation :45 T " ⊢ᶜ[" P "] " Γ:45 => DerivationCRWA P T Γ
意味論
言語L
のM
上の構造s : Structure L M
は関数記号f
の解釈s.func f : (Fin k → M) → M
と関係記号r
の解釈s.rel r : (Fin k → M) → Prop
の組です。
@[ext] class Structure (L : Language) (M : Type*) where
func : ⦃k : ℕ⦄ → L.func k → (Fin k → M) → M
rel : ⦃k : ℕ⦄ → L.rel k → (Fin k → M) → Prop
これはL
, M
の型クラスとして定義されています。よく言語
項の解釈Subterm.val
を定義したあと、Tarskiの真理定義にしたがって論理式の解釈を定義します。
def Eval' (s : Structure L M) (ε : μ → M) :
∀ {n}, (Fin n → M) → Subformula L μ n → Prop
| _, _, ⊤ => True
| _, _, ⊥ => False
| _, e, rel p v => s.rel p (fun i => Subterm.val s e ε (v i))
| _, e, nrel p v => ¬s.rel p (fun i => Subterm.val s e ε (v i))
| _, e, p ⋏ q => p.Eval' s ε e ∧ q.Eval' s ε e
| _, e, p ⋎ q => p.Eval' s ε e ∨ q.Eval' s ε e
| _, e, ∀' p => ∀ x : M, (p.Eval' s ε (x :> e))
| _, e, ∃' p => ∃ x : M, (p.Eval' s ε (x :> e))
等号について
この体系では等号の記号が言語に含まれることを必ずしも要求していませんでした。また推論規則にも等号の推論規則は含まれないので、等号に関する諸規則は理論T
に等号の公理Theory.Eq
を含めることによって代用します。
inductive Eq : Theory L
| refl : Eq “∀ #0 = #0”
| symm : Eq “∀ ∀ (#1 = #0 → #0 = #1)”
| trans : Eq “∀ ∀ ∀ (#2 = #1 → #1 = #0 → #2 = #0)”
| funcExt {k} (f : L.func k) :
Eq “∀* (!(Subformula.vecEq varSumInL varSumInR) →
!!(Subterm.func f varSumInL) = !!(Subterm.func f varSumInR))”
| relExt {k} (r : L.rel k) :
Eq “∀* (!(Subformula.vecEq varSumInL varSumInR) →
!(Subformula.rel r varSumInL) → !(Subformula.rel r varSumInR))”
Theory.Eq
を含む理論T
が充足可能ならば、そのモデル
完全性定理
一階論理の完全性定理の証明にはいろいろな方法がありますが、形式的証明の多くはHenkin流のものです[11]。lean4-logicの前身であるlean-logicですでにHenkin流の証明を行っていたので別の方法で証明したいと思い、Tait計算の証明探索で完全性定理を証明しました。数学的な解説は国立公園に書いたのでそちらを参照してください。
算術
基礎的な準備がだいたい整ったのでより具体的な内容に移ります。
順序環の言語ℒₒᵣ
に対応します)。ペアノの公理
inductive PAminus : Theory L
| addZero : PAminus “∀ #0 + 0 = #0”
| addAssoc : PAminus “∀ ∀ ∀ (#2 + #1) + #0 = #2 + (#1 + #0)”
| addComm : PAminus “∀ ∀ #1 + #0 = #0 + #1”
| addEqOfLt : PAminus “∀ ∀ (#1 < #0 → ∃ #2 + #0 = #1)”
| zeroLe : PAminus “∀ (0 ≤ #0)”
| zeroLtOne : PAminus “0 < 1”
| oneLeOfZeroLt : PAminus “∀ (0 < #0 → 1 ≤ #0)”
| addLtAdd : PAminus “∀ ∀ ∀ (#2 < #1 → #2 + #0 < #1 + #0)”
| mulZero : PAminus “∀ #0 * 0 = 0”
| mulOne : PAminus “∀ #0 * 1 = #0”
| mulAssoc : PAminus “∀ ∀ ∀ (#2 * #1) * #0 = #2 * (#1 * #0)”
| mulComm : PAminus “∀ ∀ #1 * #0 = #0 * #1”
| mulLtMul : PAminus “∀ ∀ ∀ (#2 < #1 ∧ 0 < #0 → #2 * #0 < #1 * #0)”
| distr : PAminus “∀ ∀ ∀ #2 * (#1 + #0) = #2 * #1 + #2 * #0”
| ltIrrefl : PAminus “∀ ¬#0 < #0”
| ltTrans : PAminus “∀ ∀ ∀ (#2 < #1 ∧ #1 < #0 → #2 < #0)”
| ltTri : PAminus “∀ ∀ (#1 < #0 ∨ #1 = #0 ∨ #0 < #1)”
第一不完全性定理を示すだけならLinearOrderedCommSemiring
やCanonicallyOrderedAddCommMonoid
などのインスタンスになることが示せます)、モデル論的な証明可能性の証明が書きやすいです。
算術の
local notation "Σ" => Bool.true
local notation "Π" => Bool.false
inductive Hierarchy : Bool → ℕ → {n : ℕ} → Subformula L μ n → Prop
| verum (b s n) :
Hierarchy b s (⊤ : Subformula L μ n)
| falsum (b s n) :
Hierarchy b s (⊥ : Subformula L μ n)
| rel (b s) {k} (r : L.rel k) (v) :
Hierarchy b s (Subformula.rel r v)
| nrel (b s) {k} (r : L.rel k) (v) :
Hierarchy b s (Subformula.nrel r v)
| and {b s n} {p q : Subformula L μ n} :
Hierarchy b s p → Hierarchy b s q → Hierarchy b s (p ⋏ q)
| or {b s n} {p q : Subformula L μ n} :
Hierarchy b s p → Hierarchy b s q → Hierarchy b s (p ⋎ q)
| ball {b s n} {p : Subformula L μ (n + 1)} :
(t : Subterm L μ n) →
Hierarchy b s p → Hierarchy b s “∀[#0 < !!(Rew.bShift t)] !p”
| bex {b s n} {p : Subformula L μ (n + 1)} :
(t : Subterm L μ n) →
Hierarchy b s p → Hierarchy b s “∃[#0 < !!(Rew.bShift t)] !p”
| ex {s n} {p : Subformula L μ (n + 1)} :
Hierarchy Σ (s + 1) p → Hierarchy Σ (s + 1) (∃' p)
| all {s n} {p : Subformula L μ (n + 1)} :
Hierarchy Π (s + 1) p → Hierarchy Π (s + 1) (∀' p)
| sigma {s n} {p : Subformula L μ (n + 1)} :
Hierarchy Π s p → Hierarchy Σ (s + 1) (∃' p)
| pi {s n} {p : Subformula L μ (n + 1)} :
Hierarchy Σ s p → Hierarchy Π (s + 1) (∀' p)
完全性定理より、モデル論的に証明可能性を扱うことでT
について
theorem sigma_one_completeness
{σ : Sentence ℒₒᵣ} (hσ : Hierarchy.Sigma 1 σ) :
ℕ ⊧ σ → T ⊢ σ := fun H =>
Complete.complete (consequence_of _ _ (fun M _ _ _ _ _ => by
haveI : Theory.Mod M (Theory.PAminus ℒₒᵣ) :=
Theory.Mod.of_subtheory (T₁ := T) M (Semantics.ofSystemSubtheory _ _)
simpa using
@Model.sigma_one_completeness M _ _ _ _ _ _ hσ ![]
(by simpa[models_iff] using H)))
計算可能性
不完全性定理を証明するにあたっての目標の一つがr.e.集合の表現定理です。また
mathlib4では計算可能性や原始再帰的関数に関する諸定理が形式化されているので、これを用います。Subterm
やSubformula
について、それぞれの計算論的な定義や証明を行うのはとても辛いと考えられるためまず適当な条件を満たすW-typeについてエンコーディングやインダクションの原始再帰性を証明します。Subterm
やSubformula
はあるW-typeのSubtypeであるため、UTerm
やUFormula
といった補助的な型を経由してその計算論的性質を示しました。またよくある方法によってTait計算の証明可能性がr.e.であることが示せます。よって以下が証明できます[13]。
lemma provable_RePred : RePred (T ⊢! ·) :=
(provableFn_partrec T).of_eq <| by
intro σ; ext; simp[←provable_iff_provableFn]
r.e.集合の表現定理を示すため、Arith₁
(ArithPart₁
)と定義します。
inductive ArithPart₁ : ∀ {n}, (Vector ℕ n →. ℕ) → Prop
| zero {n} : @ArithPart₁ n (fun _ => 0)
| one {n} : @ArithPart₁ n (fun _ => 1)
| add {n} (i j : Fin n) :
@ArithPart₁ n (fun v => v.get i + v.get j : Vector ℕ n → ℕ)
| mul {n} (i j : Fin n) :
@ArithPart₁ n (fun v => v.get i * v.get j : Vector ℕ n → ℕ)
| proj {n} (i : Fin n) :
@ArithPart₁ n (fun v => v.get i : Vector ℕ n → ℕ)
| equal {n} (i j : Fin n) :
@ArithPart₁ n (fun v => isEqNat (v.get i) (v.get j) : Vector ℕ n → ℕ)
| lt {n} (i j : Fin n) :
@ArithPart₁ n (fun v => isLtNat (v.get i) (v.get j) : Vector ℕ n → ℕ)
| comp {m n f} (g : Fin n → Vector ℕ m →. ℕ) :
ArithPart₁ f → (∀ i, ArithPart₁ (g i)) →
ArithPart₁ fun v => (mOfFn fun i => g i v) >>= f
| rfind {n} {f : Vector ℕ (n + 1) → ℕ} :
ArithPart₁ (n := n + 1) f →
ArithPart₁ (fun v => rfind fun n => some (f (n ::ᵥ v) = 0))
def Arith₁ (f : Vector ℕ n → ℕ) := ArithPart₁ (n := n) f
isEqNat n m
はn = m
であるとき1
, そうでないとき0
を返す関数です(isLtNat
も同様)。ArithPart₁
はr.e.部分関数のクラスPartrec'
と同等であることがGödelのβ関数を用いて示せます。
表現定理
ArithPart₁
の構成に関する帰納法により、ArithPart₁
の部分関数のグラフを表現する論理式を構成します。
def codeAux : {k : ℕ} → Nat.ArithPart₁.Code k → Formula ℒₒᵣ (Fin (k + 1))
| _, Code.zero _ => “&0 = 0”
| _, Code.one _ => “&0 = 1”
| _, Code.add i j => “&0 = !!&i.succ + !!&j.succ”
| _, Code.mul i j => “&0 = !!&i.succ * !!&j.succ”
| _, Code.equal i j =>
“(!!&i.succ = !!&j.succ ∧ &0 = 1) ∨ (!!&i.succ ≠ !!&j.succ ∧ &0 = 0)”
| _, Code.lt i j =>
“(!!&i.succ < !!&j.succ ∧ &0 = 1) ∨ (¬!!&i.succ < !!&j.succ ∧ &0 = 0)”
| _, Code.proj i => “&0 = !!&i.succ”
| _, Code.comp c d =>
exClosure (((Rew.bind ![] (&0 :> (#·))).hom (codeAux c)) ⋏
Matrix.conj fun i =>
(Rew.bind ![] (#i :> (&·.succ))).hom (codeAux (d i)))
| _, Code.rfind c =>
(Rew.bind ![] (⸢0⸣ :> &0 :> (&·.succ))).hom (codeAux c) ⋏
(∀[“#0 < &0”] ∃' “#0 ≠ 0” ⋏
(Rew.bind ![] (#0 :> #1 :> (&·.succ))).hom (codeAux c))
Nat.ArithPart₁.Code k
は部分関数f : Vector ℕ k →. ℕ
がArithPart₁
であることを表す命題のメタ証明から非構成的にしか得られないことに注意してください。またこの論理式は
theorem representation {f : α →. σ} (hf : Partrec f) {x y} :
T ⊢! (graph f)/[⸢y⸣, ⸢x⸣] ↔ y ∈ f x := by
let f' : Vector ℕ 1 →. ℕ :=
fun x => Part.bind (decode (α := α) x.head) fun a => (f a).map encode
have : Nat.Partrec' f' :=
Nat.Partrec'.part_iff.mpr
(Partrec.bind
(Computable.ofOption $
Primrec.to_comp $ Primrec.decode.comp Primrec.vector_head)
(Partrec.to₂ <|
Partrec.map (hf.comp .snd) (Computable.encode.comp₂ .right)))
simpa[Matrix.constant_eq_singleton] using
provable_iff_mem_partrec this (y := encode y) (v := ![encode x])
ここでp/[t,u,...]
は論理式p
の変数に#0 ↦ t
, #1 ↦ u
, ...を代入した論理式を表します。
不完全性定理
聡明なる皆さんはすでにお気づきかと思いますが、この第一不完全性定理の証明はよくある証明と異なり対角化補題を証明しませんし、可証性述語を明示的に用いることさえしません。これは計算論的な証明で、Current research on Gödel's incompleteness theorems[5:1]で分類されている内のRecursion-theoretic proofsの変種だと考えています(完全に計算論的か?と言われるとそうでもない気がしますが)。
第一不完全性定理
まず証明可能性はr.eであることと、代入の操作が原始再帰的であることから集合
private lemma diagRefutation_re : RePred (fun σ => T ⊢! ~σ/[⸢σ⸣]) := by
-- 省略
表現定理よりρ
が存在します。
lemma diagRefutation_spec (σ : FormulaFin ℒₒᵣ 1) :
T ⊢! ρ/[⸢σ⸣] ↔ T ⊢! ~σ/[⸢σ⸣] := by
simpa[diagRefutation] using
pred_representation (diagRefutation_re T) (x := σ)
ここでγ := ρ/[⸢ρ⸣]
と置くと、T
が無矛盾であることから、γ
が証明も反証もできない文であることが証明できます。
lemma independent : System.Independent T γ := by
have h : T ⊢! γ ↔ T ⊢! ~γ := by simpa using diagRefutation_spec T ρ
exact
⟨System.unprovable_iff_not_provable.mpr
(fun b => inconsistent_of_provable_and_refutable' b (h.mp b)
(consistent_of_sigmaOneSound T)),
System.unprovable_iff_not_provable.mpr
(fun b => inconsistent_of_provable_and_refutable' (h.mpr b) b
(consistent_of_sigmaOneSound T))⟩
したがって第一不完全性定理が示されました。
theorem main : ¬System.Complete T :=
System.incomplete_iff_exists_independent.mpr ⟨γ, independent T⟩
第二不完全性定理
第一不完全性定理を証明したので第二不完全性定理も証明したいのですが、第一のために行った証明は表現定理を使った非構成的なもので、この方法で第二不完全性定理を証明するのはおそらく不可能です。証明可能な論理式の集合はr.e.なのでそれを表現する論理式は存在しますが、可導性条件などを導出するのは難しく、根本的に別の方法で証明する必要があるように思います。実際Isabelleによる第二不完全性定理の証明では算術の理論ではなく遺伝的集合の理論
の上で示されており、そのような工夫が必要になると考えています。
参考文献
- J. Han, F. van Doorn, A formalization of forcing and the unprovability of the continuum hypothesis
- W. Pohlers, Proof Theory: The First Step into Impredicativity
- P. Hájek, P. Pudlák, Metamathematics of First-Order Arithmetic
- R. Kaye, Models of Peano Arithmetic
- 田中 一之, ゲーデルと20世紀の論理学
- ↩︎ ↩︎
-
ちなみにIsabelleによる第二不完全性定理の形式的証明ではnominal typesによって表現されています。 ↩︎
-
Fin k
は有限集合 のようなもので、\{0,1,...,k-1\} Fin k → α
は長さk
のα
の列を表します。 ↩︎ -
束縛変数が束縛されていない項・論理式に対し
Subterm
,Subformula
とい名称を用いていますが、この名称は論理学において別の意味を持つことがあるので、あまり適切ではないかもと思っています。 ↩︎ -
このような手法はflypitchのコードを読んで初めて知ったのですが、もしかしたら一般的な対処法かもしれません。 ↩︎
-
前述したflypitchやhydra-gamesなど ↩︎
-
通常
(\Sigma_n )論理式は\Pi_n 論理式に量化子が\Sigma_0 (\exists )からはじまり交互に\forall 個現れる論理式として、またそのような論理式と理論n で同等であることが証明できるものとして定義されます。T Hierarchy
の定義は ,\Sigma_n 論理式が限定量化で閉じているように書かれていますが、これは\Pi_n がT 採集原理\Sigma_{n} を含意していれば\mathbf{B}\Sigma_{n} で成立します ↩︎T -
lean4-logicにおいて
T ⊢ σ
はT
におけるσ
の証明を意味します。一方T ⊢! σ
はT
におけるσ
の証明が存在するという命題を意味します(実際単なるNonempty (T ⊢ σ)
の略記です) ↩︎
Discussion