自指

“理发师只给不给自己理发的人理发,问理发师到底给不给自己理发”,这是一个悖论问题,但接下来关心的目标是为什么产生了这种悖论,先将问题简化为判断“理发师能给自己理发的真假”。为此我写了一个程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define x->x?
(lambda (n)
(cond
((= n 1)
(to_self))
((= n 0)
(not_to_self)))))
(define to_self
(lambda ()
(x->x? 0)))
(define not_to_self
(lambda ()
(x->x? 1)))

当需要判断”理发师能给自己理发“,我们输入’(x->x? 1)’, 可以发现,经过’(to_self)’的推理,最终回到了’(x->x? 0)’,在经过’(not_to_self)’的推理,最终回到了’(x->x? 1)’本身。
也就是说,对于问题的判断最终回到了对于问题的判断,这样一层一层的递归下去,没有结束的时候,这就是悖论产生的原因。将上述的程序简化更加可以看清悖论产生的本质。

1
2
3
4
5
6
7
8
(define x->x?
(lambda (n)
(cond
((= n 1)
(x->x? 0))
((= n 0)
(x->x? 1)))))

根据上面,悖论产生的原因,也可以构造一个悖论“a=b,b=a,问a=?”