真值表 逻辑表达式
创始人
2025-05-28 02:37:05
0

前言

遇到一个问题:想把真值表转换成逻辑表达式,真值表太长,不想手算,于是写了个脚本。但是为了检验结果的正确性,顺带写了个逻辑表达式转真值表的脚本。

一. 逻辑表达式转真值表

下面的例子是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)

二. 真值表转逻辑表达式

这里输出的表达式的含义见上一小节。
需要注意的是两个极端例子:

  1. 如果真值表恒为1,则输出结果为[2,2,2,2](即真值表对应的输出结果永真时,其输入可为任意值)
  2. 如果真值表恒为0,则输出结果为[]
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)

三.后记

本人试了几个结果,发现没有问题,如果有问题,可以@我。
另外,真值表转逻辑表达那个脚本本意就是想化简的,所以具有一定的化简功能,我感觉是化到最简了(尚未进行严格的数学证明!)。

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...