Java版本的看这个链接:
C++版本的看这个链接:
实验内容:
针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。
实验要求:
能够掌握通过真值表求取相应主析取和主合取范式的方法及原理。
先复习一下基本概念:或者直接跳到下面看源代码
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列表对应位置的数值,确定输出的合取或析取符号,以及否定符号。