【离散数学】Python语言实现利用真值表法求主析取范式和主合取范式

该博客介绍了如何使用Java和C++实现通过真值表求取主析取范式和主合取范式的方法。作者提供了详细的代码实现,包括输入变量个数、读取真值表、输出真值表、计算主析取范式和主合取范式的过程。实验要求理解真值表法的基本原理,并能编程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java版本的看这个链接:

Java语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客icon-default.png?t=MBR7https://blog.csdn.net/weixin_56319483/article/details/128489247?spm=1001.2014.3001.5501

C++版本的看这个链接:

【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客icon-default.png?t=MBR7https://blog.csdn.net/weixin_56319483/article/details/128489182?spm=1001.2014.3001.5501

实验内容:

针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。

实验要求:

能够掌握通过真值表求取相应主析取和主合取范式的方法及原理。

先复习一下基本概念:或者直接跳到下面看源代码

1.主合取范式:若干个极大项的合取(交集)。例如:

2.主析取范式:若干个极小项的析取(并集)。例如:

3.极大项:就是包含全部数目的命题变元的析取表达式。例如:p∨¬q∨r

4.极小项:包含全部数目的命题变元的合取表达式。例如:¬p∧¬q∧r

python实现 源代码如下:

# Author:  zhtstar
# Time:   2022/3/26 13:56

length = 150
# list = [0 for i in range(length)] #arr
list1 = [[0 for i in range(14)] for j in range(length)] #brr
beg=80
sta1=sta2=0

num = eval(input("输入变量的个数:"))
sum = 2**num
listt = [0 for i in range(sum)] #arr
print("请输入"+str(sum)+"个字符(用T或F表示):",end='')
listt = list(map(str,input().split(' ')))
# print(listt)
for i in range(0,sum):
    # c = input()
    c=listt[i]
    if c == 'T':
        sta1 = sta1+1
    else:
        sta2 = sta2+1
# print(sta1,sta2)
cnt1 = 0
cnt2 = 1
for i in range(sum-1,-1,-1):
    cnt1 = 0
    val = i
    while cnt1<num:
        cnt1 = cnt1+1
        list1[cnt2][cnt1]=(val % 2)
        val = val // 2
    cnt2 = cnt2+1
# print(list1)
print("输出公式对应的真值表 :")
for i in range(1,num+1):
    print(chr(beg)+"      ",end='')
    beg = beg+1
print('A')
print("----------------------")
beg = 80
for i in range(1,sum+1):
    for j in range(num,0,-1):
        if list1[i][j] == 1:
           print('T' + "      ",end='')
        else:
            print('F' + "      ",end='')
    print(listt[i-1])
print()

k=0

print("输出主析取范式:")
for i in range(1,sum+1):
    if listt[i-1] == 'T':
        k = k+1
        print('(',end='')
        for j in range(num,0,-1):
            if list1[i][j] == 1:
                print(chr(beg),end='')
                beg = beg+1
            else:
                print("¬" + chr(beg),end='')
                beg = beg+1
            if j!=1:
                print("∧",end='')
        print(')',end='')
        if k<sta1:
            print("∨",end='')
    beg=80
print()
k=0
print("输出主合取范式:")
for i in range(1,sum+1):
    if listt[i-1] == 'F':
        k = k+1
        print('(',end='')
        for j in range(num,0,-1):
            if list1[i][j] == 0:
                print(chr(beg),end='')
                beg = beg+1
            else:
                print("¬" + chr(beg),end='')
                beg = beg+1
            if j!=1:
                print("∨",end='')
        print(')',end='')
        if k<sta2:
            print("∧",end='')
    beg=80
print()

运行结果截图:

分析与总结:

本次的实验任务已完成,在本次实验中主要使用变量length定义数组长度,使用一维列表listt用来存放2^n次方个字符,其中n表示变量个数;使用二维列表list1用来存放真值表,使用变量beg并赋初值80,此为P的ASCII码,用来记录PQR。使用sta1, sta2 分别记录输入的‘T’与‘F’的个数。

在读取到输入的字符个数后提示用户输入相应数量的字符,获取字符后存入列表中,并分别记录‘T’和‘F’的个数。之后在二维列表中处理真值表,先给真值表赋初值0或1,在输出真值表时判断相应位置上的字符,如果是1,输出‘T’;否则输出‘F’。并在对应位置上输出获取到了字符。

在输出析取范式时,对listt列表各位进行遍历,如果为‘T’,则输出主析取范式;如果为‘F’,则输出主合取范式。此时要结合list1列表对应位置的数值,确定输出的合取或析取符号,以及否定符号。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值