python求主范式

目录

一、主要思路

二、主要步骤

1.输入所求的式子

2.化简所求的式子

3.求得真值表的所有情况

 4.进行计算,得出结果

三.代码实现

四.运行结果


我们已经学习了主范式的相关知识,为了更加简便的求出主范式,可以用下面这个代码求,会变得更加简单。

一、主要思路

先化简输入的式子,比如:条件,双条件等无法被计算机直接计算,所以我们可以对式子进行化简。然后通过真值表便可以自然求出主析取范式和主合取范式了。

二、主要步骤

1.输入所求的式子

 

2.化简所求的式子

3.求得真值表的所有情况

 

 4.进行计算,得出结果

三.代码实现

aInput=''#输入的命题公式字符串
aHuajian=''#化简后的sInput
va=[]#保存公式中的变量
xiqu=[]#主吸取范式最小项
hequ=[]#主合取范式最大项
fo=''#符号前面的部分
ba=''#符号后的部分
def myinput():#输入所求命题式子
    global aInput
    print("请输入一个任意命题公式('~'表示非,'&'表示合取,'|'表示析取,'>'表示条件,'<'表示双条件,'@'表示异或,可以有括号哦!):")
    aInput=input()
def getva():#获取其中每一部分
    global aInput,va
    for c in aInput:
        if c >='A'and c <='Z'or c >='a'and c<='z':
            if c not in va:
                va.append(c)
            elif c!='~'and c!='&'and c!='|'and c!='('and c!=')'and c!='>'and c!='<'and c!='@':
                print('输入错误!')
    va=sorted(va)
def getFB(c):
    global aInput,aHuajian,fo,ba
    alen=len(aHuajian)
    for i in range(0,alen):#遍历aHuajian中的所有字符
        if aHuajian[i] == c:
            if aHuajian[i-1] != ')':#找到fo
                fo=aHuajian[i-1]
            else:
                flag=1
                j=i-1
                while flag != 0:
                    if aHuajian[j] == '~':
                        j-=1
                    if aHuajian[j] == '(':
                        flag-=1
                    if aHuajian[j] == ')':
                        flag+=1
                    j-=1
                fo=aHuajian[j+1:i]
            if aHuajian[i+1] != '(':#找到ba
                ba=aHuajian[i+1]
            else:
                flag=1
                j=i+2
                while flag != 0:
                    if aHuajian[j] == '~':
                        j+=1
                    if aHuajian[j] == ')':
                        flag-=1
                    if aHuajian[j] == '(':
                        flag+=1
                    j+=1
                ba=aHuajian[i+1:j]
            if c == '>':
                aHuajian=aHuajian.replace(fo+'>'+ba,'('+'~'+fo+'|'+ba+')')
            elif c == '<':
                aHuajian=aHuajian.replace(fo+'<'+ba,'('+fo+'&'+ba+')|(~'+fo+'&~'+ba+')')
            elif c == '@':
                aHuajian=aHuajian.replace(fo+'@'+ba,'~('+'('+fo+'&'+ba+')|(~'+fo+'&~'+ba+')'+')')
def huajianinput():
    global aInput,aHuajian
    aHuajian=aInput
    getFB('>')
    getFB('<')
    getFB('@')
def cal():
    global aInput,aHuajian,va,xiqu,hequ,xiqujieguo,hequjieguo
    vlen=len(va)#变量个数
    n=2**vlen#所有情况个数
    print('真值表如下图所示:')
    print(va,aInput+'即',aHuajian)
    for n1 in range(0,n):#遍历所有的情况
        value=[]#数值
        j=n1#真值表当前行
        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))#将value中的数字变成字符形式,此时仍为一个列表
        a=aHuajian#将化简后的式子赋值给a
        for x in range(0,vlen):#遍历所有变量
            a=a.replace(va[x],value[x])#用数字字符代替变量,那样计算机就可以进行计算了。p&q&r这些无法计算但是0&1可以计算
        result=eval(a)&1#将字符变为数字
        if result == 1:
            xiqu.append(n1)
        else:
            hequ.append(n1)
        print(value,result)
        
def outprint():
    print('主析取范式:')
    print('求和',xiqu,sep='')
    print('主合取范式:')
    print('求积',hequ,sep='')
def main():
    myinput()
    getva()
    huajianinput()
    cal()
    outprint()
if __name__=='__main__':
    main()

    

            

四.运行结果

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值