En lógica matemática , el índice de De Bruijn es una herramienta inventada por el matemático neerlandés Nicolaas Govert de Bruijn para representar términos del cálculo lambda sin nombrar las variables ligadas. [ 1 ] Los términos escritos usando estos índices son invariantes con respecto a la α-conversión , por lo que la verificación de la α-equivalencia es la misma que la de la igualdad sintáctica. Cada índice de De Bruijn es un número natural que representa una ocurrencia de una variable en un λ-término, y denota el número de ligadores que están en el ámbito entre esa ocurrencia y su ligador correspondiente. Los siguientes son algunos ejemplos:
- El término λ x . λ y . x , a veces llamado combinador K , se escribe como λ λ 2 con índices de De Bruijn. El ligador para la ocurrencia x es el segundo λ en el ámbito.
- El término λ x . λ y . λ z . x z ( y z ) (el combinador S ), con índices de De Bruijn, es λ λ λ 3 1 (2 1).
- El término λ z . (λ y . y (λ x . x )) (λ x . z x ) es λ (λ 1 (λ 1)) (λ 2 1). Véase la siguiente ilustración, donde los archivos están coloreados y las referencias se muestran con flechas.
![]()
Los índices de De Bruijn se utilizan comúnmente en sistemas de razonamiento de orden superior , como demostradores automáticos de teoremas y sistemas de programación lógica . [ 2 ]
Definición formal
Formalmente, los términos λ ( M , N , ...) escritos utilizando índices de De Bruijn tienen la siguiente sintaxis (se permiten paréntesis libremente):
- M , N , ... ::= n | M N | λ M
donde n —números naturales mayores que 0— son las variables. Una variable n está ligada si se encuentra dentro del ámbito de al menos n ligadores (λ); de lo contrario, es libre . El sitio de ligadura para una variable n es el n -ésimo ligador dentro de cuyo ámbito se encuentra , comenzando desde el ligador más interno.
La operación más primitiva sobre los términos λ es la sustitución : reemplazar las variables libres en un término con otros términos. En la β-reducción (λ M ) N , por ejemplo, debemos
- encontrar las instancias de las variables n 1 , n 2 , ..., n k en M que están acotadas por el λ en λ M ,
- disminuir las variables libres de M para que coincidan con la eliminación del ligando λ externo, y
- Reemplazar n 1 , n 2 , ..., n k con N , incrementando adecuadamente las variables libres que aparecen en N cada vez, para que coincidan con el número de ligandos λ, bajo los cuales aparece la variable correspondiente cuando N sustituye a uno de los n i .
Para ilustrarlo, consideremos la aplicación.
- (λ λ 4 2 (λ 1 3)) (λ 5 1)
que podría corresponder al siguiente término escrito en la notación habitual
- (λ x . λ y . z x (λ u . u x )) (λ x . w x ).
Después del paso 1, obtenemos el término λ 4 □ (λ 1 □), donde las ocurrencias de la variable que se está sustituyendo se reemplazan con casillas. El paso 2 decrementa las variables libres, dando λ 3 □ (λ 1 □). Finalmente, en el paso 3, reemplazamos las casillas con el argumento, es decir, λ 5 1; la primera casilla está bajo un ligador, así que la reemplazamos con λ 6 1 (que es λ 5 1 con las variables libres incrementadas en 1); la segunda está bajo dos ligadores, así que la reemplazamos con λ 7 1. El resultado final es λ 3 (λ 6 1) (λ 1 (λ 7 1)).
Formalmente, una sustitución es una lista ilimitada de términos, escrita M 1 . M 2 ..., donde M i es el reemplazo para la i -ésima variable libre. La operación de incremento en el paso 3 a veces se llama desplazamiento y se escribe ↑ k donde k es un número natural que indica la cantidad a incrementar las variables, y se define por
Por ejemplo, ↑ 0 es la sustitución identidad, dejando un término sin cambios. Una lista finita de términos M 1 . M 2 ... M n abrevia la sustitución M 1 . M 2 ... M n .(n+1).(n+2)... dejando todas las variables mayores que n sin cambios. La aplicación de una sustitución s a un término M se escribe M [ s ]. La composición de dos sustituciones s 1 y s 2 se escribe s 1 s 2 y se define por
- ( M 1 . M 2 ...) s = M 1 [ s ]. M 2 [ s ]...
satisfaciendo la propiedad
- M [ s 1 s 2 ] = ( M [ s 1 ]) [ s 2 ],
y la sustitución se define en los siguientes términos:
Los pasos descritos anteriormente para la β-reducción se expresan, por lo tanto, de forma más concisa como:
- (λ M ) N → β M [ N .1.2.3...].
Alternativas a los índices de Bruijn
Al utilizar la representación estándar con nombre de los términos λ, donde las variables se tratan como etiquetas o cadenas, es necesario gestionar explícitamente la conversión α al definir cualquier operación sobre los términos. En la práctica, esto resulta engorroso, ineficiente y propenso a errores. Por consiguiente, se ha buscado una representación diferente de dichos términos. Por otro lado, la representación con nombre de los términos λ es más común y comprensible para otros usuarios, ya que las variables pueden tener nombres descriptivos. Así, incluso si un sistema utiliza internamente índices de De Bruijn, normalmente presentará una interfaz de usuario con nombres.
Una forma alternativa de ver los índices de De Bruijn es como niveles de De Bruijn, que indexan las variables desde la parte inferior de la pila en lugar de desde la superior. Esto elimina la necesidad de reindexar variables libres, por ejemplo, al debilitar el contexto, mientras que los índices de De Bruijn eliminan la necesidad de reindexar variables ligadas, por ejemplo, al sustituir una expresión cerrada en otro contexto. [ 3 ]
Los índices de De Bruijn no son la única representación de términos λ que evita el problema de la conversión α. Entre las representaciones con nombre, las técnicas nominales de Pitts y Gabbay constituyen un enfoque, donde la representación de un término λ se trata como una clase de equivalencia de todos los términos que se pueden reescribir a él mediante permutaciones de variables. [ 4 ] Este enfoque es adoptado por el paquete de tipos de datos nominales de Isabelle/HOL . [ 5 ]
Otra alternativa común es recurrir a representaciones de orden superior donde el ligador λ se trata como una función verdadera. En tales representaciones, los problemas de α-equivalencia, sustitución, etc., se identifican con las mismas operaciones en una metalógica .
Al razonar sobre las propiedades metateóricas de un sistema deductivo en un asistente de demostración , a veces es deseable limitarse a representaciones de primer orden y tener la capacidad de nombrar o renombrar supuestos. El enfoque localmente sin nombre utiliza una representación mixta de variables —índices de De Bruijn para variables ligadas y nombres para variables libres— que puede beneficiarse de la forma α-canónica de los términos indexados de De Bruijn cuando sea apropiado. [ 6 ] [ 7 ]
Convención de variables de Barendregt
La convención de variables de Barendregt [ 8 ] es una convención comúnmente utilizada en demostraciones y definiciones donde se supone que:
- Las variables ligadas son distintas de las variables libres, y
- Todos los enlazadores enlazan variables que no están ya en el ámbito.
En el contexto general de una definición inductiva, no es posible aplicar la α-conversión como se necesita para convertir una definición inductiva que utiliza la convención en una donde no se utiliza la convención, porque una variable puede aparecer tanto en una posición vinculante como en una posición no vinculante en la regla. El principio de inducción se cumple si cada regla satisface las dos condiciones siguientes: [ 9 ]
- La regla es equivariante en el sentido de la lógica nominal, es decir, su validez no se ve alterada al renombrar variables.
- Suponiendo las premisas de la regla, las variables en posiciones vinculantes en la regla son distintas y son libres en la conclusión.
Véase también
- La notación de De Bruijn para términos λ.
- La lógica combinatoria , una forma más esencial de eliminar los nombres de las variables.
Referencias
- ↑ de Bruijn, Nicolaas Govert (1972). "Notación del cálculo lambda con objetos ficticios sin nombre: una herramienta para la manipulación automática de fórmulas, con aplicación al teorema de Church-Rosser" (PDF) . Indagationes Mathematicae . 34 : 381–392 . ISSN 0019-3577 . Archivado (PDF) del original el 20 de mayo de 2011.
- ↑ Gabbay, Murdoch J.; Pitts, Andy M. (1999). "Un nuevo enfoque para la sintaxis abstracta que involucra ligaduras" (PDF) . 14.º Simposio Anual IEEE sobre Lógica en Ciencias de la Computación . págs. 214–224 . doi : 10.1109/LICS.1999.782617 . Archivado (PDF) del original el 27 de julio de 2004.
- ↑ Bauer, Andrej. "Cómo implementar la teoría de tipos dependientes III" . Matemáticas y Computación . Consultado el 20 de octubre de 2021 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Pitts, Andy M. (2003). "Lógica nominal: una teoría de primer orden de nombres y vinculación" . Information and Computation . 186 (2): 165– 193. doi : 10.1016/S0890-5401(03)00138-X . ISSN 0890-5401 .
- ↑ "Sitio web nominal de Isabelle" . Archivado del original el 14 de diciembre de 2014. Consultado el 28 de marzo de 2007 .
- ↑ McBride, Conor ; McKinna, James (2004). Functional Pearl: I am not a Number—I am a Free Variable (PDF) . Nueva York, Nueva York, EE. UU.: ACM Press. doi : 10.1145/1017472.1017477 . Archivado del original (PDF) el 28 de septiembre de 2013.
- ↑ Aydemir, Brian; Charguéraud, Arthur; Pierce, Benjamin Crawford ; Pollack, Randy; Weirich, Stephanie (2008). «Metateoría formal de ingeniería» (PDF) . Actas del 35.º simposio anual ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación . Nueva York, Nueva York, EE. UU.: ACM Press. págs. 3-15 . doi : 10.1145/1328438.1328443 . ISBN 9781595936899Archivado del original el 27 de julio de 2010 .
- ^ Barendregt, Hendrik Pieter (1984). El cálculo Lambda: su sintaxis y semántica . Holanda del Norte . pag. 26.ISBN 978-0-444-87508-2.
- ↑ Urban, Christian; Berghofer, Stefan; Norrish, Michael (2007). "Barendregt's Variable Convention in Rule Inductions" (PDF) . Automated Deduction – CADE-21 . Lecture Notes in Computer Science. Vol. 4603. pp. 35–50 . doi : 10.1007/978-3-540-73595-3_4 . ISBN 978-3-540-73594-6Archivado (PDF) del original el 6 de julio de 2017 .
- Cálculo lambda