Codificación de la iglesia

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.

Números de iglesia

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.


Cálculos con números de Iglesia

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 ).

Codificación de booleanos

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:

Predicados

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:

Parejas de la iglesia

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:

Codificaciones de lista

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:

Representación como dos pares

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.

Representación como un solo par

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:

Representación de una lista a través de una función de pliegue asociativa por la derecha

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)).

Representación de listas utilizando la codificación Scott

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 .

Literatura

Véase también

Notas

  1. Pierce, Benjamín C. Tipos y lenguajes de programación . - MIT Press , 2002. - Pág. 500. - ISBN 978-0-262-16209-8 .
  2. Trompo, John. 14. Cálculo Lambda Binario y Lógica Combinatoria // Aleatoriedad y Complejidad, De Leibniz a Chaitin  (Inglés) / Calude, Cristian S.. - World Scientific , 2007. - P. 237-262. — ISBN 978-981-4474-39-9 .
    Como PDF: Tromp, John Binary Lambda Calculus and Combinatory Logic (PDF) (14 de mayo de 2014). Consultado el 24 de noviembre de 2017. Archivado desde el original el 1 de junio de 2018.
  3. Jansen, Jan Martín. Programación en el λ-Calculus: de Church a Scott y  viceversa // LNCS  : diario. - 2013. - Vol. 8106 . - pág. 168-180 . -doi : 10.1007 / 978-3-642-40355-2_12 .