IIC2233 / Syllabus

145 stars 13 forks source link

Acerca del origen del nombre de la función "Lambda" #415

Open Igufu opened 3 weeks ago

Igufu commented 3 weeks ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Contenido

¡Saludos!, tengo una pregunta respecto al origen del nombre de la función anónima lambda, se supone que proviene del "Cálculo lambda", y también según lo que he visto, esta rama del cálculo es la fundación de la programación funcional. Quería saber si alguien me podría iluminar un poco (ya que la programación funcional es un tema gigante) de qué se trata todo esto. ¡Gracias!

3rdPix commented 3 weeks ago

*nada de esto es necesario para este ramo

Una pequeña clase de historia

Down the rabbit hole

Contexto

A inicio del siglo XX la lógica matemática estaba "en pañales"; muchas de las ideas de las que hoy disponemos y tenemos casi por "intuición" no estaban formalizadas en aquél entonces. Entre los primeros trabajos que se publicaron y que sirvieron de cimiento para la construcción de un sistema formal (lógico), estuvo la obra de Gottlob Frege llamada Grundgesetze der Arithmetik (Leyes fundamentales de la aritmética). En ella, el autor buscaba construir la aritmética sobre la base de la lógica pura (reducir los enunciados matemáticos a proposiciones lógicas). Pero esta era inconsistente, tal como lo hizo ver Bertrand Russell en la paradoja que lleva su nombre. La construcción de esta paradoja tiene que ver con la teoría de conjuntos. Solo por completitud te lo dejo aquí:

Este enfoque evita la paradoja porque no permita la existencia de un conjunto como R, ya que no es posible que un conjunto pueda referirse a sí mismo o a un conjunto de su mismo tipo. Esta teoría de Russell fue también una forma primitiva de restaurar la coherencia en la lógica matemática después de que se notaran paradojas en la teoría de conjuntos. Su importancia fue grande; en 1910 daría lugar (en coautoría con Alfred N. Whitehead) al famoso Principia mathematica, en que la teoría de tipos se emplea para reconstruir gran parte de la matemática de ese entonces, pero sobre una base lógica más segura.

El desarrollo de la lógica matemática no solo transformó la comprensión y la forma de abordar las matemáticas, sino que tiene directa relación con los sistemas computacionales modernos (y antiguos, duh)...

Matemática o computación?

Los computadores en su forma más básica son conexiones eléctricas que se configuran de formas específicas para lograr un resultado predecible y usable. Están construidos y funcionan a partir de sistemas lógicos formales para la manipulación de datos. Paradojas como la mencionada anteriormente pueden dar lugar a comportamientos indereterminados en los algoritmos si es que estos intentan ser representados por medio de un sistema simbólico poco estructurado o con errores que surgen de sus propias definiciones.

Lo que es más, el uso de matemática abstracta (si no es bien utilizada) puede presentar problemas al momento de intentar modelar un sistema físico que depende de estados iniciales. Spoiler: la falta de un sistema lógico formal hacia que no estuviera bien utilizada. Un ejemplo sencillo y (muy) poco riguroso pero que te puede dar una idea de dónde pueden comenzar a surgir problemas con esto, es en un efecto dominó: supongamos que estoy limitado a hacer una única acción sobre una hilera de dominoes, esta única acción será "empujar el dominó 6|6". Desde un punto de vista matemático, el orden de los factores no debería afectar al producto ~(si ok depende de la operación, sistema numérico, métrica y lo que quieras, pero aguarda el ejemplo recuerda que no hay nada formal definido aun)~, por lo que sin importar el orden en que yo ubique a esta larga hilera de dominoes debería acabar con todos ellos caídos (es el objetivo). Ya puedes intuir que esto no tiene sentido; dependiendo de dónde ubique esa pieza 6|6 es el resultado que tendré: podrían caer todos, podrían caer solo algunos, podría caer solo esa pieza, etc. De alguna forma, esto nos ilustra que para representar un sistema específico necesitamos una notación y definiciones simbólicas y matemáticas más restringidas o directamente nuevas. El hecho de que la misma propiedad conmutativa se mantenga solo bajo ciertas condiciones me indica que necesito, previamente, indicar cuáles son estas condiciones. Esto no es deseable (por qué? 👀).

Este ejemplo ilustra cómo un sistema físico, como una hilera de dominós, no sigue necesariamente las propiedades conmutativas que la matemática abstracta podría asumir. Esto es análogo a cómo los algoritmos computacionales pueden comportarse de manera inesperada si no están bien definidos en un sistema lógico formal que tenga en cuenta estas 'condiciones iniciales'.

Una nueva idea 💡

A partir todo lo anterior es que en 1932, Alonzo Church comienza a intentar diseñar un sistema simbólico-matemático que pudiera servir para estudiar los computadores, su capacidad, limitaciones, etc (en realidad era la creación de un sistema que pudiera resolver la paradoja sin necesidad de los tipos establecidos por Russell). La primera aparición de "lambda" (λ) en este contexto fue publicada en su artículo A Set of Postulates for the Foundation of Logic donde el autor crea los cimientos del cálculo lambda. Unos bicharracos que se ven mas o menos así:

Church luego continuaría su desarrollo en la segunda parte de los posulados. Bonito. Pero el trabajo más importante y más incumbente a nuestra área es sin duda "An Unsolvable Problem of Elementary Number Theory". En este, utiliza el cálculo lambda como herramienta en su investigación sobre la decibilidad en las matemáticas y la lógica, así, se dió paso a este sistema simbólico como un modelo formal de computación. Demostró que ciertos problemas de la lógica matemática no se podían resolver mediante un proceso mecánico (algoritmo). Esto dió lugar a la primera formalización del concepto de computabilidad y pavimentó el sendero para la posterior tesis de Church-Turing. Esta última tesis es otro monstruo teórico y una rama de este agujero de conejo por el que no tiene sentido irse en este momento :c, pero que es sin duda muy interesante (por si quieres averiguar más, que sepas que no es una pérdida de tiempo).

Tres doritos después...

Lo que Church había ideado en esos años tuvo un resurgimiento en importancia (no que alguna vez la haya perdido, pero digamos que encontró un nuevo nicho) en los lenguajes de programación. Las ideas de tener cosas independientes, que trabajasen siempre de la misma forma determinística, que arrojaran un mismo resultado dadas las mismas condiciones iniciales y que pudieran ser encapsuladas bajo identificadores y nomeclaturas que dependieran de tipos, convergen en lo que hoy conocemos como uno de los paradigmas de progamación: la programación funcional.

Los pioneros en este sentido fueron lenguajes que integraban parcialmente ideas funcionales como LISP (:D) y ML. Por supuesto, más tarde surgirían lenguajes estrictamente funcionales como Haskell (cuyo logo es justamente un lambda :o), Idris, PureScript por mencionar algunos.

Y 🐍?

Python siempre quiso ser un lenguaje muy dinámico capaz de lograr hacer de todo, de todas las formas posibles (logradísimo en la actualidad). Es por ello que desde sus inicios integró la posibilidad de trabajar con estas ideas del paradigma funcional a través de su versión de funciones independientes que llamó, muy creativamente, bajo la palabra clave lambda, la cual ya conoces (espero D:).

Lambda fue integrado en python en su primera versión oficial (1.0.1) que puedes revisar en el siguiente commit.

Esta es una pequeña pincelada superficial sobre el orígen de lambda... si bien su origen tiene mucho peso y significancia en términos de lo que se estaba trabajando, el uso de ese símbolo particular (lambda) que luego derivaría en el logo de Haskell y la palabra clave de python, fue básicamente porque a Alonzo Church se le plantó utilizar ese símbolo, y no otro, en su trabajo. Decepcionante, no? xD