将命题转化为主析取命范式和主合取范式

  1 #coding=utf-8
  2
  3 my_input = ‘‘ #输入字符串,即输入的原始命题
  4 all_letters = [] #命题中所有的字母
  5 my_parse = ‘‘
  6 hequ_result=[]
  7 xiqu_result=[]
  8
  9 def getInput():
 10   global my_input
 11   print u‘\n 请输入任意一个命题,规则如下:‘
 12   print u" 1.‘~‘表示非"
 13   print u" 2.‘&‘表示合取"
 14   print u" 3.‘|‘表示析取 "
 15   print u" 4.‘>‘表示蕴含 "
 16   print u" 5.‘:‘表示等价 "
 17   print u" 6.‘@‘表示异或"
 18   print u" 7.可以使用括号‘()‘"
 19   print u" 8.优先级为‘()‘-->‘~‘-->‘&‘-->‘|‘-->‘@‘--> ‘>‘"
 20   print u‘  o((>ω< ))o\n‘
 21   my_input = raw_input(‘ ‘)
 22
 23 def check(): #判断是否存在非法字符和查找所有字符并排序
 24   global my_input,all_letters
 25   all_letters=[]
 26   for c in my_input:
 27     if c>=‘A‘and c<=‘Z‘ or c>=‘a‘ and c<=‘z‘:
 28       if c not in all_letters:
 29         all_letters.append(c)
 30     elif c not in [‘~‘,‘&‘,‘|‘,‘(‘,‘)‘,‘>‘,‘:‘,‘@‘]:
 31       print u‘\n ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)\n‘     #存在非法字符返回警告
 32       print u‘ 非法字符知道吗, o(* ̄▽ ̄*)o \n‘
 33       return 0
 34   all_letters = sorted(all_letters) # 字母按字典序排列
 35   return 1
 36
 37 def getPriority(c): #获取字符的优先级
 38   if c is ‘~‘:
 39     return 1
 40   if c is ‘&‘:
 41     return 2
 42   if c is ‘|‘:
 43     return 3
 44   if c is ‘@‘:
 45     return 4
 46   if c is ‘>‘:
 47     return 5
 48   if c is ‘:‘:
 49     return 6
 50   if c in [‘(‘,‘)‘]:
 51     return 7
 52   return 0
 53
 54 def parseChar(c): #解析 联结词 将其转化为与或非形式
 55   global my_parse
 56   p_len = len(my_parse)
 57   for i in range(0,p_len):
 58     fore = ‘‘          #联结词 前面的命题
 59     back = ‘‘          #联结词 后面的命题
 60     if my_parse[i] is c:
 61       j=i-1
 62       flag = 0
 63       while j>=0 and (getPriority(my_parse[j])<getPriority(c) or my_parse[j] == ‘)‘):
 64         if my_parse[j] is ‘)‘:   #如果存在括号,将括号内的整个式子作为命题
 65           flag+=1
 66           while flag>0:
 67             fore= my_parse[j]+fore
 68             if my_parse[j] is ‘(‘:
 69               flag-=1
 70             j-=1
 71         else:
 72           fore= my_parse[j]+fore
 73         j-=1
 74       j=i+1
 75       flag = 0
 76       while j<p_len and (getPriority(my_parse[j])<getPriority(c) or my_parse[j] == ‘(‘):
 77         if my_parse[j] is ‘(‘:   #如果存在括号,将括号内的整个式子作为命题
 78           flag+=1
 79           while flag>0:
 80             back= back+my_parse[j]
 81             if my_parse[j] is ‘)‘:
 82               flag-=1
 83             j+=1
 84         else:
 85           back= back+my_parse[j]
 86         j+=1
 87       if c is ‘>‘: #转换蕴含联结词
 88         my_parse = my_parse.replace(fore+‘>‘+back,‘(‘+‘~‘+fore+‘|‘+back+‘)‘)
 89       elif c is ‘:‘:#转换等价联结词
 90         my_parse = my_parse.replace(fore+‘:‘+back,‘(‘+fore+‘&‘+back+‘)|(~‘+fore+‘&~‘+back+‘)‘)
 91       elif c is ‘@‘: #转换异或联结词
 92         my_parse = my_parse.replace(fore+‘@‘+back,‘~(‘+‘(‘+fore+‘&‘+back+‘)|(~‘+fore+‘&~‘+back+‘)‘+‘)‘)
 93
 94 def parseInput(): #解析所有联结词
 95   global my_input,my_parse
 96   my_parse = my_input
 97   parseChar(‘>‘)
 98   parseChar(‘:‘)
 99   parseChar(‘@‘)
100
101 def getValueSheet():  #获取真值表
102   global my_parse,all_letters,hequ_result,xiqu_result
103   letter_len = len(all_letters) #所有的字母个数
104   all_values = 2**letter_len    #产生的真值表的行数
105
106
107   #判断是否存在非法命题,或者错误语法
108   check_string = my_parse
109   for k in range(0,letter_len):
110       check_string = check_string.replace(all_letters[k],‘0‘)
111   try:
112     result = eval(check_string) & 1
113   except Exception,e:
114     return 0
115
116   print u‘\n<-------------分割线------------>\n‘
117   print u‘化简后的命题公式为:\n‘
118   print my_input,‘ ----> ‘,my_parse
119   print u‘\n<-------------分割线------------>\n‘
120   print u‘真值表如图   \( ̄︶ ̄*\))\n‘
121   print list(map(str,all_letters)),u‘ 值‘
122   for i in range(0,all_values):
123     j=i
124     value = []
125     for k in range(0,letter_len):
126        value.append(0)
127     k=0
128     while j>0:
129       value[k]=j%2
130       j = j/2
131       k +=1
132     value.reverse()
133     this_parse = my_parse
134     for k in range(0,letter_len):
135       this_parse = this_parse.replace(all_letters[k],str(value[k]))
136     result = eval(this_parse) & 1
137     print list(map(str,value)),‘ ‘,result
138     if result ==1:
139       xiqu_result.append(i)
140     else:
141       hequ_result.append(i)
142   return 1
143
144 def printAll(): #打印命题公式,输出结果
145   print u‘\n<-------------分割线------------>\n‘
146   print u‘主析取范式为:‘
147   print u‘∑‘,xiqu_result
148   print u‘\n主合取范式为:‘
149   print u‘∏‘,hequ_result
150   print u‘\n┣G┻F┳ε=ヽ(* ̄▽ ̄)ノ┻W┫‘
151
152 def main():
153   getInput()
154   while check()!=1: #如果命题不合法,重新输入
155     getInput()
156   parseInput()
157   while getValueSheet()!=1: #如果语法错误,重新输入
158     print u‘\n哼哼,你命题公式不正确,检查一下吧\n‘
159     printAll()
160     getInput()
161     while check()!=1:
162       getInput()
163     parseInput()
164   printAll()
165
166 main()

时间: 2024-10-12 09:03:10

将命题转化为主析取命范式和主合取范式的相关文章

合(析)取范式转主合(析)取范式--》Java实现

这次老师布置了如下上机作业,不限语言.思前想后,问了几个大神,说了一堆不知道什么鬼的算法名称.... 经过一番百度,发现Java可以包含库然后使用JavaScript的一些函数,其中eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码.http://www.w3school.com.cn/jsref/jsref_eval.asp   想到了如下解决办法.. 1 import javax.script.ScriptEngine; 2 import javax.script

析取 为什么是并集 合取

析取/合取概念应该是从逻辑学里来的, 个人理解:析取表示需要分析才能得出结果,合取是只要符合就得出结果. 举例:合取概念是根据一类事物中单个或多个共同属性形成的概念.例如,“毛笔”这个概念必须具有两个属性,即用“毛制作的”和“写字的工具”.析取概念是根据不同的标准,结合单个或多个属性的形成的概念.例如,“好学生”这个概念可以结合各种属性,如“学习好”.“热爱集体”.“乐于助人”等,一个学生同时具有这些属性固然是好学生,只具有其中两三种属性的也是好学生. 链接:http://bbs.kaoyan.

多线程Beatiful Soup爬取斗鱼所有在线主播的信息

最近看了个爬虫的教程,想着自己也常在斗鱼看直播,不如就拿它来练练手.于是就写了个爬取斗鱼所有在线主播的信息,分别为类别.主播ID.房间标题.人气值.房间地址. 需要用到的工具python3下的bs4,requests,pymongo.我用的IDE是pycharm,感觉这个软件实在太强大,有点离开它什么都不会的感觉,数据库Mongodb,结合pycharm工具可以直接在右侧显示数据. #-*- coding:utf-8 -*- from bs4 import BeautifulSoup impor

ES5-正则表达式-15.10.2.3 析取Disjunction

产生式 Disjunction :: Alternative | Disjunction 按照以下方式解释执行: 解释执行 Alternative 来获得一个 Matcher m1. 解释执行 Disjunction 来获得一个 Matcher m2. 返回一个需要两个参数的内部闭包 Matcher ,参数分别是一个 State x 和一个 Continuation c,此内部闭包的执行方式如下: 调用 m1(x, c) 并令 r 为其结果. 如果 r 不是 failure, 返回 r. 调用

原生爬虫(爬取熊猫直播人气主播排名)

'''' This is a module ''' import re from urllib import request # 断点调试 class Spider(): ''' This is a class ''' # 私有方法 # 匹配所有字符 [\s\S]*? 非贪婪 url='https://www.panda.tv/all?pdt=1.27.psbar-menu.0.1oj9bbkfjbh' root_pattern = '<div class="video-info"

斗鱼爬虫,爬取颜值频道的主播图片和名字

在斗鱼的界面中,如果滚动条没有拉下去,那么下面的图片都只是一条鱼的图片,所以要使浏览器自动拉动滚动条,可以用到python的selenium库, 1.配置浏览器 要使用selenium,还需要安装 chromedriver.exe,这里是使用Chrome浏览器,首先在https://npm.taobao.org/mirrors/chromedriver下这个网址中下载适合自己浏览器版本的chromedriver.exe,然后安装在Chrome浏览器的根目录下 2使用selenium库,获取斗鱼直

离散数学--第二章--范式和命题逻辑推理理论

范式和命题逻辑推理理论 1.命题公式的等值置换规则(等价变形,化简)  合式公式的子式:如果合式公式A的一个子串X也是合式公式,那称X是A的一个子式.  置换规则:设X是合式公式A的一个子式,Y是一个合式公式且Y<=>X,则将A中的子式中的X换成Y,生成的新的式子B,仍为一个合式公式且B<=>A.  用递等式简化证明的书写.  等值演算用于逻辑含义的化简 也可以化简与门或门电路 2.命题公式的重言代入规则 重言代入规则:设A为重言式,p为其中任一原子变量,则将A中p处处替换为另一合

离散数学--2.4 命题逻辑推理理论

2.4 命题逻辑推理理论• 2.4.1 推理的形式结构– 推理的前提与结论,正确推理– 推理定律• 2.4.2 自然推理系统P– 推理规则– 直接证明法, 附加前提证明法,归谬法(反证法), 归结证明法 推理定律——重言蕴涵式    左边是真的,右边就是真的. 7.拒取式:->  非B --> 非A 8.假言三段推理:--->  --> 9.析取三段论:并,有一个是非,  那另一个是原样.

将析取范式转化为主析取范式

1 #coding=utf-8 2 3 my_input = '' #输入命题 4 all_letters=[] #所有字母 5 xiqu_result=[] #主析取结果 6 7 def getInput(): #从键盘获取输入 8 global my_input 9 print u'\n 请输入任意一个命题,规则如下:' 10 print u" 1.'~'表示非" 11 print u" 2.'&'表示合取" 12 print u" 3.'|'