先看一道逻辑推理题:
你来到两道门口,一道是天堂之门, 一道是地狱之门 。门口都有一个守卫,只知道守卫一个只说假话,一个只说真话。现在你只有一次提问机会,只向一个守卫问一个问题,这个守卫对你的问题,只给出“是”或者”不是“的答案。请问怎么问才能准确进入天堂之门?
如果按照普通逻辑思维去考虑这个问题,估计要花些功夫。令我讶异的是:如果用数学逻辑表达式去描述这个问题时,那么该问题非常轻松得以解答。
假设真话守卫的回答是f=T(x),假话守卫的回答是f=F(x);
x是提问的问题,其中0:“你是地狱之门的守卫吗”,1:“你是天堂之门的守卫吗”;
f是对提问的回答,其中0:“不是”,1:“是”;
那么有如下式子:
T(0)=0,T(1)=1
F(0)=1,F(1)=0
好了,到了关键的步骤,通过逻辑表达式的代入推导有:
T(F(0))=1,T(F(1))=0
F(T(0))=1,F(T(1))=0
因此有:
T(F(x))=F(T(x))=!x
到了这里,结合前置条件,知道如何构建你们的问题了吗?
“另一个守卫会告诉我你是天堂守卫吗?”,那么得到的回答一定与真实相反。
再看看一道稍微复杂点的题目:
有1000桶酒,其中1桶有毒,一旦吃了,毒性会在1周后发作。现在我们用小白鼠做实验,要在1周内找出那桶毒酒,问最少需要多少小白鼠。
事实上,可以把这道题转化为:找到一个映射关系式:f->Y,满足集合[1, 2, ..., x]->[1, 2, 3, ..., 1000]的映射。
童鞋们,我们都是学过模拟电子的人,见过大世面,这个时候有什么我们原本以为已经忘却了但在这个关键时刻仍会从我们的脑海中闪过?没错,就是古老而荣誉的3-8译码器!
3-8译码器可以用3个输入来表述8个状态,在电子中的作用是可以用3个GPIO实现8个片选。原理:每个输入有两种状态:0-低电平,1-高电平,那么3个输入就可以表示8个状态,2^3=8。以下是3-8译码器的VHDL实现片段,可以很清楚看到“3”(输入)和“8”(状态)的映射关系:
WHEN"000"=>Y<="00000001";
WHEN"001"=>Y<="00000010";
WHEN"010"=>Y<="00000100";
WHEN"011"=>Y<="00001000";
WHEN"100"=>Y<="00010000";
WHEN"101"=>Y<="00100000";
WHEN"110"=>Y<="01000000";
WHEN"111"=>Y<="10000000";
假如我们需要状态5("00100000"),那么令输入等于"101"即可。
有童鞋大喊:“我擦!这不就是二进制么!”,没错,本质就是二进制。通过二进制,N个输入,就可以映射到2^N个输出,反言之:2^N个状态可以通过N个输入来表述。
3-8译码器实际上就是毒酒老鼠问题的简化版:
8杯酒,按照1-8编号,用二进制表达就是:001b、010b、011b、100b、101b、110b、111b、000b。8号酒编号其实1000b,这里写成000b,不会有影响。
3个老鼠,按照0、1、2编号,0号老鼠去喝bit[0]=1的酒(001b、011b、101b、111b),1号老鼠去喝bit[1]=1的酒(010b、011b、110b、111b),2号老鼠去喝bit[2]=1的酒(100b、101b、111b)。
如果1号、2号老鼠挂了,那么编号2^1+2^2=6的酒有毒,如果没有老鼠挂掉,那么8号的酒有毒,因为8号酒编号是000b,是没有老鼠去喝的。
如果还觉得模糊,请再想想3-8译码器的实现。
so,开始的那个问题可以简单转换为:2^x>=1000,令x最小。所以x=10,即10个老鼠就可以找到毒酒编号了。1000用二进制表达,只有10位。
亲爱的童鞋们,如你们所见,一些很棘手的问题,经过转换用数学逻辑表述后,很轻松得以解决。
那么这些逻辑表达式难么?我想高中程度都足够了。所以唯一的难点是:现实问题中,如何找到一个切入点,用合适的逻辑表达式去描述这个问题。
我认为这才是最有意义的事情,我们的教育倾向于如何去解决一个现成的逻辑式子,比如“2^x>=1000,令x最小,求x”这类,而不是教导我们如何把现实问题描述成逻辑式子。我们可以记住那么复杂的傅里叶级数公式,可以对一个函数进行傅里叶级数展开。可是我们并没有真正理解它对于信号的意义所在。
我想,懂得并习惯用数学方法/逻辑去描述现实问题才能决定一个人在科学技术领域走多远。
--to be continued...
REFERENCE: