命題公式轉化爲主合取範式

#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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章