El tipo de los números naturales
El tipo de los números raturales se puede definir por
1 2 |
data Nat = Cero | Suc Nat deriving (Show, Eq) |
de forma que Suc (Suc (Suc Cero))
representa el número 3.
Definir las siguientes funciones
1 2 3 |
nat2int :: Nat -> Int int2nat :: Int -> Nat suma :: Nat -> Nat -> Nat |
tales que
nat2int n
es el número entero correspondiente al número naturaln
. Por ejemplo,
1 |
nat2int (Suc (Suc (Suc Cero))) == 3 |
int2nat n
es el número natural correspondiente al número enteron
. Por ejemplo,
1 |
int2nat 3 == Suc (Suc (Suc Cero)) |
suma m n
es la suma de los número naturalesm
yn
. Por ejemplo,
1 2 3 4 5 6 |
λ> suma (Suc (Suc Cero)) (Suc Cero) Suc (Suc (Suc Cero)) λ> nat2int (suma (Suc (Suc Cero)) (Suc Cero)) 3 λ> nat2int (suma (int2nat 2) (int2nat 1)) 3 |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
data Nat = Cero | Suc Nat deriving (Show, Eq) nat2int :: Nat -> Int nat2int Cero = 0 nat2int (Suc n) = 1 + nat2int n int2nat :: Int -> Nat int2nat 0 = Cero int2nat n = Suc (int2nat (n-1)) suma :: Nat -> Nat -> Nat suma Cero n = n suma (Suc m) n = Suc (suma m n) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
from dataclasses import dataclass @dataclass class Nat: pass @dataclass class Cero(Nat): pass @dataclass class Suc(Nat): n: Nat def nat2int(n: Nat) -> int: match n: case Cero(): return 0 case Suc(n): return 1 + nat2int(n) assert False def int2nat(n: int) -> Nat: if n == 0: return Cero() return Suc(int2nat(n - 1)) def suma(m: Nat, n: Nat) -> Nat: match m: case Cero(): return n case Suc(m): return Suc(suma(m, n)) assert False |