En matemáticas , la codificación de Church significa la representación (o procedimiento de representación) de datos y operadores en un procedimiento de cálculo lambda. La necesidad del procedimiento se debe a que en el cálculo lambda puro entre los términos solo hay variables y no hay constantes. Para obtener objetos que se comporten de la misma forma que los números, se aplica la codificación Church. El procedimiento en sí lleva el nombre de Alonzo Church , quien desarrolló el cálculo lambda y fue pionero en este método de codificación de datos. Al igual que los números, la codificación de Church también se puede utilizar para representar otros tipos de objetos que se comportan como constantes.
Los términos que suelen ser primitivos en otras notaciones (como números enteros, booleanos, pares, listas y uniones etiquetadas) se representan en el código de Church mediante funciones de orden superior . En una de sus formulaciones, la tesis de Turing-Church establece que cualquier operador computable (y sus operandos) pueden ser representados en la codificación de Church. En el cálculo lambda sin tipo, las funciones son el único tipo de datos primitivo y todas las demás entidades se construyen utilizando la codificación Church.
La codificación de iglesia generalmente no se usa para la implementación práctica de tipos de datos primitivos. Se utiliza con el propósito de demostrar de manera concluyente que no se requieren otros tipos de datos primitivos para realizar cálculos.
Los números de la Iglesia son representaciones de números naturales en la codificación de la Iglesia. Una función de orden superior , que representa un número natural n, es una función que asigna cualquier función a su composición de n veces . En pocas palabras, el "valor" de un número es equivalente al número de veces que la función encapsula su argumento.
Todos los números de la Iglesia son funciones con dos parámetros. Los números de Iglesia '0' , '1' , '2' , …, se definen en el cálculo lambda de la siguiente manera:
significa "no aplicar la función en absoluto", significa "aplicar la función 1 vez", etc.:
Número | Definición numérica | expresión lambda |
---|---|---|
0 | ||
una | ||
2 | ||
3 | ||
⋮ | ⋮ | ⋮ |
El número 3 de Church representa el proceso de aplicar cualquier función f utilizada tres veces. Esta función se aplica secuencialmente primero al parámetro que se le pasa y luego al resultado obtenido como resultado de su aplicación anterior.
Las operaciones aritméticas con números se pueden representar mediante funciones con números de Iglesia. Estas funciones pueden definirse en el cálculo lambda o implementarse en la mayoría de los lenguajes de programación funcionales (consulte Convertir expresiones lambda en funciones ).
Los booleanos de iglesia son el resultado de la codificación de iglesia aplicada a la representación de los valores booleanos verdaderos y falsos. Algunos lenguajes de programación los utilizan como modelo de implementación para la aritmética booleana. Ejemplos de este tipo de lenguajes son Smalltalk y Pico .
La lógica booleana puede verse como una opción. La codificación de iglesia para booleanos es una función de dos parámetros:
Estas dos definiciones se conocen como booleanos de la iglesia:
Esta definición permite que los predicados (es decir, las funciones que devuelven un valor booleano ) funcionen directamente como si fueran condiciones:
Una función que devuelve un valor booleano, que luego se aplica a dos parámetros, devuelve el primer o el segundo parámetro:
se resuelve como una cláusula entonces si x se evalúa como verdadero, y como una cláusula si x se evalúa como falso.
Dado que verdadero y falso corresponden a la elección del primer o segundo parámetro de esta función, este formalismo se puede utilizar para implementar operadores lógicos estándar. Tenga en cuenta que hay dos versiones de la implementación del operador not, según la estrategia de resolución de expresión elegida .
Algunos ejemplos:
Los predicados son funciones que devuelven un valor booleano.
El predicado más fundamental es , que devuelve (verdadero) si su argumento es un número de Iglesia y (falso) si su argumento es cualquier otro número de Iglesia:
Este predicado comprueba si su primer argumento es menor o igual que su segundo:
,En relación con la identidad
La verificación de igualdad se puede implementar de la siguiente manera:
Ver también: contras
Los pares de iglesias son una representación codificada por la iglesia de un tipo de par, es decir, una tupla de dos valores. Un par se representa como una función que toma otra función como argumento. El resultado de esta función es aplicar el argumento a los dos componentes del par. Definición en cálculo lambda :
Ejemplo:
La lista ( inmutable ) consta de nodos. Las siguientes son las operaciones básicas para las listas:
Función | Descripción |
---|---|
nulo | Devuelve una lista vacía. |
isil | Comprueba si la lista está vacía. |
contras | Agrega el valor dado al comienzo de una lista (posiblemente vacía). |
cabeza | Devuelve el primer elemento de la lista. |
cola | Devuelve la lista completa excepto el primer elemento. |
A continuación se muestran cuatro vistas de lista diferentes:
Una lista no vacía puede ser implementada por un par de iglesias;
Sin embargo, no es posible expresar una lista vacía de esta manera, porque no tenemos una representación del valor vacío (nulo) definido. Para representarlo y poder codificar listas vacías, un par puede estar envuelto en otro par.
Usando esta idea, las operaciones de lista básicas se pueden expresar de la siguiente manera: [1]
expresión | Descripción |
---|---|
El primer elemento del par es verdadero , lo que significa que la lista está vacía. | |
Comprobando si la lista está vacía. | |
cree un nodo de lista no vacío y pásele el primer elemento (el encabezado de la lista) h y la cola t . | |
segundo.primero es el encabezado de la lista. | |
segundo.segundo es la cola de la lista. |
En una lista vacía, el acceso al segundo elemento ( Second ) nunca se utiliza, en la medida en que los conceptos de cabeza y cola de una lista se aplican solo a listas no vacías.
Alternativamente, las listas se pueden definir de la siguiente manera: [2]
donde la última definición es un caso especial de una función más general:
Como alternativa a la codificación mediante pares de iglesias, se puede codificar una lista identificándola con una función de pliegue asociativo derecho. Por ejemplo, una lista de tres elementos x, y y z se puede codificar con una función de orden superior que, cuando se aplica al combinador c y el valor n, devuelve cx(cy(czn)).
Otra representación alternativa es la representación codificada de listas de Scott, que utiliza la idea de continuación y puede conducir a la simplificación del código [3] . (ver también codificación Mogensen-Scott ). En este enfoque, utilizamos el hecho de que las listas se pueden procesar mediante la coincidencia de patrones .