Skip to content

Instantly share code, notes, and snippets.

@paf31
Created January 13, 2013 00:15
Show Gist options
  • Save paf31/4521193 to your computer and use it in GitHub Desktop.
Save paf31/4521193 to your computer and use it in GitHub Desktop.
module Liars where
import Control.Monad
import Data.List
data Person = Truthteller | Liar deriving (Show, Eq)
says :: Person -> Bool -> Bool
says Truthteller = id
says Liar = not
(~>) :: Bool -> Bool -> Bool
True ~> False = False
_ ~> _ = True
unknown :: [Person]
unknown = [Truthteller, Liar]
iAmATruthteller = nub $ do
a <- unknown
guard $ says a (a == Truthteller)
return a
iAmALiar = nub $ do
a <- unknown
guard $ says a (a == Liar)
return a
cSaysBIsALiar = nub $ do
a <- unknown
b <- unknown
c <- unknown
guard $ says b (says a (a == Liar))
guard $ says c (b == Liar)
return c
aSaysHeNeverClaimsToBeALiar = nub $ do
a <- unknown
guard $ says a (not $ says a (a == Liar))
return a
aSaysBCallsMeALiar = nub $ do
a <- unknown
b <- unknown
guard $ says a (says b (a == Truthteller))
return (a, b)
aSaysBSaysWeAreTheSame = nub $ do
a <- unknown
b <- unknown
guard $ says a (says b (a == b))
return a
aSaysIfBIsALiarThenSoAmI = nub $ do
a <- unknown
b <- unknown
guard $ says a ((Liar == b) ~> (Liar == a))
return (a, b)
aSaysIfBSaysIAmALiarThenIAmALiar = nub $ do
a <- unknown
b <- unknown
guard $ says a (says b (Liar == a) ~> (Liar == a))
return (a, b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment