#coding=utf-8
my_input = '' #輸入字符串,即輸入的原始命題
all_letters = [] #命題中所有的字母
my_parse = ''
hequ_result=[]
xiqu_result=[]
def getInput():
global my_input
print u'\n 請輸入任意一個命題,規則如下:'
print u" 1.'~'表示非"
print u" 2.'&'表示合取"
print u" 3.'|'表示析取 "
print u" 4.'>'表示蘊含 "
print u" 5.':'表示等價 "
print u" 6.'@'表示異或"
print u" 7.可以使用括號'()'"
print u" 8.優先級爲'()'-->'~'-->'&'-->'|'-->'@'--> '>'"
print u' o((>ω< ))o\n'
my_input = raw_input(' ')
def check(): #判斷是否存在非法字符和查找所有字符並排序
global my_input,all_letters
all_letters=[]
for c in my_input:
if c>='A'and c<='Z' or c>='a' and c<='z':
if c not in all_letters:
all_letters.append(c)
elif c not in ['~','&','|','(',')','>',':','@']:
print u'\n ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)\n' #存在非法字符返回警告
print u' 非法字符知道嗎, o(* ̄▽ ̄*)o \n'
return 0
all_letters = sorted(all_letters) # 字母按字典序排列
return 1
def getPriority(c): #獲取字符的優先級
if c is '~':
return 1
if c is '&':
return 2
if c is '|':
return 3
if c is '@':
return 4
if c is '>':
return 5
if c is ':':
return 6
if c in ['(',')']:
return 7
return 0
def parseChar(c): #解析 聯結詞 將其轉化爲與或非形式
global my_parse
p_len = len(my_parse)
for i in range(0,p_len):
fore = '' #聯結詞 前面的命題
back = '' #聯結詞 後面的命題
if my_parse[i] is c:
j=i-1
flag = 0
while j>=0 and (getPriority(my_parse[j])<getPriority(c) or my_parse[j] == ')'):
if my_parse[j] is ')': #如果存在括號,將括號內的整個式子作爲命題
flag+=1
while flag>0:
fore= my_parse[j]+fore
if my_parse[j] is '(':
flag-=1
j-=1
else:
fore= my_parse[j]+fore
j-=1
j=i+1
flag = 0
while j<p_len and (getPriority(my_parse[j])<getPriority(c) or my_parse[j] == '('):
if my_parse[j] is '(': #如果存在括號,將括號內的整個式子作爲命題
flag+=1
while flag>0:
back= back+my_parse[j]
if my_parse[j] is ')':
flag-=1
j+=1
else:
back= back+my_parse[j]
j+=1
if c is '>': #轉換蘊含聯結詞
my_parse = my_parse.replace(fore+'>'+back,'('+'~'+fore+'|'+back+')')
elif c is ':':#轉換等價聯結詞
my_parse = my_parse.replace(fore+':'+back,'('+fore+'&'+back+')|(~'+fore+'&~'+back+')')
elif c is '@': #轉換異或聯結詞
my_parse = my_parse.replace(fore+'@'+back,'~('+'('+fore+'&'+back+')|(~'+fore+'&~'+back+')'+')')
def parseInput(): #解析所有聯結詞
global my_input,my_parse
my_parse = my_input
parseChar('>')
parseChar(':')
parseChar('@')
def getValueSheet(): #獲取真值表
global my_parse,all_letters,hequ_result,xiqu_result
letter_len = len(all_letters) #所有的字母個數
all_values = 2**letter_len #產生的真值表的行數
#判斷是否存在非法命題,或者錯誤語法
check_string = my_parse
for k in range(0,letter_len):
check_string = check_string.replace(all_letters[k],'0')
try:
result = eval(check_string) & 1
except Exception,e:
return 0
print u'\n<-------------分割線------------>\n'
print u'化簡後的命題公式爲:\n'
print my_input,' ----> ',my_parse
print u'\n<-------------分割線------------>\n'
print u'真值表如圖 \( ̄︶ ̄*\))\n'
print list(map(str,all_letters)),u' 值'
for i in range(0,all_values):
j=i
value = []
for k in range(0,letter_len):
value.append(0)
k=0
while j>0:
value[k]=j%2
j = j/2
k +=1
value.reverse()
this_parse = my_parse
for k in range(0,letter_len):
this_parse = this_parse.replace(all_letters[k],str(value[k]))
result = eval(this_parse) & 1
print list(map(str,value)),' ',result
if result ==1:
xiqu_result.append(i)
else:
hequ_result.append(i)
return 1
def printAll(): #打印命題公式,輸出結果
print u'\n<-------------分割線------------>\n'
print u'主析取範式爲:'
print u'∑',xiqu_result
print u'\n主合取範式爲:'
print u'∏',hequ_result
print u'\n┣G┻F┳ε=ヽ(* ̄▽ ̄)ノ┻W┫'
def main():
getInput()
while check()!=1: #如果命題不合法,重新輸入
getInput()
parseInput()
while getValueSheet()!=1: #如果語法錯誤,重新輸入
print u'\n哼哼,你命題公式不正確,檢查一下吧\n'
printAll()
getInput()
while check()!=1:
getInput()
parseInput()
printAll()
if __name__=='__main__':
main()
命題公式轉化爲主合取範式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.