data Person = Terach | Abraham | Nachor | Haran 
              | Isaac | Lot | Milcah | Yiscah
              deriving (Eq, Show, Enum)

-- Haskell-Programm mit Fakten
father :: Person -> Person -> Bool
father Terach  Abraham = True
father Terach  Nachor  = True
father Terach  Haran   = True
father Abraham Isaac   = True
father Haran   Lot     = True
father Haran   Milcah  = True
father Haran   Yiscah  = True
father _       _       = False  

male :: Person -> Bool
male Terach  = True
male Abraham = True
male Nachor  = True
male Haran   = True
male Isaac   = True
male Lot     = True
male _       = False

female :: Person -> Bool
female Milcah = True
female Yiscah = True
female _      = False




son :: Person -> Person -> Bool
son x y = (father y x) &&  male x

grandfather :: Person -> Person -> Bool
grandfather x y  
  = not (null [z | z <- persons, 
                   father x z, father z y])

persons :: [Person]
persons =  [Terach .. Milcah]

