知恵袋の三段論法の問題をPythonで解いてみた。

 知恵袋の三段論法の問題Pythonで解いてみました。

A: 社交的な人は協調性がある。
B: [ ]
C: 明朗でない人は社交的でない。
上のAとBから三段論法でCが導かれるという。Bは次のうちどれか。
1 社交的でない人は明朗でない。
2 明朗でない人は協調性がない。
3 協調性のある人は明朗でない。
4 明朗な人は協調性がある。
5 協調性のない人は明朗でない。

 「社交的である.」を s、「協調性がある.」を k、「明朗である.」を m として、{s,k,m} = {True, False}の直積で回してみました。その全パターンで、「条件A ∧ 条件B(1~5) → 条件C」が成り立つものを求める条件Bとしました。

● Syllogism1.py

# coding: UTF-8
# Syllogism1.py

import itertools
from time import time

# 論理包含「A⇒B」の真理値を得る
def Imp(a,b):
    return not a or b

# 真理値表の1行を文字列で得る
def getRowOfTFTbl(li):
    return ' '.join([str(b)[0] for b in li])

# 確実にいえる選択肢を得る
def getAns(cho,lbl='12345'):
    return ','.join([lbl[i] for i in range(len(cho)) if cho[i]])

def main():
    tm = time() # Timer Start
    choices = [True]*5
    TF = (True, False)
    print("[s,k,m,1,2,3,4,5]")
    for p in itertools.product(TF,repeat=3):
        # s:「社交的である.」; k:「協調性がある.」; m:「明朗である.」
        s,k,m = p
        A  = Imp(    s,     k)  # 条件A
        B1 = Imp(not s, not m)  # 条件B群
        B2 = Imp(not m, not k)
        B3 = Imp(    k, not m)
        B4 = Imp(    m,     k)
        B5 = Imp(not k, not m)
        C  = Imp(not m, not s)  # 条件C
        pass # 選択肢のチェック
        c1 = Imp(A and B1, C)   # 選択肢の真理値
        c2 = Imp(A and B2, C)
        c3 = Imp(A and B3, C)
        c4 = Imp(A and B4, C)
        c5 = Imp(A and B5, C)
        choices[0] &= c1
        choices[1] &= c2
        choices[2] &= c3
        choices[3] &= c4
        choices[4] &= c5
        # s,k,m と選択肢の真理値表を表示
        li = list(p) + [c1,c2,c3,c4,c5]
        print('[%s]'%getRowOfTFTbl(li))

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

if __name__ == '__main__':
    main()

●実行結果

[s,k,m,1,2,3,4,5]
[T T T T T T T T]
[T T F F T F F F]
[T F T T T T T T]
[T F F T T T T T]
[F T T T T T T T]
[F T F T T T T T]
[F F T T T T T T]
[F F F T T T T T]
∴2
Runtime : 0.001 [sec]

※参考URL

論理包含 - Wikipedia

・(P→Q)∧(Q→R)→(P→R) (推移律、三段論法)