{-# htermination (notElemChar :: Char -> (List Char) -> MyBool) #-} import qualified Prelude data MyBool = MyTrue | MyFalse data List a = Cons a (List a) | Nil data Char = Char MyInt ; data MyInt = Pos Nat | Neg Nat ; data Nat = Succ Nat | Zero ; asAs :: MyBool -> MyBool -> MyBool; asAs MyFalse x = MyFalse; asAs MyTrue x = x; foldr :: (a -> b -> b) -> b -> (List a) -> b; foldr f z Nil = z; foldr f z (Cons x xs) = f x (foldr f z xs); and :: (List MyBool) -> MyBool; and = foldr asAs MyTrue; map :: (a -> b) -> (List a) -> (List b); map f Nil = Nil; map f (Cons x xs) = Cons (f x) (map f xs); pt :: (a -> c) -> (b -> a) -> b -> c; pt f g x = f (g x); all :: (a -> MyBool) -> (List a) -> MyBool; all p = pt and (map p); primEqNat :: Nat -> Nat -> MyBool; primEqNat Zero Zero = MyTrue; primEqNat Zero (Succ y) = MyFalse; primEqNat (Succ x) Zero = MyFalse; primEqNat (Succ x) (Succ y) = primEqNat x y; primEqInt :: MyInt -> MyInt -> MyBool; primEqInt (Pos (Succ x)) (Pos (Succ y)) = primEqNat x y; primEqInt (Neg (Succ x)) (Neg (Succ y)) = primEqNat x y; primEqInt (Pos Zero) (Neg Zero) = MyTrue; primEqInt (Neg Zero) (Pos Zero) = MyTrue; primEqInt (Neg Zero) (Neg Zero) = MyTrue; primEqInt (Pos Zero) (Pos Zero) = MyTrue; primEqInt vv vw = MyFalse; primEqChar :: Char -> Char -> MyBool; primEqChar (Char x) (Char y) = primEqInt x y; esEsChar :: Char -> Char -> MyBool esEsChar = primEqChar; not :: MyBool -> MyBool; not MyTrue = MyFalse; not MyFalse = MyTrue; fsEsChar :: Char -> Char -> MyBool fsEsChar x y = not (esEsChar x y); notElemChar :: Char -> (List Char) -> MyBool notElemChar = pt all fsEsChar;