返回

逻辑解构 | 真实与谎言的守门人

题目

数学大臣尤泽尔受到国王亚路开德的召见,被侍卫克里亚带到了一个房间。在他的面前只有两扇门,门前各有一个守门人。

“两个守门人中有一个人只说真话,另一个人只说假话”,克里亚说,“陛下在其中一扇门后面等着您,但陛下要求您只可以问其中一个人一个问题。”

“另一扇门后面有什么?”尤泽尔问。

这位王国最聪明的头脑,以往都是二话不说地轻松解决所有谜题,今天居然问起了失败的后果。克里亚有些诧异,但还是耐心地解释道“只有一把空椅子。”

“不错”,尤泽尔呢喃了一句,令克里亚心里顿感不妙。

尤泽尔随便走向其中一个守门人,问了一个有些复杂的问题,守门人随即陷入沉思,那痛苦的表情让克里亚有些担心。但好在,几分钟过后,守门人还是回答了上来,是正确的门。然而,克里亚尚未来得及松一口气,只见尤泽尔直接打开了另外一扇门——然后坐到了那把空椅子上。在守门人赶上之前,尤泽尔砰地一声关上了门。

“让陛下来找我”,尤泽尔的声音透过门传来,“他只能问其中一个人一个问题”。


陛下应该问什么问题,才能找到正确的门?

答案(不唯一)

问其中一个守门人:“如果我问另一个守门人‘哪扇是正确的门’,他会回答哪扇门?”,回答的门就是错误的门,选择另一扇门即可。

证明

分类讨论:

  • 若问到了说真话的守门人,则另一个守门人说的是假话,会回答错误的门,那么这个说真话的守门人就会告诉你错误的门
  • 若问到了说假话的守门人,则另一个守门人说的是真话,会回答正确的门,那么这个说假话的守门人就会告诉你错误的门

所以无论问的是哪个守门人,回答都是错误的门,因此选择另一扇门即可。

原理

这里我们先完善一下“说假话”的定义:若答案是二元的(如是或不是、左或右等),则会说相反的答案;若答案非二元,则有可能说出任何不正确的答案。

我们先来弄清楚这个游戏存在的二元:

  • 两个守门人,其中一个只说真话,一个只说假话
  • 两扇门,只有一扇门是正确的

前者是游戏背景规则,也是做选择时的限制,但并非我们需要的答案;后者是游戏背景规则,也是我们需要的答案。

只问一个问题很难同时得到两个问题的答案,因此我们应该考虑放弃弄清楚谁说真话谁说假话,只要确定哪扇门是正确或错误的就可以了。换言之,我们需要问一个“不管问到说真话还是说假话的人,都会回答相同的答案”的问题。

答案的问题正是如此。从证明里我们能发现,不管问到说真话还是说假话的守门人,最后回答的都是错误的门。

为何能达成这样的效果呢?我们研究一下,问题的回答在被我们得知之前都经过了什么。以左边的门为正确的门且问到了说真话的守门人为例:

  • 最内层的问题:哪扇是正确的门,此时回答为左
  • 内层问题:问另一个守门人“哪扇是正确的门”的回答,由于另一个守门人说的是假话,最内层回答为左,所以此时回答为右
  • 外层问题:问这个守门人“如果问另一个守门人…”的回答,由于这个守门人说的是真话,内存回答为右,所以此时回答为右

再以左边的门为正确的门,且问到了说假话的守门人为例;

  • 最内层的问题:哪扇是正确的门,此时回答为左
  • 内层问题:问另一个守门人“哪扇是正确的门”的回答,由于另一个守门人说的是真话,最内层回答为左,所以此时回答为左
  • 外层问题:问这个守门人“如果问另一个守门人…”的回答,由于这个守门人说的是假话,内存回答为左,所以此时回答为右

可以发现,两次回答的过程的共同点是,回答都是被反转了一次的。

答案的巧妙之处在于,这个问题虽然只对一个守门人问了,但其实回答的过程把两个人都经过了,因此得到的回答一定是最内层问题的相反回答。

因此,原理同上的问题都可以完成本题的任务。如“另一个守门人会告诉我正确的门是左边的门吗?”,如果回答不会,那么正确的门就是左边的门。

思考

这里面有没有什么数学原理呢?

当然是有的。

说句题外话:逻辑解构系列里的谜题当然都是有更深的原理的,这样才值得我们研究,而且几乎必然离不开数学,这也是为什么尤泽尔是数学大臣而不是物理大臣或者解谜大臣。

理解上面的原理后,我们发现,因为原问题必定把两个守门人都经过一次,所以回答一定会被反转一次,此时两个守门人有点类似“串联”的关系。

用逻辑表示说真话与说假话使答案发生的变化的话,说真话就是保持不变,说假话就是取反。

答案问题中的“串联”,实际上就等价于最内层问题的一个取反,只不过是利用游戏规则表达成了语言而已。

  flowchart LR
	A[原问题回答]
	B[说真话的守门人]
	C[说假话的守门人]
	D[给尤泽尔的回答]
	A-->B
	B--保持不变-->C
	C--取反-->D

同理,我们很容易想到另一种“串联”方法:将自己与自己串联。说真话串上说真话,答案不变;说假话串上说假话,就是取反再取反,也是不变。转换成语言就是“如果我问你,哪扇是正确的门,你会回答哪扇门?”

  flowchart LR
	subgraph 问到说假话的守门人
		direction LR
		E[原问题回答]
		F[说假话的守门人]
		G[说假话的守门人]
		H[给尤泽尔的回答]
		E-->F
		F--取反-->G
		G--再取反-->H
		end
	subgraph 问到说真话的守门人
		direction LR
		A[原问题回答]
		B[说真话的守门人]
		C[说真话的守门人]
		D[给尤泽尔的回答]
		A-->B
		B--保持不变-->C
		C--保持不变-->D
		end

这样我们就得出了本题的另一个可能的答案,并且这个答案会直接得到正确的门,不用再反转一次,并且哪怕只有一个守门人也可以问到正确的门。

和位运算有关系吗?

过程之中的反转,很容易让我们联想到布尔值。提到布尔值,很容易联想到的就是逻辑运算或者位运算,这里我们研究位运算,那不得不做的就是看一下真值表。

以二元问题为例,我们把其中一个答案看作 $1$,相反答案看作 $0$。这里我们将一个问题在经过守门人之前的答案看作输入,守门人会给出的答案看作输出。

那么,只说真话的守门人的真值表:

输入 输出
0 0
1 1

原封不动,我们可以看作和 $1$ 做与运算,也就是 x & 1

我们再来看看只说假话的守门人的真值表:

输入 输出
0 1
1 0

取反,我们可以看作取反,也就是 ~x,也可以看作 x ^ 1

由此,我们可以发现上面的第一种答案对应的运算其实就是 ~(x & 1) 或者 ~(x ^ 1),第二种对应的是 ~(~x) 或者 x ^ 1 ^ 1

由此我们也可以玩的更复杂一些,叠更多的运算。当然,由于我们并不知道哪个人说真话哪个人说假话,所以两种运算符的数量要一致。

例如,我们尝试构造 ~(~~x&1&1)&1 对应的问题:

  graph LR
A[原问题回答]-->B[真话]--不变-->C[真话]--不变-->D[假话]--取反-->E[假话]--取反-->F[真话]--不变-->G[假话]--取反-->H[尤泽尔]

问说假话的人:如果我问另一个人【如果我问另一个人〖如果我问你“如果我问另一个人‘如果我问你,哪扇是正确的门,你会回答哪扇门’,他会回答哪扇门”,你会回答哪扇门〗他会回答哪扇门】,他会回答哪扇门?

更多的守门人?

位运算总共有六种,运算对象有两种,由此可以构造出一共八种守门人,请选择你的角色:

位运算 对应的守门人
x & 1 只说真话
x & 0 只说否
`x 1`
`x 0`
x ^ 1 只说假话
x ^ 0 只说真话
~x 只说假话
左右移 胡言乱语

真的没办法同时问出谁说真话谁说假话吗?

施工中。

附录

参考文献

问题经过故事化(这会成为逻辑解构的传统),原问题与原答案来自于某本小说。

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

CC BY-NC-SA 4.0
最后更新于 Jul 06, 2025
本博客所有内容无特殊标注均为失迹原创内容,复制请保留原文出处。
Built with Hugo
Theme Stack designed by Jimmy, mod by Korita
© Licensed Under CC BY-NC-SA 4.0