真値テーブル-Phython実装
27997 ワード
文書ディレクトリ実験内容 プログラム設計 コード実装 実験内容命題変数P 1,P 2,P 3,...,Pnは式Gに現れるすべての命題変数であり、P 1,P 2,P 3,...,Pnの真の値のセットを指定すると、この真の値はGの解釈または割り当てと呼ばれ、I と表記されることが多い.真値テーブル:式Gのすべての可能な解釈の下で真値をとるテーブル 本実験では,キーボードから命題式を入力して真値テーブルをリストする必要がある.
プログラミング
真値テーブルの実装の難点は、次のとおりです.の変数に対するT(True)F(False)の列挙は,未知の次数のネストループに相当し,これに対して再帰的解決を適用した.これに対してまず再帰終了のフラグを見つけ,すなわちすべての変数のTFを と列挙する.命題に含まれる変数を見つけるのは簡単で、1つの集合を構築するか、リスト を使用する必要があります.接尾辞式変換接尾辞式については、接尾辞式 を参照してください.
コード実装
プログラミング
真値テーブルの実装の難点は、次のとおりです.
コード実装
operators = ['!','&', '|', '*', '+'] #
def postfix(elements):
global operators
stack = list()
output = list()
for ele in elements:
if ele not in operators and ele not in ('(',')'): #
output.append(ele)
# '(' ,
elif ele == '(':
stack.append(ele)
# ) , ( , : ) (
elif ele == ')':
val = stack.pop()
while val !='(':
output.append(val)
if stack:
val = stack.pop()
else:
break
elif ele in ('&', '|', '*', '+', '!'): # ,
if len(stack) == 0:
stack.append(ele)
continue
# , ,
while (ele == '!' and stack[-1] =='!') or \
(ele == '&' and stack[-1] in ('!', '&')) or \
(ele == '|' and stack[-1] in ('!', '&', '|')) or \
(ele == '*' and stack[-1] in ('!', '&', '|', '*')) or \
(ele == '+' and stack[-1] in ('!', '&', '|', '*', '+')):
val = stack.pop()
output.append(val)
if not stack:
break
stack.append(ele)
while stack: # , ,FILO,
output.append(stack.pop())
return ''.join(output)
def logicalOp(tmp):
idx = 0 #
while len(tmp) > 1: # ,
if tmp[idx] in operators:
if tmp[idx] == '!': #
# , , idx 1 2
tmp[idx - 1] = 1 if int(tmp[idx - 1]) == 0 else 0
tmp[idx:idx + 1] = [] #
#
idx = 0
continue
elif tmp[idx] == '&': #
tmp[idx] = 1 if int(tmp[idx - 1]) == 1 and int(tmp[idx - 2]) == 1 else 0
tmp[idx - 2:idx] = []
idx = 0
continue
elif tmp[idx] == '|': #
tmp[idx] = 0 if int(tmp[idx - 1]) == 0 and int(tmp[idx - 2]) == 0 else 1
tmp[idx - 2:idx] = []
idx = 0
continue
elif tmp[idx] == '*': #
tmp[idx] = 0 if int(tmp[idx - 2]) == 1 and int(tmp[idx - 1]) == 0 else 1
tmp[idx - 2:idx] = []
idx = 0
continue
elif tmp[idx] == '+': #
tmp[idx] = 1 if int(tmp[idx - 2]) == int(tmp[idx - 1]) else 0
tmp[idx - 2:idx] = []
idx = 0
continue
idx += 1
print(tmp[0])
def e(idx):
global expr
if idx == len(enum): #
print('\t'.join(list(enum.values())),end='\t') #
tmp = ' '.join(expr) # tmp
for ele in expr:
if ele in enum:
tmp = tmp.replace(ele, enum[ele])
tmp = tmp.split(' ') # list,
logicalOp(tmp)
return
enum[var[idx]] = '0' # False, int , , 0,1
e(idx+1) #
enum[var[idx]] = '1' # True
e(idx+1)
if __name__=='__main__':
"""
Attention :
:
!: ( )
&:
|:
*: ( )
+: ( )
"""
print('please input the problem\tExample: (p*q)&!r p&q|r*q&!s|r')
inp = input('>>>')
expr = postfix(inp) # expr
var = list() # var
for item in expr:
#
if item not in operators and \
item not in var and \
item not in ('(', ')'):
var.append(item)
# TF
enum = {}.fromkeys(var)
#
print('\t'.join(var),end='\t')
print(inp)
#
e(0)
Attention :
:
!: ( )
&:
|:
*: ( )
+: ( )
please input the problem Example: (p*q)&!r p&q|r*q&!s|r
>>>p&q|r*q&!s|r
p q r s p&q|r*q&!s|r
0 0 0 0 1
0 0 0 1 1
0 0 1 0 1
0 0 1 1 1
0 1 0 0 1
0 1 0 1 1
0 1 1 0 1
0 1 1 1 1
1 0 0 0 1
1 0 0 1 1
1 0 1 0 1
1 0 1 1 1
1 1 0 0 1
1 1 0 1 0
1 1 1 0 1
1 1 1 1 1