真值表-Python实现
文章目录
- 实验内容
- 程序设计
- 代码实现
实验内容
- 设命题变元 P1、P2、P3、…、Pn 是出现在公式 G 中的所有命题变元,指定 P1、 P2、P3、…、Pn的一组真值,则这组真值称为 G 的一个解释或指派,常记为I
- 真值表:公式 G 在其所有可能的解释下所取真值的表
本实验要求从键盘输入一个命题公式列出其真值表。
程序设计
实现真值表难点在于:
- 对变元的 T(True) F(False) 的枚举,相当于未知阶的嵌套循环,对此应用递归解决。
对此首先找到递归结束的标志,即把所有变元的TF都枚举出来 - 找到命题包含的变元很简单,只需要构造一个集合,或者使用列表
- 对于中缀表达式转换后缀表达式,请参考后缀表达式
代码实现
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实现相关推荐
- TruthTable真值表---python
今天研究下truth table,算法鸽一天(真不是我懒,相信我QAQ 代码整体框架基本是借照这位老哥写的真值表-Python实现 不得不说这位老哥对递归吃的很透彻,意想不到的用法,其他代码的写法也给 ...
- 两片8-3优先编码器转化为16-4线优先编码器真值表--python实现
假设有0号和1号编码器 0号输入端从I00'到I07' 1号编码器输入端I11'到I17' 输出为Z3'~Z0' 0号编码器控制1号编码器 当0号编码器无输入信号时,1号编码器开始工作 实现代码: # ...
- 真正的自由是节制欲望自律简朴地去生活
卢梭说:"人生而自由,却无往不在枷锁中."自由无价,但人总是不免困于世俗.困于心.困于情,有执着和偏见,更有痛苦.徘徊与挣扎.每个人都在寻找自由的出口,期望抵达心灵的港湾. 生命的 ...
- python实现真值表
python实现真值表 import copydef boo(x,leng,listboo,array): #递归实现布尔真值全排列if x==leng:for i in range (0,leng) ...
- 使用python输出真值表
首先创建一个类,利用python自身的优势对表达式进行解析 # &为合取,v为析取,~为非,>为条件联结词,*为双条件联结词 class Variable:def __init__(se ...
- python - 根据表达式打印真值表
输入逻辑表达式,输出真值表,支持六个基本逻辑运算 最终效果: 输入合适公式(没有考虑优先级,只根据括号优先),输出时会提取其中的元素(比如这里有A B C),并打印真值表. 算法思路: 求值 ...
- python 中的真值表
逻辑术语 and :与 or:或 not :非 !=:不等于 ==:等于 =:大于等于 <=:小于等于 True:真 False:假 not 真假 not False True not True ...
- 一个 零差评的 Python 内置库
前言 最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了. 很多人都致力于把Python代码写得更 ...
- 计算机编程书籍-笨办法学Python 3:基础篇+进阶篇
编辑推荐: 适读人群 :本书适合所有已经开始使用Python的技术人员,包括初级开发人员和已经升级到Python 3.6版本以上的经验丰富的Python程序员. "笨办法学"系列, ...
- python学习笔记之运算符
目录 前言 软件环境 身份运算符 算术运算符 比较运算符 位移运算符 自变运算符 位运算符 逻辑运算符 成员关系运算符 Python真值表 最后 前言 在前面的博文介绍了Python的数据结构之后,接 ...
最新文章
- 关于mouseenter、mouseover、mouseout、mouseleave的理解
- Nginx——location配置
- 从具体案例了解知识图谱
- HP一年升两年保修实例!(附图片)
- 九坤投资投身基础科研,携手IDEA成立联合实验室
- 浅谈零样本网络表示学习
- cartographer学习笔记--如何保存cartagrapher_ros建好的地图
- art-template入门(三)之语法
- 创建 多个 MySQL docker 出现错误时
- VMware Workstation Pro 导出OVF模板
- 玩机搞机---mtk芯片机型线刷救砖的一些基本解决方法和步骤解析 mtk报错代码 SP_Flash平台刷机
- 学习Java面向对象编程和设计模式最好的5本书
- 解决sysman.mgmt_task_qtable ORA-600 kdsgrp1错误
- 好记性不如烂笔头之Maven使用小记
- android虚拟机固定横屏幕竖屏,用VBox虚拟机安装Android 屏幕90度翻转竖屏设置
- web app 第三方登录-微博登录(一)
- 企业如何制作自己的公司网站?
- Web安全(任意文件下载)
- RCNN系列发展历程
- 西安市版权申请代理公司怎么选,哪些类型作品受版权保护?
热门文章
- 群晖系统设定定时NTP同步时间
- 基于Sobel算法的边缘检测简介
- 全年日降雨数据下载与处理教程
- 值得收藏的103个中文字体下载
- 工业软件深度:中国PLM/MES/SCADA/DCS格局与主要玩家分析~
- tomcat的access日志配置
- 计算机控制技术毕业论文题目,计算机控制方面论文选题 计算机控制论文题目怎样定...
- 使用jQuery播放/暂停 HTML5视频
- GB28181国标流媒体服务(LiveGBS)-支持海康8700等联网网关通过接入实现web端无插件直播
- linux测试硬盘速度命令,Linux下的硬盘读写速度测试