离散数学——命题逻辑代码实现

用代码(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))

你可能感兴趣的:(python)