任意输入一个命题公式,计算并输出其真值表以及主析取范式,主合取范式
思路:大概就是将蕴含,等价,异或进行转化,然后使用eval()计算
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
sInput = '' #输入的命题公式字符串
sParse = '' #化简后的sInput
variable = [] #保存公式中的变量
ornl = [] #主析取范式最小项
andnl = [] #主合取范式最大项
fore = '' #符号前面的部分
back = '' #符号后面的部分
def myinput():
global sInput
print("请输入一个任意命题公式(原子命题用字母表示,'~'表示非 '&'表示合取 '|'表示析取 '>'表示蕴含 ':'表示等价 '@'表示异或,可用括号'()'):")
sInput = input()
def getVariale():
global sInput,variable
for c in sInput:
if c >= 'A' and c <= 'Z' or c >= 'a' and c <= 'z' :
if c not in variable:
variable.append(c)
elif c!='~' and c!='&' and c!='|' and c!='(' and c!=')' and c!='>' and c!=':' and c!='@':
print('输入有误!!')
variable = sorted(variable)
def getFB(c):
global sInput,sParse,fore,back
slen = len(sParse)
for i in range(0,slen): #遍历sParse中所有字符
if sParse[i] is c:
if sParse[i-1] is not ')': #找到fore
fore = sParse[i-1]
else:
flag = 1
j = i-2
while flag is not 0:
if sParse[j] is '~':
j-=1
if sParse[j] is '(':
flag-=1
if sParse[j] is ')':
flag+=1
j-=1
fore = sParse[j+1:i]
if sParse[i+1] is not '(': #找到back
back = sParse[i+1]
else:
flag = 1
j = i+2
while flag is not 0:
if sParse[j] is '~':
j+=1
if sParse[j] is ')':
flag-=1
if sParse[j] is '(':
flag+=1
j+=1
back = sParse[i+1:j]
if c is '>':
sParse = sParse.replace(fore+'>'+back,'('+'~'+fore+'|'+back+')')
elif c is ':':
sParse = sParse.replace(fore+':'+back,'('+fore+'&'+back+')|(~'+fore+'&~'+back+')')
elif c is '@':
sParse = sParse.replace(fore+'@'+back,'~('+'('+fore+'&'+back+')|(~'+fore+'&~'+back+')'+')')
def parseInput():
global sInput,sParse
sParse = sInput
getFB('>')
getFB(':')
getFB('@')
def cal():
global sInput,sParse,variable,ornl,andnl,orResult,andResult
vlen = len(variable) #变量个数
n = 2**vlen #所有情况个数
print('真值表如下:')
print(variable,sInput+'即',sParse)
for nl in range(0,n): #获取真值表
value = [] #数值
j = nl #真值表当前行
for i in range(0,vlen):
value.append(0)
i = 0
while j!=0:
value[i]=j%2
j=j//2
i+=1
value.reverse()
value = list(map(str,value))
s = sParse
for x in range(0,vlen):
s = s.replace(variable[x],value[x])
result = eval(s)&1
if result is 1:
ornl.append(nl)
else:
andnl.append(nl)
print(value,result)
def outprint():
print('主析取范式:')
print('∑',ornl,sep='')
print('主合取范式:')
print('∏',andnl,sep='')
def main():
myinput()
getVariale()
parseInput()
cal()
outprint()
if __name__=='__main__':
main()