真値テーブル-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