将析取范式转化为主析取范式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将析取范式转化为主析取范式相关的知识,希望对你有一定的参考价值。
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.‘|‘表示析取 " 13 print u" 7.可以使用括号‘()‘" 14 print u" 8.优先级为‘()‘-->‘~‘-->‘&‘-->‘|‘" 15 print u‘ o((>ω< ))o\n‘ 16 my_input=raw_input(‘ ‘) 17 18 def check(): #判断是否存在非法字符和查找所有字符并排序 19 global my_input,all_letters 20 all_letters=[] 21 for c in my_input: 22 if c>=‘A‘and c<=‘Z‘ or c>=‘a‘ and c<=‘z‘: 23 if c not in all_letters: 24 all_letters.append(c) 25 elif c not in [‘~‘,‘&‘,‘|‘,‘(‘,‘)‘]: 26 print u‘\n ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)\n‘ #存在非法字符返回警告 27 print u‘ 非法字符知道吗, o(* ̄▽ ̄*)o \n‘ 28 return 0 29 all_letters = sorted(all_letters) # 字母按字典序排列 30 return 1 31 32 def getValueSheet(): #获取真值表 33 global my_input,all_letters,xiqu_result 34 letter_len = len(all_letters) #所有的字母个数 35 all_values = 2**letter_len #产生的真值表的行数 36 37 38 #判断是否存在非法命题,或者错误语法 39 check_string = my_input 40 for k in range(0,letter_len): 41 check_string = check_string.replace(all_letters[k],‘0‘) 42 try: 43 result = eval(check_string) & 1 44 except Exception,e: 45 return 0 46 47 48 print u‘\n真值表如图 \( ̄︶ ̄*\))\n‘ 49 print list(map(str,all_letters)),u‘ 值‘ 50 for i in range(0,all_values): 51 j=i 52 value = [] 53 for k in range(0,letter_len): 54 value.append(0) 55 k=0 56 while j>0: 57 value[k]=j%2 58 j = j/2 59 k +=1 60 value.reverse() 61 this_parse = my_input 62 for k in range(0,letter_len): 63 this_parse = this_parse.replace(all_letters[k],str(value[k])) 64 result = eval(this_parse) & 1 65 print list(map(str,value)),‘ ‘,result 66 if result ==1: 67 xiqu_result.append(i) 68 return 1 69 70 def printAll(): #打印命题公式,输出结果 71 print u‘\n<-------------分割线------------>\n‘ 72 print u‘主析取范式为:‘ 73 print u‘∑‘,xiqu_result 74 print u‘\nヽ(* ̄▽ ̄)ノ┻W┫‘ 75 76 def main(): 77 getInput() 78 while check()!=1: #如果命题不合法,重新输入 79 getInput() 80 while getValueSheet()!=1: #如果语法错误,重新输入 81 print u‘\n哼哼,你命题公式不正确,检查一下吧\n‘ 82 printAll() 83 getInput() 84 while check()!=1: 85 getInput() 86 printAll() 87 88 main() 89
以上是关于将析取范式转化为主析取范式的主要内容,如果未能解决你的问题,请参考以下文章
数理逻辑命题逻辑的等值演算与推理演算 ( 命题逻辑 | 等值演算 | 主合取 ( 析取 ) 范式 | 推理演算 ) ★★