离散数学:用python解决逻辑推理问题

目录

前言

一、王教授是哪里人

1.题目

2.代码实现

3.运行结果

 二、谁是班委

1.题目

2.代码实现

3.运行结果

三、谁出国学习

1.题目

2.代码实现

3.运行结果

总结


前言

离散数学(第2版)

使用python实现命题逻辑等值演算应用题。


一、王教授是哪里人

1.题目

在某次研讨会的中间休息时间,3名与会者根据王教授的口音对他是哪个省市的人判断如下:

甲:王教授不是苏州人,是上海人。
乙:王教授不是上海人,是苏州人。
丙:王教授既不是上海人,也不是杭州人。

听完这3人的判断后,王教授笑着说,你们3人中有一人说得全对,有一人说对了一半,另一人说得全不对。分析王教授到底是哪里人。(书本P25)

2.代码实现

代码如下:

# p:是苏州人 q:是上海人 r:是杭州人
ls = [0, 1]
for p in ls:
	for q in ls:
		for r in ls:
			A1 = not p and q
			A2 = (not p and not q)or(p and q)
			A3 = p and not q  # 甲的话的三种情况
			B1 = p and not q
			B2 = (p and q)or(not p and not q)
			B3 = not p and q  # 乙的话的三种情况
			C1 = not q and not r
			C2 = (not q and r)or(q and not r)
			C3 = q and r  # 丙的话的三种情况
			if ((A1 and B2 and C3) or (A1 and B3 and C2) or (A2 and B1 and C3) or\
				(A2 and B3 and C1) or (A3 and B1 and C2) or (A3 and B2 and C1)) == 1\
				and p+q+r == 1:  # 成立一项
				if p == 1:
					print('王教授是苏州人.')
				if q == 1:
					print('王教授是上海人.')
				if r == 1:
					print('王教授是杭州人.')

3.运行结果


 二、谁是班委

1.题目

在某班班委成员的选举中,已知王小红、李强、丁金生三位同学被选进了班委会。该班的甲,乙,丙三名同学预言如下:

甲:王小红为班长,李强为生活委员。
乙:丁金生为班长,王小红为生活委员。
丙:李强为班长,王小红为学习委员。

班委会分工名单公布后发现,甲、乙、丙三人都恰好猜对了一半,问:王小红、李强、丁金生各任何职。(书本P45)

2.代码实现

代码如下:

#  班长:b 生活委员:s   王小红:w 李强:li 丁金生:d
ls = ['b', 's', 'x']
for w in ls:
   for li in ls:
      for d in ls:
         W1 = (w == 'b')  # 王小红为班长
         L1 = (li == 's')  # 李强为生活委员
         D1 = (d == 'b')  # 丁金生为班长
         W2 = (w == 's')  # 王小红为生活委员
         L2 = (li == 'b')  # 李强为班长
         W3 = (w == 'x')  # 王小红为学习委员
         A1 = W1 and not L1
         A2 = not W1 and L1  # 甲
         B1 = D1 and not W2
         B2 = not D1 and W2  # 乙
         C1 = L2 and not W3
         C2 = not L2 and W3  # 丙
         if ((A1 and B1 and C1) or (A1 and B1 and C2) or (A1 and B2 and C1) or (A1 and B2 and C2) or \
            (A2 and B1 and C1) or (A2 and B1 and C2) or (A2 and B2 and C1) or (A1 and B2 and C2)) == 1 \
                 and W1+D1+L2 == 1 and L1+L2 == 1:  # 排除互斥项
            if W1 == 1:
               print('王小红为班长.')
            if L1 == 1:
               print('李强为生活委员.')
            if D1 == 1:
               print('丁金生为班长.')
            if W2 == 1:
               print('王小红为生活委员.')
            if L2 == 1:
               print('李强为班长.')
            if W3 == 1:
               print('王小红为学习委员.')

3.运行结果


三、谁出国学习

1.题目

某公司要从赵、钱、孙、李、周五名新毕业的大学生中选派一些人出国学习。选派中必须满足以下条件:

1)若赵去,则钱也去。
2)李、周两人中必有一人去。
3)钱、孙两人中去且仅去一人。
4)孙、李两人同去或同不去。
5)若周去,则赵、钱也同去。

该公司如何选派他们出国。(书本P45)

2.代码实现

# p:赵去 q:钱去 r:孙去 s:李去 t:周去
ls = [0, 1]
for p in ls:
	for q in ls:
		for r in ls:
			for s in ls:
				for t in ls:
					A = not p or q
					B = s or t
					C = (not q and r) or (q and not r)
					D = (r and s) or (not r and not s)
					E = (p and q) or not t
					if (A and B and C and D and E) == 1:
						if p == 1:
							print('赵去', end=' ')
						if q == 1:
							print('钱去', end=' ')
						if r == 1:
							print('孙去', end=' ')
						if s == 1:
							print('李去', end=' ')
						if t == 1:
							print('周去')
						print()

3.运行结果

 即要么孙李去,要么赵钱周去。


总结

根据提示将关键语句进行分类讨论。

注意其他特殊情况出现并将其排除。

  • 13
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值