En algunas publicaciones se hace referencia a él como BMF, como un guiño a la forma Backus–Naur . Jocosamente también se lo conoce como Squiggol , como un guiño a ALGOL , que también estaba en el ámbito de competencias del WG 2.1, y debido a los símbolos "ondulados" que utiliza. Un nombre de variante menos utilizado, pero en realidad el primero sugerido, es SQUIGOL . Martin y Nipkow proporcionaron soporte automatizado para las pruebas de desarrollo de Squiggol, utilizando el Larch Prover . [1]
Ejemplos básicos y notaciones
Map es una función de segundo orden bien conocida que aplica una función dada a cada elemento de una lista; en BMF, se escribe :
De la misma manera, reduce es una función que reduce una lista a un único valor mediante la aplicación repetida de un operador binario . Se escribe / en BMF. Tomando como operador binario adecuado con elemento neutro e , tenemos
Usando esos dos operadores y los primitivos (como la suma usual) y (para la concatenación de listas), podemos expresar fácilmente la suma de todos los elementos de una lista y la función flatten, como y , en estilo sin puntos . Tenemos:
De manera similar, al escribir para la composición funcional y para la conjunción , es fácil escribir una función que pruebe que todos los elementos de una lista satisfacen un predicado p , simplemente como :
Bird (1989) transforma expresiones ineficientes y fáciles de entender ("especificaciones") en expresiones complejas y eficientes ("programas") mediante manipulación algebraica. Por ejemplo, la especificación " " es una traducción casi literal del problema de suma máxima de segmentos , [6] pero ejecutar ese programa funcional en una lista de tamaño llevará tiempo en general. A partir de esto, Bird calcula un programa funcional equivalente que se ejecuta en tiempo , y es de hecho una versión funcional del algoritmo de Kadane .
La derivación se muestra en la imagen, con las complejidades computacionales [7] indicadas en azul y las aplicaciones de las leyes indicadas en rojo. Se pueden abrir instancias de ejemplo de las leyes haciendo clic en [mostrar] ; utilizan listas de números enteros, suma, resta y multiplicación. La notación en el artículo de Bird difiere de la utilizada anteriormente: , , y corresponden a , , y una versión generalizada de lo anterior, respectivamente, mientras que y calculan una lista de todos los prefijos y sufijos de sus argumentos, respectivamente. Como se indicó anteriormente, la composición de funciones se denota por " ", que tiene la precedencia de enlace más baja . En las instancias de ejemplo, las listas están coloreadas por profundidad de anidamiento; en algunos casos, se definen nuevas operaciones ad hoc (cuadros grises).
El lema del homomorfismo y sus aplicaciones a implementaciones paralelas
Una función h en listas se denomina homomorfismo de listas si existe un operador binario asociativo y un elemento neutro tales que se cumple lo siguiente:
El lema del homomorfismo establece que h es un homomorfismo si y sólo si existe un operador y una función f tales que .
Un punto de gran interés para este lema es su aplicación a la derivación de implementaciones altamente paralelas de cálculos. De hecho, es trivial ver que tiene una implementación altamente paralela, y lo hace también , más obviamente como un árbol binario. Por lo tanto, para cualquier homomorfismo de lista h , existe una implementación paralela. Esa implementación corta la lista en fragmentos, que se asignan a diferentes computadoras; cada una calcula el resultado en su propio fragmento. Son esos resultados los que transitan en la red y finalmente se combinan en uno. En cualquier aplicación donde la lista es enorme y el resultado es un tipo muy simple, digamos un entero, los beneficios de la paralelización son considerables. Esta es la base del enfoque map-reduce .
^ Donde , , y devuelven el valor más grande, la suma y la lista de todos los segmentos (es decir, sublistas) de una lista dada, respectivamente.
^ Cada expresión en una línea denota un programa funcional ejecutable para calcular la suma máxima del segmento.
Meertens, Lambert (1986). "Algoritmos: hacia la programación como actividad matemática". En de Bakker, JW; Hazewinkel, M.; Lenstra, JK (eds.). Matemáticas y Ciencias de la Computación . Monografías del CWI. Vol. 1. Holanda Septentrional. págs. 289–334.
Meertens, Lambert ; Bird, Richard (1987). "Dos ejercicios encontrados en un libro sobre algoritmos" (PDF) . Holanda Septentrional.
Backhouse, Roland (1988). Una exploración del formalismo de Bird-Meertens (PDF) (Informe técnico).
Bird, Richard S. (1989). "Identidades algebraicas para el cálculo de programas" (PDF) . The Computer Journal . 32 (2): 122–126. doi : 10.1093/comjnl/32.2.122 .
Cole, Murray (1993). "Programación paralela, homomorfismos de listas y el problema de la suma máxima de segmentos". Computación paralela: tendencias y aplicaciones, PARCO 1993, Grenoble, Francia . pp. 489–492.
Backhouse, Roland ; Hoogendijk, Paul (1993). Elementos de una teoría relacional de tipos de datos (PDF) . págs. 7–42. doi :10.1007/3-540-57499-9_15. ISBN 978-3-540-57499-6.
Bunkenburg, Alexander (1994). O'Donnell, John T.; Hammond, Kevin (eds.). The Boom Hierarchy (PDF) . Programación funcional, Glasgow 1993: Actas del Taller de Glasgow de 1993 sobre programación funcional, Ayr, Escocia, 5-7 de julio de 1993. Londres: Springer. págs. 1-8. doi :10.1007/978-1-4471-3236-3_1. ISBN .978-1-4471-3236-3.
Bird, Richard ; de Moor, Oege (1997). Álgebra de programación . Serie internacional en ciencias de la computación. Vol. 100. Prentice Hall. ISBN 0-13-507245-X.
Gibbons, Jeremy (2020). Troy Astarte (ed.). La escuela del garabato: una historia del formalismo de Bird-Meertens (PDF) . Métodos formales (Taller sobre historia de los métodos formales) . LNCS. Vol. 12233. Springer. doi :10.1007/978-3-030-54997-8_2.