本篇探讨的是一道逻辑演算推理题。有两种方法,一种是常规的离散数学逻辑演算,另一种则是用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程序实现

        以下是上述过程的代码实现,并附有代码详解,有兴趣的小伙伴可以看一看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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解决离散数学的逻辑推理题比直接推理效率更高而且准确性也高,并且在遇到复杂的逻辑推理时,很容易把自己绕晕,半天也解不出来,倒不如我们可以让计算机帮我们解决,只需写几十行代码,就可以罗列出复杂的关系,何乐而不为呢,所以我们可以多学学这种解题方法!😁