python实现求真值表

global j
e = [[[[] for i in range(3)] for j in range(10)]for k in range(10)]
e[0][0][0]=input()
for j in range(1,10):
    leng=th=0
    for g in range(0,10):
        jump=m=0
        k=len(e[j-1][g][0])
        if k==0 :
            break
        if k==1:
            e[j][th][0]=e[j-1][g][0] 
            th+=1
            continue
        if e[j-1][g][0][0]=='(' and e[j-1][g][0][k-1]==')':
            for i in range(1,k-1):
                if e[j-1][g][0][i]=='(' or i==k-2 :
                    e[j-1][g][0]=e[j-1][g][0][1:k-1]
                    k-=2
                    break
                if e[j-1][g][0][i]==')':
                    break
        for i in range(k-1,-1,-1):
            if e[j-1][g][0][i]==')' :
                m+=1
                continue
            if e[j-1][g][0][i]=='(':
                m-=1
                continue
            if m==0 :
                if e[j-1][g][0][i]=='=' :
                    e[j][th][0]=e[j-1][g][0][0:i]
                    e[j][th+1][0]=e[j-1][g][0][i+1:k]
                    e[j-1][g][2]='='
                    th+=2                   
                    leng+=1
                    jump=1 
                    break
        if jump==1 :
            continue  
        for i in range(k-1,-1,-1):
            if e[j-1][g][0][i]==')' :
                m+=1
                continue
            if e[j-1][g][0][i]=='(':
                m-=1
                continue
            if m==0 :
                if e[j-1][g][0][i]=='>' :
                    e[j][th][0]=e[j-1][g][0][0:i]
                    e[j][th+1][0]=e[j-1][g][0][i+1:k]
                    e[j-1][g][2]='>'
                    th+=2                   
                    leng+=1
                    jump=1
                    break
        if jump==1:
            continue
        for i in range(k-1,-1,-1):
            if e[j-1][g][0][i]==')' :
                m+=1
                continue
            if e[j-1][g][0][i]=='(':
                m-=1
                continue
            if m==0 :
                if e[j-1][g][0][i]=='|' :
                    e[j][th][0]=e[j-1][g][0][0:i]
                    e[j][th+1][0]=e[j-1][g][0][i+1:k]
                    e[j-1][g][2]='|'
                    th+=2                   
                    leng+=1
                    jump=1
                    break
        if jump==1 :
            continue
        for i in range(k-1,-1,-1):
            if e[j-1][g][0][i]==')' :
                m+=1
                continue
            if e[j-1][g][0][i]=='(':
                m-=1
                continue
            if m==0 :
                if e[j-1][g][0][i]=='&' :
                    e[j][th][0]=e[j-1][g][0][0:i]
                    e[j][th+1][0]=e[j-1][g][0][i+1:k]
                    e[j-1][g][2]='&'
                    th+=2                   
                    leng+=1
                    jump=1
                    break
        if jump==1 :
            continue
        if k>1 :
            e[j][th][0]=e[j-1][g][0][1:k]
            e[j-1][g][2]='!'
            th+=1
            leng+=1
    if leng==0 :
        break 
for i in range(0,j) :
    print('第',i,'层',' ',end='')
    for d in range(0,10):
        if len(e[i][d][0])<1:  
            break
        print(e[i][d][0],'  ',end='')
    print("\n")
g=w=1
a=[]
a.append(e[j-1][0][0])
for t in range(1,10):
    if len(e[j-1][t][0])<1:
        break   
#如果树叶中命题变元与前面树叶的重复,则检索下一个树叶。
    for k in range(0,t):
        if e[j-1][t][0]==e[j-1][k][0] :
            break
        if k==t-1:
            g+=1
#用g记录命题变元的个数。
            a.append(e[j-1][t][0])
a.sort()
for letter in a:
    print(letter,'  ',end='')
print("真值\n")
# 为命题变元赋值并输出该赋值下的真值
b=[0]*g
for x in range(0,2**g) :
    m=g-1
    for i in range(0,g) :
        b[i]=x&(2**m)
        b[i]=b[i]>>m
        m-=1
    for letter in b :
        print(letter,'  ',end='')
    for i in range(g) :
        for y in range(g):
            if e[j-1][i][0]==a[y]:
                e[j-1][i][1]=b[y]
                break
    for m in range(j-2,-1,-1) :
        i=0
        for n in range(0,10):
            if e[m][n][2]=='&':
                e[m][n][1]=e[m+1][i][1] and e[m+1][i+1][1]
                i+=2
            elif e[m][n][2]=='|':
                e[m][n][1] = e[m+1][i][1] or e[m+1][i+1][1]
                i+=2
            elif e[m][n][2]=='>' :
                e[m][n][1]=int(not e[m+1][i][1] or e[m+1][i+1][1])
                i+=2
            elif e[m][n][2]=='=' :
                e[m][n][1]=int(e[m+1][i][1]==e[m+1][i+1][1]) 
                i+=2
            elif e[m][n][2]=='!' :
                e[m][n][1]=int(not (e[m+1][i][1]))
                i+=1
            elif len(e[m][n][0])>0 :
                e[m][n][1] = e[m+1][i][1]
                i+=1
    print(e[0][0][1])
m=input()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在月光下弹琴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值