【論理包含演算子Imp】の質問(2)

 ひょんなことから、「p Eqv q」が「p==q」のように比較演算子を使って表すことができるとわかったので、他の主な演算子(not and or xor eqv imp)も比較演算子を使って表す関数を作ってみました。(^_^;
 ちなみに、この前の「【論理包含演算子Imp】の質問」のImpは、比較演算子を使って表わした「p<=q」とか「bool(p)<=bool(q)」で代用できそうです。が、これだと矢印の向きが反対っぽい感じがするし、また、「(not p)>=(not q)」だと矢印の向きはいいけど、前にnotがついて煩わしい感じがします。それでこれらは不採用にして、順番通りに並べる関数lop(p,opr,q)を作ることにしました。(^_^;

● LogicalOp1.py

# coding: UTF-8
# LogicalOp1.py

import itertools
from time import time

# 否定 NOT
def NOT(p):
    return p==False

# 論理積 AND
def AND(p,q):
    return p*q!=False

# 論理和 OR
def OR(p,q):
    return p*p+q*q!=False

# 排他的論理和 XOR
def XOR(p,q):
    return p!=q

def Xor(p,q):
    return bool(p^q)

# 論理等価 EQV
def EQV(p,q):
    return p==q

def Eqv(p,q):
    return not(p^q)

# 論理包含 IMP
def IMP(p,q):
    return p<=q

def Imp(p,q):
    return not p or q

# 「p <論理演算子> q」の形に整える
def lop(p,opr,q):
    return opr(p,q)

# 真理値表の1行を文字列で得る(T:True; F:False)
def getRowOfTruthTable(li):
    return (' '*3).join(['T' if b else 'F' for b in li])

def main():
    tm = time()  # Timer Start
    TF = (True,False)
    # <<<--- NOT --->>>
    print('[p  not NOT]')
    for p in TF:
        li = [p,not p,NOT(p)]
        print(' %s'%getRowOfTruthTable(li))
    # <<<--- AND --->>>
    print('[p   q  and AND]')
    for p,q in itertools.product(TF,repeat=2):
        li = [p,q,p and q,lop(p,AND,q)]
        print(' %s'%getRowOfTruthTable(li))
    # <<<--- OR --->>>
    print('[p   q  or  OR]')
    for p,q in itertools.product(TF,repeat=2):
        li = [p,q,p or q,lop(p,OR,q)]
        print(' %s'%getRowOfTruthTable(li))
    # <<<--- XOR --->>>
    print('[p   q  Xor XOR]')
    for p,q in itertools.product(TF,repeat=2):
        li = [p,q,lop(p,Xor,q),lop(p,XOR,q)]
        print(' %s'%getRowOfTruthTable(li))
    # <<<--- EQV --->>>
    print('[p   q  Eqv EQV]')
    for p,q in itertools.product(TF,repeat=2):
        li = [p,q,lop(p,Eqv,q),lop(p,EQV,q)]
        print(' %s'%getRowOfTruthTable(li))
    # <<<--- IMP --->>>
    print('[p   q  Imp IMP]')
    for p,q in itertools.product(TF,repeat=2):
        li = [p,q,lop(p,Imp,q),lop(p,IMP,q)]
        print(' %s'%getRowOfTruthTable(li))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[p  not NOT]
 T   F   F
 F   T   T
[p   q  and AND]
 T   T   T   T
 T   F   F   F
 F   T   F   F
 F   F   F   F
[p   q  or  OR]
 T   T   T   T
 T   F   T   T
 F   T   T   T
 F   F   F   F
[p   q  Xor XOR]
 T   T   F   F
 T   F   T   T
 F   T   T   T
 F   F   F   F
[p   q  Eqv EQV]
 T   T   T   T
 T   F   F   F
 F   T   F   F
 F   F   T   T
[p   q  Imp IMP]
 T   T   T   T
 T   F   F   F
 F   T   T   T
 F   F   T   T
Runtime : 0.000 [sec]

※参考URL
【論理包含演算子Imp】の質問 - rscのブログ
https://code.i-harness.com/ja/q/69aca