Es curioso (y en cierto modo injusto) el hecho de que la igualdad
sea tan discutida en ciertos ámbitos.
No niego que este resultado pueda ser poco intuitivo al principio, sobre todo si primero nos enseñan que
para
, pero una vez que se demuestra, resulta de lo más natural en innumerables contextos.
Se pueden dar demostraciones de todo tipo (por ejemplo, la del Topo Lógico, basada en la teoría de conjuntos, es de las más lindas que vi); pero como yo soy menos riguroso y me gustan las computadoras, se me ocurrió darle al asunto un enfoque más orientado hacia la “elegancia algorítmica” (sea eso lo que sea).
Idea básica: aplicación iterada
Supongamos que necesitamos una función que tome dos números naturales y calcule su producto, usando la definición de producto como acumulación de sumas. Una manera iterativa de implementarla será algo así (en Python):
def producto(x, y):
# comenzamos con el elemento neutro de la suma
t = 0
# ahora aplicamos y veces el sumando x
for i in range(y):
t += x
return t
Y una manera recursiva, en Haskell por ejemplo:
producto x 0 = 0
producto x y = x + (producto x (y-1))
Aunque quizá no sean tremendamente eficientes, ambas funcionan perfectamente en todos los casos, e ilustran la definición del producto como aplicación repetida de la suma.
Extendiendo la idea
Supongamos que ahora nos piden que definamos la potencia de dos números naturales, usando la misma idea de acumulación, aunque ahora de productos en lugar de sumas.
Un programador que se precie usará el mismo patrón que antes, pero cambiando la operación aplicada y el elemento neutro.
La versión iterativa quedaría entonces así:
def potencia(x, y):
# comenzamos con el elemento neutro de la multiplicacion
t = 1
# ahora aplicamos y veces el factor x
for i in range(y):
t *= x
return t
Y la versión recursiva, así:
potencia x 0 = 1
potencia x y = x * (potencia x (y-1))
Y ambas dan la respuesta correcta para
.
¿No es bello? Además de haber ahorrado trabajo aplicando un patrón ya implementado, se logra la capacidad para definir funciones cada vez más “avanzadas”, cada una extendiendo un nivel la función anterior. Pero ese es tema para otro post…