谢丽尔的生日

雪莉的生日（Cheryl's birthday）是一个数学问题的非正式名称，是新加坡及亚洲中学数学奥林匹克竞赛的题目，在2015年4月10日由江坚文（Kenneth Kong）贴上Facebook，之后在网路上爆红，已获得《纽约时报》、《卫报》、英国广播公司（BBC）的报导，出题者也相当意外。
在题目中，名叫雪莉（Cheryl）又译雪莉、雪露、雪瑞儿、谢丽尔等。的女生给了她刚认识的朋友艾伯特（Albert）和柏纳（Bernard）一些有关她生日的资讯，读者要根据这些资讯及她朋友的回复判断雪莉的生日。

**起源**
此问题是由新加坡《狮城有约》的电视主持人江坚文贴上Facebook，之后有数千个回复，包括一些有趣的回复，例如认为雪莉根本不希望艾伯特和柏纳知道她的生日，这一题引发了江坚文和他妻子的争论，江坚文误以为这是小学数学考试的一部份，且是针对5至6岁的儿童。江坚文后来更正这是2015新加坡及亚洲学校数学奥林匹克（SASMO）的题目，是针对14岁的学生设计。比赛在2015年4月8日举行，有二万八千名来自新加坡、泰国、越南、中国及英国的学生参加。SASMO的主办人员表示，此问题是针对参赛者中的前40%，目的是为了「筛选出更好的学生」。SASMO的执行董事告诉BBC：「这样的逻辑及分析思考可以用在生活上及工作中。」。

**问题**
此问题是在25个问题中的第24个，问题如下：
2017年，该问题出现一个涉及4个人的版本，更复杂一些，但解题原理相同。

**答案和解法**
谢丽尔的生日是7月16日。
其解法是推理的方式，删去不可能的日期，这也是Alex Bellos在英国的《卫报》解出此题的方式：
可能的生日用表格方式条列如下，将同月的放在同一列，同日的放在同一栏：
（第一句话）艾伯特：我不知道雪莉的生日是哪一天，但我知道柏纳也不知道。
艾伯特知道的是月份，而每一个月都有一个以上的可能日期，不论艾伯特知道的月份是哪一个月，都不可能会知道雪莉的生日，第一句话的前半没有提供有关生日的资讯。
柏纳若要知道明确的生日日期，唯一的可能是生日日期的日在十个可能日期中只出现过一次，十个可能日期中，只有18日和19日各出现过一次，例如若柏纳知道生日的日是18或是19，就可以立刻推理得到生日是6月18日或5月19日。
但艾伯特说他知道柏纳也不知道生日是哪一天，因此可以推测他知道的月份是5月或6月以外的月份（即7月或8月），因为若是5月或6月，柏纳有可能知道生日是哪一天。
（第二句话）柏纳：一开始我不知道雪莉的生日，但现在我知道了
根据第一句话柏纳可以推测月份是7月或8月，而他已经知道生日是哪一天，表示他知道的日是在7月或8月中只出现过一次的日，因此可以排除7月及8月可能生日中都有出现的14日，柏纳知道的日可能是15日、16日或17日。
（第三句话）艾伯特：那我也知道雪莉的生日了
目前还有可能的生日是7月16日、8月15日及8月17日，而艾伯特在听完第二句话就可以知道生日是哪一天，表示他知道的月份在7月16日、8月15日及8月17日中只出现一次。因此他知道的月份是7月，生日是7月16日。
答案是7月16日。

**对题意的另一种理解**
除了上述答案外，有些人认为8月17日也是一个可能的答案。但新加坡及亚洲学校数学奥林匹克认为此答案无效。

**存在争议之处**
造成对题意存在不同理解的原因是题目的表述不够准确，至少在避免歧义方面做得不够完善。“但我知道柏纳也不知道”这一句的英文原文“but I know that Bernard doesn't know too”就存在此问题。所以这是一个英文语言表达与理解的问题。一些人觉得此处的“知道柏纳也不知道”是指“能很有把握地猜测柏纳也不知道”，而另一些人则认为应该是指“已经由某种方式准确地知晓柏纳确实不知道的事实”。其实联系上下文就可以发现，出题人在文中此处所指（或暗示）的应该是前一种意思，即艾伯特只是在进行“猜测”，而非已知晓部分事实。
一般来说，数理内容的叙述要尽量措辞准确，避免引起可能的歧义，但以此题来说，艾伯特是否事先知道有关柏纳所知的部分事实，会干扰他自己第一步的思路，从而将这个推理过程最终引向完全不同的方向，如下所示。

**另一种理解的推理过程（版本1）**
（第一句话）艾伯特：我不知道谢丽尔的生日是哪一天，但我知道柏纳也不知道。
艾伯特知道的是月份，而每一个月都有一个以上的可能日期，不论艾伯特知道的月份是哪一个月，都不可能会知道谢丽尔的生日，第一句话的前半没有提供有关生日的资讯。
柏纳若要知道明确的生日日期，唯一的可能是生日日期的日在十个可能日期中只出现过一次，十个可能日期中，只有18日和19日各出现过一次，例如若柏纳知道生日的日是18或是19，就可以立刻推理得到生日是6月18日或5月19日。因此，首先排除6月18日和5月19日这两天。
注意到，这时6月只剩下17日这一天。如果艾伯特知道的月份是6月，那幺这时他已经知道了谢丽尔的生日。但艾伯特并不知道，所以又排除6月17日这一天。
（第二句话）柏纳：一开始我不知道谢丽尔的生日，但现在我知道了。
根据第一句，剩余的日期中，14日、15日和16日分别出现在两个月中，只有17日只出现在8月。现在柏纳知道了谢丽尔的生日，这表明柏纳知道的日期是17日，所以谢丽尔的生日是8月17日。
（第三句话）艾伯特：那我也知道谢丽尔的生日了。
艾伯特也知道只有17日是唯一的，因此在听到第二句话之后，艾伯特也知道了谢丽尔的生日是8月17日。
答案是8月17日。

**另一种理解的推理过程（版本2）**
下面假设“艾伯特在说第1句话时已经由某种方式准确地知晓柏纳确实不知道的事实”，并指出此情形下的解法以及与前一种情形的步骤差异。
如果艾伯特在第1次讲话前事先被人明确告知柏纳根据自己所知的日期推不出生日，则第1步可排除18日与19日。但是此情形下柏纳得知的日期是仍有可能属于5月或6月的，只不过不可能是在18日或19日。（与在第1步就可排除掉2行的上1种情况相比，区别在于在此情形的第1步只能排除2个可能选项。换句话说，这一种情形下在第1步排除的选项要少很多。）而在排除18日与19日后，在剩下的选项中，仅有6月17日可由月份数唯一确定。但此时艾伯特作出了“我还不知道”的判断。说明生日也不可能在6月17日。
足够聪明的柏纳也是这幺想的。而且在听到艾伯特还推不出生日时，表示自己已经推出了答案。说明在上一步所剩的各个选项中，已经能由日期唯一地确定出生日，但尚不能仅月份确定。也就是说，在剩下来的选项中，生日的月份数一定出现了不只一次，但日期数一定只出现了一次。唯一符合这条件的选项只有8月17日。（14日、15日、16日都在不同月份中出现了2次，仅17日出现了1次（出现在8月）；另外，8月此时也确实有3个不同的候选日期。故生日应为8月17日。）

**2种情形的解法步骤比较**
对比7月16日和8月17日两种答案的推理过程，可以知道：
*根据第一句话首先排除的是5月和6月这两个月份，而不仅仅是5月19日和6月18日这两天。
*8月17日的推理过程隐含了对第一句话的错误理解，即理解成了“因为艾伯特知道柏纳不知道谢丽尔的生日是哪一天，所以艾伯特也不知道”。6月17日就因为这种理解被排除的。而第一句话的正确理解是“艾伯特不知道谢丽尔的生日是哪一天，并且柏纳也不知道”。
*由于对第一句话内在逻辑的不同理解，出现了版本1；又由于对“知道（know）”一词的不同理解，出现了版本2。
以下各表中以“×”号表示因被排除而被划去的日期。为美观起见，实际操作时，各表还可以简写为数阵的形式。
这一步如果用矩阵语言表述，就是找出独占一列的元素“18日”与“19日”，并根据题意排除它们及其所在行，即划去它们的所在行。
这一步如果用矩阵语言表述，就是找出独占一列的元素“18日”与“19日”，并根据题意排除它们，即划去这2个元素。（不划去所在行的其它元素。）
第二步结果 
上一步完成后，现在只剩下7月和8月这2个可选的月份，即余下的矩阵的行秩为2。这一步的做法用矩阵语言表述就是在余下的矩阵中找出并划去行满秩的列（向量），即划去同时出现在7月和8月的“14日”。因为此时的行满秩向量不能仅由日期做出判断，与题意中“柏纳已经在这一步可由日期唯一推知生日”这一事实不符，故被整列地排除掉。
这一步仍是对艾伯特所说的第1句话的推断。因在上一步操作后，剩下了一个“6月17日”可由月份唯一确定，但艾伯特又肯定说自己还推不出日期，所以“6月17日”可以排除。这一步的做法用矩阵语言表述就是在余下矩阵中找出只在各行出现一次的日期（此例中是“17日”，它是6月里唯一出现的日期），并划其所在行。
第三步结果 
艾伯特在第2次发言时已表示自己也可推出生日，说明在余下的选项中，已经可以由月份唯一确定出生日。这一步的做法用矩阵语言表述就是在余下的矩阵中找出只在各行出现一次的日期（此例中是“16日”，它是7月里唯一出现的日期），并划去其余的行。
柏纳发言时已表示自己也可推出生日，说明在余下的选项中，已经可以由日期唯一确定出生日。这一步的做法用矩阵语言表述就是在余下的矩阵中找出只在各列出现一次的日期（此例中是“17日”，它只在8月出现），并划去其余的列。
注意在这种情形中，艾伯特的第2次发言是多余条件。但艾伯特的第1次发言在推断中应用了2次。

**由此引申出的矛盾**
通过以上推理，可以总结出：如果艾伯特是“猜测”到柏纳不知道谢丽尔的生日，那幺不论日期为15日、16日还是17日，柏纳在听到第一句话后都能“猜测”出谢丽尔的生日；而如果艾伯特“已经由某种方式准确地知晓柏纳确实不知道的事实”，那幺只有当日期为17日时，柏纳才能在听到第一句话之后知道谢丽尔的生日。
于是有了这样一种可能，先假定以下三点：
*艾伯特确实“已经由某种方式准确地知晓柏纳确实不知道的事实”，因此说了第一句话；
*柏纳却把第一句话理解成了艾伯特“能很有把握地猜测柏纳也不知道”；
*谢丽尔的生日是8月15日，告诉了艾伯特8月，又告诉了柏纳15日。
然后，柏纳听到第一句话之后“猜测”出谢丽尔的生日是8月15日，因此说了第二句话。艾伯特按自己的理解说了第三句话，但其实他以为谢丽尔的生日是8月17日。这便是矛盾之处。
实际上，艾伯特在知道8月的情况下，即使不存在“某种方式”，他也可以知道柏纳也不知道。然而，由于“某种方式”的存在，使得艾伯特忽略了这一点。另一方面，柏纳或许没有想到“某种方式”的存在，因而与艾伯特产生误会。
最后，柏纳甚至可能对艾伯特说第四句话：“你怎幺知道是15日还是17日的？”

**推广**
本题可抽象和推广为一类在层层递进的限制条件下，从高维向量空间的有限点集中筛选特定点的问题。为保证问题可解且有唯一的解，作为猜测范围的有限点集必须是精心选取的。
这里以4维情况为例作一个说明。X先生从4维欧几里德空间中精心挑选出一个点集作为参考范围（要保证谜题可解），再从中挑选出一个特定的点作为猜测对象。X先生取的Standard basis作为参考基底，从而中各点都有了唯一的坐标数值。设点在标准基下的坐标表示为。X先生将写在纸片上递给了甲，将写在纸片上递给了乙，将写在纸片上递给了丙，将写在纸片上递给了丁。然后由4人轮流或自由发言，但只能谈及自己是否能准确推知的所有坐标值，或者是否能有把握地预测另一人的推断结果。这里还需要假定这4个参与者都足够聪明，且都在积极思考答案。当所有人都确信自己已可推出答案时（即此问题可解时），再由读者来推断的坐标。
上例所示的4维点集筛选问题可自然地推广至n维。当n=2时，此类问题可用列出数表的方法（先列出一个包含所有参考选项的2维数表，再根据题设条件一步一步划去不符合题意的选项）求解。n≥3时，考察集合已难以用简洁的数表描述，但可视作n维数组或n阶张量（考察集合是点集，点集的坐标当然符合张量变换规律，所以可视作张量），并易于利用计算机编程求解。以2维点集的筛选为例，其算法大体上就是先根据说话人的描述对象（是自己的猜测还是对别人的猜测）所属的组别确定是筛选行向量还是列向量，并根据说话人的判断情况选择是划去选出的子向量组还是划去未选中的向量组。然后根据说话人的发言顺序逐步循环筛选下去。因为对话数量是有限的，所以只要题目所设条件信息充分，在有限步骤内一定可以完成筛选循环。求解答案的算法实际上也是判断可解性的算法，如果到最后一个条件用完后还算不出答案，那幺原题一定无解。
除参考集合可以推广至高维向量空间外，求解的对象也可由一个点推广为多个点。即求解的某个元素变为求解的某个子集。当求解的点数增多时，与直接靠脑力思考的方法相比，代数方法仍具有判断速度快和可程序化处理的优势。

**另见**
 和与积的问题

**参考资料与脚注**
分类:2015年新加坡