天使と悪魔と道化の「ウソつき問題」をPythonで解いてみた。

 天使と悪魔と道化の「ウソつき問題」をPythonで解いてみました。(^_^;

 ここに天使と悪魔と道化がいます。天使は常に真実を述べ、悪魔は常に嘘を述べます。道化は真実も嘘も意味不明のことも言うことがあります。
A「Bが天使なら私は悪魔です」
B「Aが悪魔なら私は天使です」
C「Bは天使ではありません」
と3人は言いました。
 A,B,Cはそれぞれ天使、悪魔、道化のいずれとなりますか?

ただし、問題文を一部、書き直しました。
 天使をU、悪魔をV、道化をWとしました。
 「if not Imp(a!='W',Eqv(a=='U',Imp(b=='U',a=='V'))): continue」は、次のようにしてもいいです。(^_^;

    if a!='W':
        if not Eqv(a=='U',Imp(b=='U',a=='V')): continue

 ちなみに、論理包含Impの真理値表は次のようになりますので、前件が偽なら、後件が真でも偽でも、全体としては真になる、つまり、嘘にはならないことに注意しましょう。(^_^;

+---+---+-------+
| p | q |p Imp q|
+---+---+-------+
| T | T |   T   |
+---+---+-------+
| T | F |   F   |
+---+---+-------+
| F | T |   T   |
+---+---+-------+
| F | F |   T   |
+---+---+-------+

ただし、Tは真、Fは偽とします。

● Liar11.py

# coding: UTF-8
# Liar11.py

import itertools
from time import time

# 論理等価Eqv
def Eqv(p,q):
    return not(p^q)

# 論理包含Imp
def Imp(p,q):
    return (not p) or q

def main():
    tm = time() # Timer Start
    dic = {'U':'天使', 'V':'悪魔', 'W':'道化'}
    P = 'UVW'
    for p in itertools.permutations(P):
        a,b,c = p
        if not Imp(a!='W',Eqv(a=='U',Imp(b=='U',a=='V'))): continue
        if not Imp(b!='W',Eqv(b=='U',Imp(a=='V',b=='U'))): continue
        if not Imp(c!='W',Eqv(c=='U',b!='U')): continue
        pass # チェックを潜り抜けたものだけを表示
        print(u'A:%s, B:%s, C:%s'%(dic[a],dic[b],dic[c]))

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

if __name__ == '__main__':
    main()

●実行結果

A:道化, B:天使, C:悪魔
Runtime : 0.000 [sec]

※参考URL
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11143182656
知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(2) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(3) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(4) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(5) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(6) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(7) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(8) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(9) - rscのブログ
OKWAVEの「ウソつき問題」をPythonで解いてみた。 - rscのブログ
天使と悪魔と道化の「ウソつき問題」をPythonで解いてみた。 - rscのブログ