知恵袋の「ウソつき問題」をPythonで解いてみた。(7)

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;

 天使、悪魔、人間の3人がいます。 天使は真実、悪魔は嘘、人間は真実・嘘、両方言います。
A「私は天使ではありません」
B「私は人間ではありません」
C「私は悪魔ではありません」
3人の正体を教えてください。

 天使を'A'、悪魔を'D'、人間を'H'としました。
 発言者が人間のとき、真実・嘘、両方言うのでスルーさせ、人間じゃないとき、Eqv()をとって、通過すべき条件を「Imp(x!='H',Eqv(x=='A',{発言内容}))」としてみました。
ここで、発言者をxとすると、「x=='A'」で正直者かそうでないかを判定しました。
 プログラムを実行しなくても、通過条件を式変形するだけでも実行結果がわかりそうですね。(^_^;
 「Imp(a!='H',Eqv(a=='A',a!='A'))」⇒「Imp(a!='H',False)」⇒「a=='H'」
P.S.
 ちなみに、条件式の変形から、プログラムを実行せずに自分で解いてみると、次のようになります。
 Imp(a!='H',Eqv(a=='A',a!='A'))==Imp(a!='H',False)==True
∴(a!='H')==False
∴a=='H' (A:人間)
∴Imp(b!='H',Eqv(b=='A',b!='H'))==Imp(True,Eqv(b=='A',True))==True
∴Eqv(b=='A',True)==True
∴(b=='A')==True
∴b=='A' (B:天使)
∴Imp(c!='H',Eqv(c=='A',c!='D'))==Imp(True,Eqv(False,c!='D'))==True
∴Eqv(False,c!='D')==True
∴(c!='D')==False
∴c=='D' (C:悪魔)

● Liar7.py

# coding: UTF-8
# Liar7.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 = {'A':'天使', 'D':'悪魔', 'H':'人間'}
    P = 'ADH'
    for p in itertools.permutations(P):
        a,b,c = p
        if not Imp(a!='H',Eqv(a=='A',a!='A')): continue
        if not Imp(b!='H',Eqv(b=='A',b!='H')): continue
        if not Imp(c!='H',Eqv(c=='A',c!='D')): 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
知恵袋の「ウソつき問題」を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のブログ
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。