@miloas
http://miloas.me
bool God_algo(char *program, char *input) {
if(<program> halts on <input>) return true;
return false;
}
bool Satan_algo(char *program) {
if(God_algo(program, program)) {
while(1);
return false;
} else {
return true;
}
}
Satan_algo(Satan_algo);| 1 | |
|---|---|
| 2 | |
| 3 | |
| 4 | |
| 5 |
| 1 | 2 | 3 | 4 | ... | |
|---|---|---|---|---|---|
| M1 | N | 1 | N | N | ... |
| M2 | 2 | 0 | N | 0 | ... |
| M3 | 0 | 1 | 2 | 0 | ... |
| M4 | N | 0 | 5 | N | ... |
| ... |
构造新的图灵机P(i)
当Mi(i) halts时,P(i) = Mi(i)+1
否则,P(i) = 0
必然存在k使得Mk = P, 就会有:
Mk(k) = P(k) =
1+Mk(k) if Mk(k) halts
0 if Mk(k) doesn't halt
不管哪种情况都矛盾
lambda calculus BNF:
<expr> ::= <identifier>
<expr> ::= lambda <identifier-list> . <expr>
<expr> ::= (<expr> <expr>)
"Why does it exist? Why does it work the way it does?"
function f(n) {
return n == 0 ? 1 : n * f(n - 1)
} // lambda n. If_Else n == 0 1 n * f(n - 1)lambda n. If_Else n == 0 1 n * <self>(n - 1)let F = lambda n. If_Else n == 0 1 n * F(n - 1)let P = lambda self n. If_Else n == 0 1 n * self(self, n - 1) // P(P, 3)let P = lambda self n. If_Else n == 0 1 n * self(n - 1) // P(f, 3)
P(f) ??? excuse me ???
-----------> P(f)(3) == P(f, 3)
P(f) == lambda n. If_Else n == 0 1 n * f(n - 1) == f
Y(F) = f = F(f) = F(Y(F))let f_gen = lambda self. P(self(self))
f_gen(f_gen) = P(f_gen(f_gen))let Y = lambda F. {
let f_gen = lambda self. F(self(self))
return f_gen(f_gen)
}const Y = f => (x => f(v => x(x)(v)))(x => f(v => x(x)(v)))
(self => n => n ===0 ? 1 : n * self(n - 1))