Hola a todos, acá van los primero ocho puntos de P6 E7. Hay varios que están horribles (usé Suc x en vez de x por las dudas, etc.) pero parecería que funcionan. Quizás a alguien le sirva. Críticas bienvenidas. Saludos!
data Nat = Cero | Suc Nat
deriving Show
igual :: Nat -> Nat -> Bool
igual Cero Cero = True
igual (Suc y) (Suc x) = igual y x
igual _ _ = False
suma :: Nat -> Nat -> Nat
suma Cero Cero = Cero
suma Cero (Suc x) = (Suc x)
suma (Suc x) Cero = (Suc x)
suma (Suc x) (Suc y) = suma x (Suc (Suc y))
prod :: Nat -> Nat -> Nat
prod (Suc Cero) x = x
prod x (Suc Cero) = x
prod (Suc x) (Suc y) = suma (Suc y) (prod x (Suc y))
prod _ _ = Cero
pot :: Nat -> Nat -> Nat
pot Cero _ = Cero
pot _ Cero = Suc Cero
pot (Suc Cero) _ = Suc Cero
pot (Suc x) (Suc y) = prod (Suc x) (pot (Suc x) y)
menor :: Nat -> Nat -> Bool
menor _ Cero = False
menor Cero _ = True
menor (Suc x) (Suc y) = menor x y
resta :: Nat -> Nat -> Nat
resta x Cero = x
resta (Suc x) (Suc y) = resta x y
resta _ _ = Cero
divi :: Nat -> Nat -> Nat
divi Cero _ = Cero
divi (Suc x) (Suc y) | menor y x = suma (Suc Cero) (divi (resta (Suc x) (Suc y)) (Suc y))
| menor x y = Cero
divi _ _ = Suc Cero
resto :: Nat -> Nat -> Nat
resto Cero _ = Cero
resto (Suc x) (Suc y) | menor x y = (Suc x)
| menor y x = resta (Suc x) (prod (divi (Suc x) (Suc y)) (Suc y) )