cxy229

任意输入一个命题公式,计算并输出其真值表以及主析取范式,主合取范式

思路:大概就是将蕴含,等价,异或进行转化,然后使用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()

运行结果:

result

分类:

技术点:

相关文章:

  • 2021-11-28
  • 2022-12-23
  • 2022-12-23
  • 2021-10-20
  • 2021-08-29
  • 2021-09-13
  • 2021-11-07
  • 2021-11-04
猜你喜欢
  • 2021-12-18
  • 2022-01-02
  • 2021-12-18
  • 2022-01-02
  • 2022-12-23
  • 2021-12-18
相关资源
相似解决方案