用代码(Python)实现离散数学中有关命题逻辑的习题
例1:张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎
已知三个人中只有一个人说了真话,那么是谁说了真话?
# ls = [0,1]
# for z in ls:
# for li in ls:
# for w in ls:
# s1=(li==1)
# s2=(w==1)
# s3=(z+li==2)
# if(s1+s2+s3==2 and z+li+w==1)\k
# or(s1+s2+s3==1 and z+li+w==2)\
# or(s1+s2+s3==0 and z+li+w==3):
# print("z:{} li:{} w:{}".format(z,li,w))
# 张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎
# 三个人中只有一个人说了真话
# p:张三说了真话
# q:李四说了真话
# r:王五说了真话
# A:not q
# B:not r
# C:(not p) and (not q)
for p in range(2):
for q in range(2):
for r in range(2):
#排除两个人同时说真话的情况
if (p==1 and q==1): continue
if (p==1 and r==1): continue
if (q==1 and r==1): continue
#将所说三句话表示为A,B,C三个命题
A = not q
B = not r
C = (not p) and (not q)
#用E表示题目,且E为真命题
E = ((not A) and (not B) and C) \
or ((not A) and B and (not C)) \
or (A and (not B) and (not C))
if E == 1:
print("%d,%d,%d"%(p,q,r))
例2:在某次研讨会的中间休息时间,3名与会者根据王教授的口音对他是哪个省市的人判断如下:
甲:王教授不是苏州人,是上海人
乙:王教授不是上海人,是苏州人
丙;王教授既不是上海人,也不是杭州人
王教授说甲乙丙三人中,有一人说得全对,有一人说对了一半,另一人说得全不对
#在某次研讨会的中间休息时间,3名与会者根据王教授的口音对他是哪个省市的人判断如下:
#甲:王教授不是苏州人,是上海人
#乙:王教授不是上海人,是苏州人
#丙;王教授既不是上海人,也不是杭州人
#王教授说甲乙丙三人中,有一人说得全对,有一人说对了一半,另一人说得全不对
for p in range(2):
for q in range(2):
for r in range(2):
# 以下三行表示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)
if E==1:
print("%d,%d,%d E=%d,Jia=%d,Yi=%d,Bing=%d"%(p,q,r,E,Jia,Yi,Bing))
例3: 在某班班委成员的选举中,已知王小红、李强、丁金生三位同学被选进了班委会。该班的甲、乙、丙三名同学预言如下:
甲说:王小红为班长,李强为生活委员
乙说:丁金生为班长,王小红为生活委员
丙说:李强为班长,王小红为学习委员
班委会公布名单后发现:甲乙丙三人都恰好猜对了一半。问:王小红、李强、丁金生各任何值
# 在某班班委成员的选举中,已知王小红、李强、丁金生三位同学被选进了班委会。该班的甲、乙、丙三名同学预言如下:
# 甲说:王小红为班长,李强为生活委员
# 乙说:丁金生为班长,王小红为生活委员
# 丙说:李强为班长,王小红为学习委员
# 班委会公布名单后发现:甲乙丙三人都恰好猜对了一半。问:王小红、李强、丁金生各任何值
# 设命题:
# a:王小红为班长
# b:李强为生活委员
# c:丁金生为班长
# d:王小红为生活委员
# e:李强为班长
# f:王小红为学习委员
for a in range(2):
for b in range(2):
for c in range(2):
for d in range(2):
for e in range(2):
for f in range(2):
if (a == 1 and c == 1): continue
if (a == 1 and d == 1): continue
if (a == 1 and f == 1): continue
if (b == 1 and d == 1): continue
if (b == 1 and e == 1): continue
Jiang = a and b
Yi = c and d
Bing = e and f
Q = ((not a) and b) or (a and (not b)) #甲猜对了一半
R = ((not c) and d) or (c and (not d)) #乙猜对了一半
S = ((not e) and f) or (e and (not f)) #丙猜对了一半
E = Q and R and S
if E ==1:
print("%d,%d,%d,%d,%d,%d"%(a,b,c,d,e,f))