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
・(P→Q)∧(Q→R)→(P→R) (推移律、三段論法)