有罪無罪の論理問題をPythonで解いてみた。

 有罪無罪の論理問題Pythonで解いてみました。(^_^;

 4人の被告 A,B,C,Dが関与していて次の事実が明らかになった.
(1) AとBがともに有罪なら,Cは共犯者だ.
(2) Aが有罪ならば,BかCの少なくとも一人が共犯者だ.
(3) Cが有罪ならば,Dは共犯者だ.
(4) Aが潔白ならば,Dは有罪だ.
 確実に有罪なのは誰か.
1.A 2.B 3.C 4.D

 ただし、問題を一部修正して、選択肢を付けてみました。(^_^;
 有罪をTrue、無罪(潔白)をFalseとし、論理包含Impをとって回してみました。(^_^;

● Logic3.py

# coding: UTF-8
# Logic3.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]*4
    TF = (True, False)
    print("[A B C D]")
    for p in itertools.product(TF,repeat=4):
        a,b,c,d = p
        if not Imp(a and b,      c): continue   # 条件(1)
        if not Imp(      a, b or c): continue   # 条件(2)
        if not Imp(      c,      d): continue   # 条件(3)
        if not Imp(  not a,      d): continue   # 条件(4)
        pass # チェックを潜り抜けたものを表示
        print('[%s]'%getRowOfTFTbl(p))
        pass # 選択肢のチェック
        choices[0] &= a
        choices[1] &= b
        choices[2] &= c
        choices[3] &= d

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

if __name__ == '__main__':
    main()

●実行結果

[A B C D]
[T T T T]
[T F T T]
[F T T T]
[F T F T]
[F F T T]
[F F F T]
∴D
Runtime : 0.000 [sec]

※参考URL
数学とプログラミングに弱い学生が論理パズルをPythonで解きたい話 - a symmetry
知恵袋の判断推理の論理問題をPythonで解いてみた。 - rscのブログ
知恵袋の判断推理の論理問題をPythonで解いてみた。(2) - rscのブログ
【論理包含演算子Imp】の質問 - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(5) - rscのブログ