-- who is the culprit
data Member
= A
| B
| C
| D
| E
deriving ( Show, Eq )
nxor x y
= ( x
&& y
) || ( not x
&& not y
)
condA ( liar, culp ) = nxor ( liar /=A ) $ culp /= A
condB ( liar, culp ) = nxor ( liar /=B ) $ culp == A || culp == C
condC ( liar, culp ) = nxor ( liar /=C ) $ liar /= B || liar /= D
condD ( liar, culp )= nxor ( liar /=D ) $ culp /= B && culp /= E
condE ( liar, culp )= nxor ( liar /=E ) $ culp /= liar
cases = [ ( liar, culp ) |
liar <- [ A,B,C,D,E ],
culp <- [ A,B,C,D,E ] ]
conds = [ condA, condB, condC, condD, condE ]
isPossible theCase
= all id [ cond theCase
| cond <- conds ]
main = do
mapM_ print $ [ theCase
| theCase
<- cases
, isPossible theCase
]