文章目录

  • 实验内容
  • 程序设计
  • 代码实现

实验内容

  1. 设命题变元 P1、P2、P3、…、Pn 是出现在公式 G 中的所有命题变元,指定 P1、 P2、P3、…、Pn的一组真值,则这组真值称为 G 的一个解释或指派,常记为I
  2. 真值表:公式 G 在其所有可能的解释下所取真值的表

本实验要求从键盘输入一个命题公式列出其真值表。

程序设计

实现真值表难点在于:

  1. 对变元的 T(True) F(False) 的枚举,相当于未知阶的嵌套循环,对此应用递归解决
    对此首先找到递归结束的标志,即把所有变元的TF都枚举出来
  2. 找到命题包含的变元很简单,只需要构造一个集合,或者使用列表
  3. 对于中缀表达式转换后缀表达式,请参考后缀表达式

代码实现

operators = ['!','&', '|', '*', '+'] # 按照优先级从高到低的顺序def postfix(elements):global operatorsstack = list()output = list()for ele in elements:if ele not in operators and ele not in ('(',')'): #output.append(ele)# '(' 在运算符中优先级最小,其唯一出栈条件时遇到右括号elif ele == '(':stack.append(ele)# 若是 ) ,则出栈直到遇到 ( ,这里注意: ) 遇到的第一个 ( 一定是匹配的一对elif ele == ')':val = stack.pop()while val !='(':output.append(val)if stack:val = stack.pop()else:breakelif ele in ('&', '|', '*', '+', '!'): # 遇到运算符,比较优先级if len(stack) == 0:stack.append(ele)continue# 比较该运算符与栈顶运算符的优先级,遇到比该运算符优先级大于或等于的则将其弹出,最后将该运算符压栈while (ele == '!' and stack[-1] =='!') or \(ele == '&' and stack[-1] in ('!', '&')) or \(ele == '|' and stack[-1] in ('!', '&', '|')) or \(ele == '*' and stack[-1] in ('!', '&', '|', '*')) or \(ele == '+' and stack[-1] in ('!', '&', '|', '*', '+')):val = stack.pop()output.append(val)if not stack:breakstack.append(ele)while stack: # 当表达式完全处理完之后,把栈中的运算符一一出栈,FILO,转化成后缀表表达式output.append(stack.pop())return ''.join(output)def logicalOp(tmp):idx = 0  # 当前命题元素的位置while len(tmp) > 1:  # 当最后命题仅为真值后,退出循环if tmp[idx] in operators:if tmp[idx] == '!':  # 非# 这里把命题变元进行转换,根据后缀表达式,一定满足idx的前1位或前2位是真值而不是运算符tmp[idx - 1] = 1 if int(tmp[idx - 1]) == 0 else 0tmp[idx:idx + 1] = []  # 子命题结果对原命题覆盖# 每次从头开始对命题处理idx = 0continueelif tmp[idx] == '&':  # 合取tmp[idx] = 1 if int(tmp[idx - 1]) == 1 and int(tmp[idx - 2]) == 1 else 0tmp[idx - 2:idx] = []idx = 0continueelif tmp[idx] == '|':  # 析取tmp[idx] = 0 if int(tmp[idx - 1]) == 0 and int(tmp[idx - 2]) == 0 else 1tmp[idx - 2:idx] = []idx = 0continueelif tmp[idx] == '*':  # 则tmp[idx] = 0 if int(tmp[idx - 2]) == 1 and int(tmp[idx - 1]) == 0 else 1tmp[idx - 2:idx] = []idx = 0continueelif tmp[idx] == '+':  # 当且仅当tmp[idx] = 1 if int(tmp[idx - 2]) == int(tmp[idx - 1]) else 0tmp[idx - 2:idx] = []idx = 0continueidx += 1print(tmp[0])def e(idx):global exprif idx == len(enum): # 递归终止条件为枚举完全部的变元print('\t'.join(list(enum.values())),end='\t') # 打印出枚举情况tmp = ' '.join(expr) # tmp为对命题处理带入真值的中间量for ele in expr:if ele in enum:tmp = tmp.replace(ele, enum[ele])tmp = tmp.split(' ') # 转化成list,由于字符串内部不能修改logicalOp(tmp)returnenum[var[idx]] = '0' # 枚举False,最后在转换为int类型,使得可使用字符串替换,把0,1代入e(idx+1) # 接着对下一位变元枚举enum[var[idx]] = '1' # 枚举Truee(idx+1)if __name__=='__main__':"""Attention :定义:!:非 (单命题变元)&:合取|:析取*:单条件(则)+:双条件(当且仅当)"""print('please input the problem\tExample:  (p*q)&!r  p&q|r*q&!s|r')inp = input('>>>')expr = postfix(inp)  # expr为生成的后缀表达式var = list()  # var为命题变元for item in expr:# 找出变元且不能重复if item not in operators and \item not in var and \item not in ('(', ')'):var.append(item)# 对变元枚举TF字典enum = {}.fromkeys(var)# 打印表头print('\t'.join(var),end='\t')print(inp)# 从第一个变元枚举e(0)
Attention :
定义:
!:非 (单命题变元)
&:合取
|:析取
*:单条件(则)
+:双条件(当且仅当)please input the problem Example:  (p*q)&!r  p&q|r*q&!s|r
>>>p&q|r*q&!s|r
p   q   r   s   p&q|r*q&!s|r
0   0   0   0   1
0   0   0   1   1
0   0   1   0   1
0   0   1   1   1
0   1   0   0   1
0   1   0   1   1
0   1   1   0   1
0   1   1   1   1
1   0   0   0   1
1   0   0   1   1
1   0   1   0   1
1   0   1   1   1
1   1   0   0   1
1   1   0   1   0
1   1   1   0   1
1   1   1   1   1

真值表-Python实现相关推荐

  1. TruthTable真值表---python

    今天研究下truth table,算法鸽一天(真不是我懒,相信我QAQ 代码整体框架基本是借照这位老哥写的真值表-Python实现 不得不说这位老哥对递归吃的很透彻,意想不到的用法,其他代码的写法也给 ...

  2. 两片8-3优先编码器转化为16-4线优先编码器真值表--python实现

    假设有0号和1号编码器 0号输入端从I00'到I07' 1号编码器输入端I11'到I17' 输出为Z3'~Z0' 0号编码器控制1号编码器 当0号编码器无输入信号时,1号编码器开始工作 实现代码: # ...

  3. 真正的自由是节制欲望自律简朴地去生活

    卢梭说:"人生而自由,却无往不在枷锁中."自由无价,但人总是不免困于世俗.困于心.困于情,有执着和偏见,更有痛苦.徘徊与挣扎.每个人都在寻找自由的出口,期望抵达心灵的港湾. 生命的 ...

  4. python实现真值表

    python实现真值表 import copydef boo(x,leng,listboo,array): #递归实现布尔真值全排列if x==leng:for i in range (0,leng) ...

  5. 使用python输出真值表

    首先创建一个类,利用python自身的优势对表达式进行解析 # &为合取,v为析取,~为非,>为条件联结词,*为双条件联结词 class Variable:def __init__(se ...

  6. python - 根据表达式打印真值表

    输入逻辑表达式,输出真值表,支持六个基本逻辑运算 最终效果:     输入合适公式(没有考虑优先级,只根据括号优先),输出时会提取其中的元素(比如这里有A B C),并打印真值表.  算法思路: 求值 ...

  7. python 中的真值表

    逻辑术语 and :与 or:或 not :非 !=:不等于 ==:等于 =:大于等于 <=:小于等于 True:真 False:假 not 真假 not False True not True ...

  8. 一个 零差评的 Python 内置库

    前言 最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了. 很多人都致力于把Python代码写得更 ...

  9. 计算机编程书籍-笨办法学Python 3:基础篇+进阶篇

    编辑推荐: 适读人群 :本书适合所有已经开始使用Python的技术人员,包括初级开发人员和已经升级到Python 3.6版本以上的经验丰富的Python程序员. "笨办法学"系列, ...

  10. python学习笔记之运算符

    目录 前言 软件环境 身份运算符 算术运算符 比较运算符 位移运算符 自变运算符 位运算符 逻辑运算符 成员关系运算符 Python真值表 最后 前言 在前面的博文介绍了Python的数据结构之后,接 ...

最新文章

  1. 关于mouseenter、mouseover、mouseout、mouseleave的理解
  2. Nginx——location配置
  3. 从具体案例了解知识图谱
  4. HP一年升两年保修实例!(附图片)
  5. 九坤投资投身基础科研,携手IDEA成立联合实验室
  6. 浅谈零样本网络表示学习
  7. cartographer学习笔记--如何保存cartagrapher_ros建好的地图
  8. art-template入门(三)之语法
  9. 创建 多个 MySQL docker 出现错误时
  10. VMware Workstation Pro 导出OVF模板
  11. 玩机搞机---mtk芯片机型线刷救砖的一些基本解决方法和步骤解析 mtk报错代码 SP_Flash平台刷机
  12. 学习Java面向对象编程和设计模式最好的5本书
  13. 解决sysman.mgmt_task_qtable ORA-600 kdsgrp1错误
  14. 好记性不如烂笔头之Maven使用小记
  15. android虚拟机固定横屏幕竖屏,用VBox虚拟机安装Android 屏幕90度翻转竖屏设置
  16. web app 第三方登录-微博登录(一)
  17. 企业如何制作自己的公司网站?
  18. Web安全(任意文件下载)
  19. RCNN系列发展历程
  20. 西安市版权申请代理公司怎么选,哪些类型作品受版权保护?

热门文章

  1. 群晖系统设定定时NTP同步时间
  2. 基于Sobel算法的边缘检测简介
  3. 全年日降雨数据下载与处理教程
  4. 值得收藏的103个中文字体下载
  5. 工业软件深度:中国PLM/MES/SCADA/DCS格局与主要玩家分析~
  6. tomcat的access日志配置
  7. 计算机控制技术毕业论文题目,计算机控制方面论文选题 计算机控制论文题目怎样定...
  8. 使用jQuery播放/暂停 HTML5视频
  9. GB28181国标流媒体服务(LiveGBS)-支持海康8700等联网网关通过接入实现web端无插件直播
  10. linux测试硬盘速度命令,Linux下的硬盘读写速度测试