マルチスレッドでゲーデルの不完全性を証明するのは間違っているだろうか

WARNING

この記事ChatGPTによって中国語から翻訳されたものでいくつかのりがまれているかもしれません。不正確部分があればご了承ください

WARNING

この記事厳密学術論文ではなく、一部誤りや欠落があるかもしれません了承ください

序論

Kurt Gödelのいくつかの有名定理、現代論理学基礎形成しています。中でもGödel第一および第二不完全性定理称賛されています

これまで、私くの人々Gödel不完全性定理証明非常複雑、非常複雑技術的詳細があるため、学習するのはかなり困難だとじてきました2023∞-type Café 夏季学校ocau先生非常優雅簡潔Gödel不完全性定理証明講義いましたこの講義によりGödel不完全性定理実際には計算可能性、あるいは再帰理論非常密接関係があることにづきました

この記事では、私Gödel不完全性定理について理解したことを、最簡単おそらく厳密ではないGödel不完全性定理証明紹介、一般的プログラマー簡単一階論理んだでも理解できるようにめます

一階論理

一階論理First order logic, FOL、本記事議論する論理システムです。一階論理には、構文面意味面があります。一階論理学校んでいない読者、以下のように理解することができます

  1. 一階論理一種言語であり、私たちがよくプログラミング言語ていますそれは形式化された構文Syntaxっています
    • 一階論理「文」、抽象構文木Abstract Syntax Treeまたは代数データADTなすことができます
    • この構文木にはつのレベルがあります。一つは「命題」Statementもうつは「表現」Expressionです
    • 表現レベルには変数、関数などがまれますxxf(x)f(x)g(x,y)g(x, y) はすべて表現です
    • 命題レベル表現から構成され、表現等号関係でつながれて命題構成します。例えばf(x1)=f(x2)f(x_1) = f(x_2)P(x1,f(x2))P(x_1, f(x_2)) などです
    • 命題論理接続詞でつながれ、特定意味表現します。例えばf(x1)=f(x2)P(x1,f(x2))f(x_1) = f(x_2) \land P(x_1, f(x_2)) 命題ですこのような論理接続詞には \rightarrow\lor¬\neg などがあります
    • 命題内自由変数free variable量化子束縛され、新たな命題ることができます。例えばx1x2.f(x1)=f(x2)\forall x_1 \exists x_2. f(x_1) = f(x_2) などです
  2. 一階論理という言語その意味規定する必要がありますこれはモデルModelじて実現されます。関連する内容比較的複雑なのでここでは議論しません
  3. 一階論理にはくの証明システムがあります。例えばHilbert Systemなどですこれらの証明システム意味とは独立しています。簡単えば、証明システム「計算」によって Γψ\Gamma \vdash \psi という命題提供します1ここでΓ\Gamma 命題集合ψ\psi 証明する必要がある命題します
  4. 一階論理使用するとき、私たちは一階理論Theory使用します。一階理論、記号表 SS 公理集合 TT から構成されます。記号表、命題中出現可能なすべての記号規定しますこれには、定数、関数記号、関係記号つがまれます。公理集合この理論中自明であると証明されない命題規定しますこれらは証明システム証明出発点となります2。例えば、有名Peano算術一階理論としてうことができその記号表には以下のものがまれます
    • 定数記号 00
    • 関数記号 ++
    • 関数記号 ×\times
    • 関数記号 SS後続
    • 関係記号 \le

一階論理への紹介はここまでです。一階論理非常かな数学的性質っておりこれが数理論理学主要議論対象ですもし読者がこの記事んで不快いをしたなら、信頼できる数理論理学教科書、例えば [1, 2] などをして、関連知識んでみてください

ゲーデル不完全性定理

完全性一階理論性質です。一階理論 TT 完全であるとは、以下のことを意味します

その理論記号集合構築された任意命題 ψ\psi してTψT \vdash \psi または T¬ψT \vdash \neg \psi のどちらかが

つまりこの理論内任意命題、証明されるか、否定されるかのどちらかです

これは純粋構文的概念であり、特定証明システム指定する必要があるようにえますしかし、特別構造がなければ、一階論理各証明システム証明能力において等価ですそしてゲーデル完全性定理存在するためTψT \vDash \psi TψT \vdash \psi 同等でありこれは実際には意味論的概念でもありますしたがって、通常証明システム指定する必要はありませんゲーデル不完全性定理形式化 [3] ではこのような指定必要になる可能性があります

一階理論についてはそれが完全であることを期待します。例えばペアノ算術では、以下直感的命題証明されます

  • n.nS(n)\forall n. n \le S(n)
  • n1,n2.n1+n2=n2+n1\forall n_1, n_2 . n_1 + n_2 = n_2 + n_1

それに対応して、直感的にはたない命題否定されます

一階理論十分単純であれば、不完全性容易達成されます。例えば、記号表 {c,e}\{ c, e \} 、公理 \emptyset 一階理論 AA えてみましょう。明らかに以下ちます

  • A⊬c=eA \not\vdash c = e
  • A⊬ceA \not\vdash c \neq e

直感的にはこれは理論公理集合なすぎるためですAA 公理これは通常 拡張extensionばれますc=ec = e 追加するとAA 完全理論にすることができます

任意理論 TT についてψ\psi がこの理論証明否定もできない場合これを ψ\psi TT 独立であるといますψ\psi または ¬ψ\neg \psi TT 公理追加することでこの不完全性解消することができます

これはしい風景しているようにえますたちはての数学完全一階理論づいて構築することができこの究極理論では、任意命題証明されるか否定されるかのどちらかですこれにより、曖昧混乱した数学言語、明確整然とした一階論理完全えられることになります……

残念ながら1931年、Gödel論文 Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I [13]、形式体系TT初等算術3そのには証明否定もできない命題存在することを証明しました。公理追加することはにもたないなぜなら公理追加した、不完全性定理前件依然としてたされ、後件すことができるからです4

これは、私たちが想像したしい景色死刑宣告したものですもちろん、私たちはプログラマであり、数学者ではないのでこれがたちに関係があるのでしょうか

判定可能性

Gödel1931論文発表した後、ChurchTuring1936-1937、一階論理のもうつのきな問題判定可能性否定証明をそれぞれ提出しました

前述、一階論理命題構文木または文字列なすことができ、一階理論記号表公理集合でありある条件下えば、以下説明する再帰的公理化ではこれらはすべてプログラムデータなすことができます

らかに、私たちはのような質問をします命題ψ\psiTT証明可能かどうかを判断するプログラムp\texttt{p}存在するのでしょうか

このいのえは否定的ですそのようなプログラム存在しません。証明方法後述しますこの事実直感するかもしれませんが、公理系証明理論的には列挙可能です

どのように列挙するのでしょうかPeano算術HilbertえてみましょうPeano算術公理、帰納公理無限存在しますがそれには固定したパターンがあります

yk.((φ(0,yk) (φ(x,yk)φ(S(x),yk)))x.φ(x,yk)) \begin{aligned} \forall \vec{y_k}. (& (\varphi(0, \vec{y_k})\ \land \\ & (\varphi(x, \vec{y_k}) \rightarrow \varphi(S(x), \vec{y_k}))) \\ & \rightarrow \forall x. \varphi(x, \vec{y_k})) \end{aligned}

ここで列挙する必要があるのはkkφ\varphiですkkうまでもなくφ\varphiはすべての述語その構文確定しており、固定ルール生成することができますしかし、直接gen関数くのはかなり複雑ですここではGödel方法参考にします

まずPeano算術記号集無限ですが、私たちはそれをつの領域けることができます

  • 十個論理記号簡略化後
  • 無限変数記号v0v_0v1v_1v2v_2表記

これらつの領域記号順番エンコードするとエンコードデコード関数提供できますエンコード関数記号自然数マッピングデコード関数自然数記号マッピングします

1# put '∀' to 1 , instead of 0
2LOGIC_SYM = [ 'dummy', '∀', '0', 'S', '+', '×', '(', ')', '¬', '→', '=' ]
3
4def decode(n):
5    if n <= len(LOGIC_SYM):
6        return LOGIC_SYM[n]
7    else:
8        # append '$' to variable head
9        return f"$v_{n - len(LOGIC_SYM)}"
10
11def encode(sym):
12    if sym[0] == '$':
13        # is variable, start with '$'
14        index = sym[3:]
15        return int(index) + len(LOGIC_SYM)
16    elif sym in LOGIC_SYM and sym != 'dummy':
17        return LOGIN_SYM.index(sym)
18    else:
19        # error
20        return -1

同様、命題つまり文字列、文字リストエンコードデコード可能ですGödel使用した技術のようなものです

[a1,a2,a3,...,an]=p1a1×p2a2××pnan \sharp [ a_1, a_2, a_3, ..., a_n ] = p_1^{\sharp a_1} \times p_2^{\sharp a_2} \times \cdots \times p_n^{\sharp a_n}

ここでai\sharp a_iほど定義したencode(aᵢ)pip_iii番目素数します

1from sympy import nextprime, Pow, factorint
2
3def encode_str(stmt):
4    pᵢ = 2
5    res = 1
6    for aᵢ in stmt:
7        res *= Pow(pᵢ, encode(aᵢ))
8        pᵢ = nextprime(pᵢ)
9    return res
10
11def decode_str(n):
12    """
13    n must be of form `Πᵢ pᵢ^{aᵢ}, aᵢ ≠ 0`, or this function is undefined
14    """
15    res = []
16    factors = factorint(n)
17    # factors is like { pᵢ : aᵢ }
18    for pᵢ, aᵢ in sorted(factors.items()):
19        res.append(decode(aᵢ))
20    return res

decode_str値域はすべての文字列みますこれにより、文字列反復自然数反復実現できます

文字列ずしも有効命題であるとはらないため、文字列有効命題であるかどうかを判断する関数必要ですこの関数があればすべての命題列挙することができます

1def is_valid_stmt(stmt):
2    # this function is hard to write
3    pass
4
5def gen_all_stmts():
6    n = 0
7    while True:
8        stmt = decode_str(n)
9        if is_valid_stmt(stmt):
10            # do something here
11        n += 1

関数 is_valid_stmtプログラミング言語パーサており、書くのはしいかもしれませんが、確実くことができます

同様すべての証明つまり命題リスト列挙、命題証明可能かどうかを判断する関数構築することができます

1def is_valid_proof(stmt_l):
2    pass
3
4def encode_proof(proof):
5    # like encode_str()
6    pass
7
8def decode_proof(n):
9    pass
10
11def can_prove(ψ):
12    n = 0
13    while True:
14        stmt_l = decode_proof(n)
15        if is_valid_proof(stmt_l):
16            stmt_last = stmt_l[-1]
17            if stmt_last == ψ:
18                return True
19        n += 1

プログラム can_proveする観察

  • リスト最後のものが証明すべきψ\psiである場合、明らかにTψT \vdash \psiちます
  • 我々列挙はすべての証明カバーしているのでもしTψT \vdash \psiであるならつまり要求される証明存在するならその証明つかります
  • もしT⊬ψT \not\vdash \psiであるならこのアルゴリズム停止せず、永遠ループします

これは停止問題状況非常ており、計算可能性理論では「半決定性」semi-decidableばれています。半決定性我々以下証明使用する核心概念であり、詳しく議論する価値があります

集合5 SS 半決定可能であるつまりすべての eSe \in S して p(e)=True\texttt{p}(e) = \texttt{True} となるプログラム p\texttt{p} 存在する場合同義です

半決定可能性キーe∉Se \not\in S のときにプログラム停止するかどうかは議論されていないということですもし p(e)=True\texttt{p}(e) = \texttt{True}つまりプログラム True\texttt{True} 出力するならそれは eSe \in S であるということですしかしe1∉Se_1 \not\in S という入力があった場合、p(e)\texttt{p}(e) 停止するかどうかは定義にはまれていませんしたがって、決定可能集合半決定可能集合であり、半決定可能集合ずしも決定可能集合であるとはりません

ハルティング問題半決定可能であり、決定可能ではない

証明非常簡単、半決定可能性存在するそのプログラムのように構築されます

1def p(prog, x):
2    exec(prog, x)
3    return True

もし prog(x) 停止するならインタープリタ exec(prog, x) 停止します

半決定可能性にはいくつかの等価定義があります

  1. 再帰的列挙可能recursively enumerable, r.e.。集合 SS 再帰的列挙可能であるとはS=S = \emptyset または再帰的全関数 ff 存在S={y  x.f(x)=y}S = \{ y\ |\ \exists x. f(x) = y \}つまりSS ff 値域であることを意味します
  2. SS 部分特性関数部分的再帰的です
  3. SS はある部分再帰関数値域です

「部分関数」partial functionとはでしょうか簡単うと、一部入力定義されていない関数のことをします。一部入力停止しないプログラム「像」、つまり {(x,y)  xA,p(x)=y}\{ (x, y)\ |\ x \in A, \texttt{p}(x) = y \} 部分関数です

これらの等価性証明必要[1, 5]参照してください

is_valid_stmt is_valid_proof 構築、文字列公理集合まれているかどうかを判断するアルゴリズム存在することを要求しますこれは公理集合要求します。実際、ゲーデル不完全性定理条件には、公理集合再帰集合である必要があり、再帰集合決定可能性等価これは半決定可能性要求してすべての入力停止するという制限追加します

Gödel 不完全性定理証明

すでに、少なくとも Peano 算術 PA\mathsf{PA} についてはPAψ\mathsf{PA} \vdash \psi 問題半決定的であることをっていますこの結果しのプログラミング技巧いるとすぐに Gödel 不完全性定理ることができます

まずPA\mathsf{PA} 完全であると仮定しますつまり、任意 ψ\psi についてPAψ\mathsf{PA} \vdash \psi または PA¬ψ\mathsf{PA} \vdash \neg \psi ですPA\mathsf{PA} 半決定器 p\texttt{p} としPA\mathsf{PA} 決定器 p_total\texttt{p\_total} 構築できます。構築以下りです

1from multiprocessing.pool import ThreadPool
2
3def can_prove_input(ψ):
4    can_prove(ψ)
5    return ψ
6
7def p_total(ψ):
8    pool = ThreadPool(processes=2)
9    result = pool.apply_async(can_prove_input, (ψ, ¬ψ))
10    which = result.get()
11    if which == ψ:
12        return True
13    else:
14        return False

いもよらなかったでしょうこのプログラムキー並行性にあります並行性のもうつの名前「非決定性計算」、実際、私はここでこの方法いて非決定性計算模倣したいだけですつまりcan_prove_input(ψ) can_prove_input(¬ψ) 「同時」計算します

p_total\texttt{p\_total} しく分析してみましょう。完全性考慮れて、場合分けをいます

  • もし PAψ\mathsf{PA} \vdash \psi ならばcan_prove_input(ψ) 停止result.get() ψ すので、全体関数 True します。注意してくださいこの can_prove_input(¬ψ) 停止しないのでresult.get() ψ します
  • もし PA¬ψ\mathsf{PA} \vdash \neg\psi ならばcan_prove_input(¬ψ) 停止result.get() ¬ψ 、全体関数 False しますPA\mathsf{PA} 一貫性づいてこの PA⊬ψ\mathsf{PA} \not\vdash \psi です

したがってp_total\texttt{p\_total} PAψ\mathsf{PA} \vdash \psi 決定器ですこれによりPA\mathsf{PA} 決定可能となりこれは不決定性結果矛盾しますしたがって、仮定たずPA\mathsf{PA} 完全ではありません

読者納得しないかもしれませんこれはズルではないか Gödel マルチスレッドっているのか実際、非決定性チューリングマシン決定性チューリングマシン等価でありマルチスレッドシングルスレッドシミュレートすることができますしかし、私たちはまだ「正常p_total\texttt{p\_total} 提供することができます

1def can_prove_n(ψ, n):
2    n0 = 0
3    while n0 <= n:
4        stmt_l = decode_proof(n0)
5        if is_valid_proof(stmt_l):
6            stmt_last = stmt_l[-1]
7            if stmt_last == ψ:
8                return True
9        n += 1
10    return False
11
12def p_total(ψ):
13    n = 0
14    while True:
15        if can_prove_n(ψ, n):
16            return True
17        elif can_prove_n(¬ψ, n):
18            return False
19        
20        n += 1

ここでは、元 can_prove(ψ) can_prove_n(ψ, n) 変更しましたつまりnn ステップ以内 ψ\psi 証明できるかどうかですこれによりcan_prove_n(ψ, n) 停止するためp_total 直接 can_prove_n 順次計算することができます

決定不能性証明

上記議論から、次のことがわかります

  • 半決定性比較的複雑プログラム必要がありますが、全体的には直感的です
  • 半決定性決定不能性があれば、直接 Gödel 不完全性定理ることができます

問題キーPA\mathsf{PA} 決定不能性をどのようにるかですこの記事では、証明厳密提供するのではなく、証明アプローチ簡単紹介します

Church 結果利用する

決定不能性証明するためには、比較的複雑概念である表現可能性representability導入する必要がありますGödel 自身はこの概念直接使用していないようです [4]、代わりにその等価形使用しました

Church 1936論文 [11] めて決定不能性問題存在することを証明しました一部学者証明満足していないようですその問題りです

えられた a,bΛa, b \in \Lambda^{\circ} してaβba \approx_{\beta} b つか

ここでΛ\Lambda^{\circ} 「閉じた lambda 項」β\approx_{\beta} β-等価関係しますつまりaa bb には β\beta 簡約 β\beta 抽象からなるパス存在します。彼論文はさらに、任意 ω-一貫性システム判定器構築できないと指摘しています[11, 12]

Church 証明使用する場合、まず β\approx_{\beta} 算術化する必要がありますつまり、整数上関係 PP つけP(M,N)P(\sharp M, \sharp N) 場合唯一 MβNM \approx_{\beta} N 場合つけ必要がありますここで \sharp エンコーディングします。明らかにPP 良好表現必要がありますなぜなら、次 PA\mathsf{PA} P(x,y)\mathsf{P(x, y)} つけ、任意 n1,n2n_1, n_2 して

P(n1,n2)PAP(n1,n2)¬P(n1,n2)PA¬P(n1,n2) \begin{aligned} P(n_1, n_2) &\rightarrow \mathsf{PA \vdash P(n_1, n_2)} \\ \neg P(n_1, n_2)& \rightarrow \mathsf{PA \vdash \neg P(n_1, n_2)} \end{aligned}

たす必要があるからです

P(n1,n2)\mathsf{P(n_1, n_2)} n1\mathsf{n_1} メタ言語自然数 n1n_1 PA\mathsf{PA} 対応する記号列しておりつまり

SSSSn1の数 0 \underbrace{S S S \cdots S}_{n_1 の数}\ 0

P(x,y)\mathsf{P(x, y)} 確定的2つの自由変数 PA\mathsf{PA} ですこれにより

  • PA\mathsf{PA} 判定可能であると仮定すると、任意 a,bΛa, b \in \Lambda^{\circ} して
  • 判定器 p\texttt{p} φ=P(a,b)\varphi = \mathsf{P(\sharp a, \sharp b)}$\psi = \mathsf{\neg P(\sharp a, \sharp b)} $ 入力します
  • p(φ)\texttt{p}(\varphi) します

らかにこのプログラム Church 判定不能であると証明した問題判定しています。実際、PP TT 表現可能であればPP 判定問題 TT 判定可能性還元できます

しかしP\mathsf{P} つけるのは、私個人的には面倒作業だといます

Kleene 結果利用する

Gödel 1931論文、原始的再帰関数はすべて表現可能であることを証明しました。関数表現可能性については、教科書 [1] 資料 [9] 説明なり、資料 [9] 関数表現可能性関係表現可能性同一視しています。我々一時的後者説明6 採用、関数 ff 表現可能であるとは、次のような P\mathsf{P} 存在するときかつそのときにります

f(m)=nTP(m,n)f(m)nT¬P(m,n) f(\vec{m}) = n \rightarrow T \vdash \mathsf{P(\vec{m}, n)} \\ f(\vec{m}) \neq n \rightarrow T \vdash \mathsf{\neg P(\vec{m}, n)}

Kleene 正規形定理証明しました

三項原始的再帰関数 C(x,y,z)C(x, y, z) 一項原始的再帰関数 U(x)U(x) 存在、任意部分的再帰関数 ff ee えられたときにのように表現できる
f(n)=U(μz[C(e,n,z)]) f(n) = U(\mu z[C(e, n, z)])

この定理一見難解えますが、実際にはインタープリタのようなシステム説明しています

1def U(x):
2    # some calculation 
3    pass
4
5def C(e, y, z):
6    # some calculation
7    pass
8
9def μ(f):
10    n = 0
11    while f(n) != 0:
12        n += 1
13    return n
14
15def f(n):
16    return n * 2
17
18def f_another(n):
19    # note: e may not be 10, we just use a fixed value here
20    return U(μ(lambda z: C(10, n, n)))
21
22# ∀ n, f(n) == f_anthor(n)

ここでの ee プログラム再帰関数エンコードされた結果として理解できますこの定理じてKleene対角線法いて以下定理証明しました

すべての部分再帰関数潜在的再帰的potentially recursiveであるわけではない

「潜在的再帰的」とは、部分再帰関数 gg して、全関数 ff 存在gg 定義されている場所では f(n)=g(n)f(n) = g(n) となることを意味します。直感的にはこの定理すべての半決定可能集合決定可能であるわけではないています

今、TT 判定器 p_t\texttt{p\_t} 存在すると仮定しますGödel証明によれば、公式 C(e,n,z,t)\mathsf{C(e, n, z, t)} C(e,n,z)C(e, n, z) 表現しているとしますそこで、新たなスーパーインタプリタ構築することができますこれはすべての部分再帰関数 gg 対応する全関数 ff つけることができます。任意 gg その ee e1e_1 としますff 以下のように構築します

1def f(n):
2    if p_t(∀ z. ¬C(e₁, n, z, 0)):
3        # g(n) can never halt
4        # return a random value, doesn't matter
5        return 0
6    else:
7        # g(n) will halt
8        # return g(n)
9        return U(μ(lambda z: C(e₁, n, z)))

Kleene定理によればgg 停止しない唯一方法 z.C(e1,n,z)0\forall z. C(e_1, n, z) \neq 0 ですしたがってCC 自体 TT 表現可能原始再帰関数であるためTT 決定可能であれば、任意 nn して g(n)g(n) 停止するかどうかは決定可能です

Gödel原始証明との比較

Gödel原始証明 [1, 13] はかなり複雑、大まかには以下のようにまとめることができます

  1. すべての原始再帰関数表現可能であることを証明する
  2. 一階論理初等算術文法原始再帰関数算術化ここでは can_prove_n(ψ, n) くことで解決しますGödel初等再帰関数定義、対応する初等再帰関係定義しました。彼45再帰関係、最終的証明可能性有名Bew定義しました
  3. Bew原始再帰関係であるため、表現可能ですしたがって、公式 P(ψ)\mathsf{P(\sharp\psi)} がそれを表現することができます
  4. Gödel不動点定理証明しました任意一項公式 ψ(x)\psi(x) して、文 σ\sigma 存在Tσψ(σ)T \vdash \sigma \leftrightarrow \psi(\mathsf{\sharp\sigma}) となります
  5. したがってTσ¬P(σ)T \vdash \sigma \leftrightarrow \neg \mathsf{P(\sharp \sigma)} となる σ\sigma 存在します。注意してくださいこのつきパラドックス命題構築します
  6. ω-完全性利用してTσT \vdash \sigma 仮定するか T¬σT \vdash \neg \sigma 仮定するかにかかわらず、矛盾じますこれによりσ\sigma TT 独立していることがわかります

それはらかで、私たちの証明1.2.けていませんこれらは複雑ステップですしかし、半決定性理解しやすくそれをってくると、証明非常くなります1.2.実際には半決定性証明するために導入されたものです

さらなる

  • もしGödel証明びたいなら、直接 [1] またはGödel論文 [13] んでください。杨睿之先生非常によくかれています
  • このような証明アプローチ最初Kleeneからたようで、彼著作 [10] とこのノート [9] 参照してください
  • この記事 [4] もこのアプローチいて不完全性定理紹介しています
  • ocau先生Agda形式化参考になりますが、彼講義ビデオ公開されていません理由不明。彼アプローチはこのCoq形式化作業 [6] から可能性がありますこの論文直接読むことで代替できます
  • Gödel不完全性定理完全Coq形式化 [3]上記論文総合的なものでここで議論されているものとはきないがあります
  • Gödel不完全性定理についての2 [2, 8] はどちらもよくかれており、一部んでむことができます
  • 再帰関数関連する知識については [1, 10] 宋先生 [7] 参照してください。同様、計算可能性関連する概念については [5] 参照してください

参考文献