• Source
    1. -- who is the culprit
    2.  
    3. data Member = A | B | C | D | E deriving ( Show, Eq )
    4.  
    5. nxor x y = ( x && y ) || ( not x && not y )
    6.  
    7. condA ( liar, culp ) = nxor ( liar /=A ) $ culp /= A
    8. condB ( liar, culp ) = nxor ( liar /=B ) $ culp == A || culp == C
    9. condC ( liar, culp ) = nxor ( liar /=C ) $ liar /= B || liar /= D
    10. condD ( liar, culp )= nxor ( liar /=D ) $ culp /= B && culp /= E
    11. condE ( liar, culp )= nxor ( liar /=E ) $ culp /= liar
    12.  
    13. cases = [ ( liar, culp ) |
    14. liar <- [ A,B,C,D,E ],
    15. culp <- [ A,B,C,D,E ] ]
    16.  
    17. conds = [ condA, condB, condC, condD, condE ]
    18.  
    19. isPossible theCase = all id [ cond theCase |
    20. cond <- conds ]
    21.  
    22. main = do
    23. mapM_ print $ [ theCase | theCase <- cases, isPossible theCase ]
    24.