不完全性定理のメモ

 あまりにも寒いので布団に包まって「不完全性定理」の論文の概要を読んでいた。
 まだ理解できたかどうか怪しいけどD言語でメモしてみる。
 ちなみにこのD言語の世界では、引数も戻り値もstring縛りです。

/**
 *  ソースコード文字列をバイトコードにコンパイルする。
 *
 *  Params:
 *      src = ソースコード。
 *  Returns:
 *      コンパイル結果のバイトコード。
 */
string R(string src);

/**
 *  バイトコードの実行結果を判断できる関数。
 *
 *  Params:
 *      code = 実行するバイトコード。
 *      arg = バイトコードに渡す引数。
 *  Returns:
 *      バイトコードの実行結果を文字列で返す。
 */ 
string Bew(string code, string arg);

/// D言語の偉大なるトークン文字列。
string q = q{

/**
 *  ソースコードの実行結果を判断し、その否定を返す。
 *
 *  Params:
 *      src = 実行結果を求めるソースコード。
 *  Returns:
 *    srcの実行結果の否定。
 */
string K(string src) {
    return (Bew(R(src), src) == "true") ? "false" : "true";
}

}; // qの終了。

// 必殺のmixin。qの内容がここに貼付けられ、Kが定義される。
mixin(q);

assert(K("(string src){return q{true};}") == "false");
assert(K("(string src){return q{false};}") == "true");
assert(K("(string src){return src;}") == "true");

// Kのソースコードそのものを与える。
// Kがtrueならばfalseだが、するとtrueを返す事になり結果はfalseに、しかしーー
// そんな感じでKを永久に判断し続ける。
// 素朴に考えればBew関数はインタープリタになるので、つまり無限に再帰する事になるのか?
assert(K(q) == "true");

 上記のように、D言語なら不完全性定理も簡単です。
 (いろいろ間違っているかもだけど)

ゲーデル 不完全性定理 (岩波文庫)

ゲーデル 不完全性定理 (岩波文庫)