{-# OPTIONS_GHC -fno-warn-missing-methods #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} nil = undefined data True data False data S n data Z data Nil data Cons h t data IsCell data IsOddAtom data IsEvenAtom class Not t b | t -> b instance Not True False instance Not False True class And a b r | a b -> r instance And True True True instance And True False False instance And False True False instance And False False False class If c t f r | c t f -> r instance If True t f t instance If False t f f class IsEven a b | a -> b instance IsEven Z True instance IsEven (S Z) False instance (IsEven n r) => IsEven (S (S n)) r instance IsEven (Cons xs x) False class Wutpam t b | t -> b instance Wutpam Z True instance Wutpam (S n) True instance Wutpam Nil False instance Wutpam (Cons x xs) False class Wutket t b | t -> b instance (Wutpam t b, Not b r) => Wutket t r class Solution n r | n -> r where solution :: n -> r instance ( Wutket n c , Not c a , IsEven n m , If m IsEvenAtom IsOddAtom e , If c IsCell e o ) => Solution n o where solution = nil