遇到一个问题:想把真值表转换成逻辑表达式,真值表太长,不想手算,于是写了个脚本。但是为了检验结果的正确性,顺带写了个逻辑表达式转真值表的脚本。
下面的例子是expression = abc+ (a非)b(c非)
,为了方便表示,用大写字母表示取非,小写字母表示原值,则expression = abc+AbC
,在python代码中,该expression
即被记为[(1,1,1),(0,1,0)]
,这里的(1,1,1)
是按字母顺序的abc
,这里的(0,1,0)
是按字母顺序的AbC
。
此时已经可以表示了,但是如果还有字母d呢?即化简后d消失了,那么可以认为d是可有可无的x
,为了统一处理,这里用数字2
来表示x
, 则此时expression=[(1,1,1,2),(0,1,0,2)]
,以此类推!
生成的真值表存储在test.csv
文件中
import csvdef Write_csv(csv_file,data,encode='utf-8'):with open(csv_file, 'w', encoding=encode,newline='') as file_obj:writer = csv.writer(file_obj)for i in data:writer.writerow(i)def gen_data(exp,N):data_out = []for i in range(2**N):line = bin(i)line = str(line)line = line[2:]line = '0'*(N-len(line)) + linetmp_0 = 0for data_in in exp:tmp_1 = 1 for i in range(N):if( data_in[i] == 2 ):continueelif(data_in[i] == int(line[i])):continueelse:tmp_1 = 0breaktmp_0 = tmp_0 + tmp_1if(tmp_0 != 0):line = line + '1'else:line = line + '0'data_out.append(tuple(line))return data_outif __name__ == "__main__":#T = 1#F = 0#X = 2#大写字母代表取非#小写字母代表正常字母#expression = abc + AbC#exp = ['abc','AbC'] for N = 3#exp = ['abcX','AbCX'] for N=4(thus include D)#exp = [[1,2,1,2],[0,1,0,2]]exp = [[2,2,2,2],[1,2,1,0]]data = gen_data(exp,4)Write_csv('test.csv',data)
这里输出的表达式的含义见上一小节。
需要注意的是两个极端例子:
[2,2,2,2]
(即真值表对应的输出结果永真时,其输入可为任意值)[]
import csv#input:csv file
#out1:元素个数
#out2:把结果为1的值读进data
def Read_csv_True(csv_file,encode='utf-8'):data = []column = 0with open(csv_file, 'r', encoding=encode) as file_obj:reader = csv.reader(file_obj)for row in reader:element = row[-1]if(0 == int(element)):continuetmp = row[:-1]for i in range(len(tmp)):tmp[i] = int(tmp[i])data.append(tmp)column = len(row)-1return column,data
def get_Exp(data,N):if(len(data) == 0):return []for n in range(N):for i in range(len(data)-1):for j in range(i,len(data)):if (j == len(data)):#因为有del(data[j]),所以要判断溢出breaktmp = []cnt = 0for k in range(N):if(data[i][k] == data[j][k]):tmp.append(data[i][k])else:cnt += 1tmp.append(2)if(cnt == 1):data[i] = tmpdel(data[j])
if __name__ == "__main__":#N指字母个数N,data = Read_csv_True('test.csv','utf-8')print(N)get_Exp(data,N)print(data)
本人试了几个结果,发现没有问题,如果有问题,可以@我。
另外,真值表转逻辑表达那个脚本本意就是想化简的,所以具有一定的化简功能,我感觉是化到最简了(尚未进行严格的数学证明!)。
上一篇:小儿消化!