本篇探讨的是一道逻辑演算推理题。有两种方法,一种是常规的离散数学逻辑演算,另一种则是用python程序来解决。本篇将探究两种方法: python+离散数学→逻辑演算。
问题 在某次研讨会的中间休息时间,3名与会者根据王教授的口音对他是哪个省市的人判断如下: 甲:王教授不是苏州人,是上海人 乙:王教授不是上海人,是苏州人 丙:王教授既不是上海人,也不是杭州人 听完这3人的判断后,王教授笑着说,你们3人中有一人说得全对,有一人说对了一半,另一人全不对。试用逻辑演算分析王教授到底是哪里人.
常规推理
设命题 p:王教授是苏州人; q:王教授是上海人; r:王教授是杭州人;
用p,q,r表示甲乙丙的观点如下:
甲:¬p∧q
乙:p∧¬q
丙:¬q∧¬r
其中一人全对,一人对一半,另一人全错。
即其中一个真命题,两个假命题。先找真命题
甲全对:B1=¬p∧q
甲对一半:B2=(¬p∧¬q) ∨(p∧q)
甲全错:B3=p∧¬q
乙全对:C1= p∧¬q
乙对一半:C2=(¬p∧¬q) ∨(p∧q)
乙全错:C3=¬p∧q
丙全对:D1=¬q∧¬r
丙对一半:D2=(q∧¬r) ∨( ¬q∧r)
丙全错:D3=q∧r
有王教授那句话可以写:
E=(B1∧C2∧D3)∨(B1∧C3∧D2) ∨(B2∧C1∧D3) ∨(B2∧C3∧D1) ∨(B3∧C1∧D2) ∨(B3∧C2∧D1)
是真命题
而B1∧C2∧D3⇔(¬p∧q) ∧((¬p∧¬q) ∨(p∧q)) ∧(q∧r)
⇔(¬p∧q) ∧((¬p∧¬q) ∧(q∧r) ∨ (p∧q) ∧(q∧r))
⇔(¬p∧q) ∧(0∨(p∧q∧r))
⇔(¬p∧q)∧(p∧q∧r)
⇔0
其他同理类似可得:
B1C3D2⇔¬p∧q∧¬r
B2C1D3⇔0
B2C3D1⇔0
B3C1D2⇔p∧¬q∧r
B3C2D1⇔0
所以E⇔(¬p∧q∧¬r) ∨(p∧¬q∧r)
而pqr中只能有一个是真的,所以p∧q⇔0,p∧r⇔0,q∧r⇔0
E⇔(¬p∧q∧¬r) ∨0
⇔¬p∧q∧¬r
⇔1
所以p为假,q为真,r为假,王教授是上海人。
python程序实现 以下是上述过程的代码实现,并附有代码详解,有兴趣的小伙伴可以看一看。
for p in range(2): #p:王教授是苏州人
for q in range(2): #q:王教授是上海人
for r in range(2): #r:王教授是杭州人
#以下三行表示p,q,r不可能同时为真的情况
if (p == 1 and q == 1): continue
if (p == 1 and r == 1): continue
if (q == 1 and r == 1): continue
Jia = (not p) and q #甲的判断
Yi = p and (not q) #乙的判断
Bing = (not q) and (not r) #丙的判断
B1 = (not p) and q #甲的判断全对
B2 = ((not p) and (not q))or (p and q) #甲的判断一半对
B3 = p and (not q) #甲的判断全错
C1 = p and (not q) #乙的判断全对
C2 = (p and q) or ((not p) and (not q)) #乙的判断一半对
C3 = (not p) and q #乙的判断全错
D1 = (not q) and (not r) #丙的判断全对
D2 = ((not q) and r) or (q and(not r)) #丙的判断一半对
D3 = q and r #丙的判断全错
#王教授所说的话
E = (B1 and C2 and D3) \
or(B1 and C3 and D2) \
or(B2 and C1 and D3) \
or(B2 and C3 and D1) \
or(B3 and C1 and D2) \
or(B3 and C2 and D1)
#符合王教授所的E值
if E==1 :
print("%d,%d,%d E=%d,Jia=%d,Yi=%d,Bing=%d"%(p,q,r,E,Jia,Yi,Bing))
总结 其实用python解决离散数学的逻辑推理题比直接推理效率更高而且准确性也高,并且在遇到复杂的逻辑推理时,很容易把自己绕晕,半天也解不出来,倒不如我们可以让计算机帮我们解决,只需写几十行代码,就可以罗列出复杂的关系,何乐而不为呢,所以我们可以多学学这种解题方法!?