Pregunta originalmente respondida: ¿Cuál es la relación entre computabilidad y lógica?
¿Por qué ambos temas se agrupan en algunos libros (Metaleematemáticas de Kleene, Computabilidad y lógica de Boolo, etc.) cuando aparentemente son muy diferentes (uno trata con el procesamiento de cadenas de símbolos y el otro con razonamiento válido). ¿Por qué se estudian juntos los hallazgos de Gödel y Turing?
Una pregunta muy interesante! ¿Cuál es la relación?
- Sin la ayuda del otro, ¿pueden las computadoras y el arte adoptar mutuamente la identidad del otro?
- Si una dirección RAM contiene 8 bits, ¿contiene códigos de operación y operandos en la misma dirección? Si una dirección de memoria es de 8 bits y tiene un tipo de datos de 32 bits, ¿cargará la CPU los 4 bytes automáticamente?
- ¿Cuáles son algunas aplicaciones interesantes del aprendizaje automático en la aplicación de la ley y la lucha contra el terrorismo?
- ¿Cómo se relacionan estrechamente la ingeniería informática (CSE) y las matemáticas discretas?
- ¿Cuál es la mejor técnica de aprendizaje automático para comprender las ganancias?
Como usted señala, la computación parece tratarse de malabarismos y la lógica parece abordar un razonamiento válido.
Pero si alguna vez ha estudiado cómo funcionan los sistemas lógicos, notará que los sistemas lógicos en sí mismos también hacen malabares con las cadenas.
Por ejemplo, en un sistema de lógica, podríamos tener la regla de [matemáticas] \ tierra [/ matemáticas] -explotación-izquierda, que dice que si tenemos una proposición de la forma [matemáticas] A \ tierra B [/ matemáticas], que es una cadena que consta de tres subcadenas “[matemática] A [/ matemática]”, “[matemática] \ land [/ matemática]” y “[matemática] B [/ matemática]”, entonces podemos deducir [matemática] A [/ matemáticas].
Es una regla de cálculo que le dice que [math] \ land-explotación-left (“A”, “\ land”, “B”) = “A” [/ math]. Básicamente, eso es una regla de inferencia: ¡una función de [math] f: \ operatorname {string} ^ n \ mapsto \ operatorname {string} [/ math]!
En otras palabras, la deducción es el cálculo. Y el razonamiento válido con una lógica es la deducción en esa lógica.
Por el contrario, el cálculo es deducción en algún sistema formal.
Ahora parece que estoy argumentando que la computabilidad y la lógica son la misma cosa, pero esto no es del todo cierto. En esa última oración escribí sistema formal, no lógica. Si bien todo el cálculo es manipulación de cadenas, no siempre es posible interpretar las cadenas manipuladas como proposiciones en alguna lógica. Tomemos, por ejemplo, cualquier cálculo [math] \ lambda [/ math] escrito con la propiedad [math] \ operatorname {Type}: \ operatorname {Type} [/ math]. Como sistema computacional, estos sistemas de tipo pueden ser muy útiles, pero vistos como una lógica, la lógica sería inconsistente.
Existe una tensión entre la integridad combinatoria y la coherencia lógica. Aquí es donde se encuentra la interfaz entre la lógica y la computación. Como se menciona en otra respuesta, esta es la correspondencia de Howard-Curry:
[matemáticas] \ begin {array} {c | c} \ text {computation} & \ text {logic} \\\ hline \ text {program} & \ text {proof} \\\ text {type} & \ text { proposición} \\\ hline \ end {array} [/ math]
Esta correspondencia es entre los tipos de algún sistema computacional y las proposiciones en la lógica intuicionista. Se puede extender a la lógica clásica y la lógica modal.
Un ejemplo simple debería ayudar a aclarar esto:
El cálculo lambda es un modelo básico de computación que es precisamente tan fuerte como las máquinas de Turing. Considere una expresión de cálculo lambda escrita [matemáticas] M :: = (\ lambda x: \ alpha. (M: \ beta)): \ alpha \ rightarrow \ beta [/ math].
Esta expresión representa una función de tipo [math] \ alpha \ rightarrow \ beta [/ math] que dado un argumento de tipo [math] \ alpha [/ math] devolverá un resultado de tipo [math] \ beta [/ math] .
Entonces tenemos lo siguiente:
- [matemáticas] M: \ alpha \ rightarrow \ beta [/ matemáticas]
- [matemáticas] a: \ alpha [/ matemáticas]
- [matemáticas] (Ma): \ beta [/ matemáticas]
Solo dejemos caer los términos a la izquierda del colon, dejándonos solo los tipos y veamos qué obtenemos:
- [matemáticas] \ alpha \ rightarrow \ beta [/ matemáticas]
- [matemáticas] \ alpha [/ matemáticas]
- [matemáticas] \ beta [/ matemáticas]
Pero esto es modus ponens si consideramos [math] \ alpha [/ math] y [math] \ beta [/ math] como proposiciones. Este es el ejemplo más simple posible de la correspondencia de Howard-Curry.
La correspondencia sugiere un significado computacional para los conectivos de una lógica y puede extenderse más allá de las implicaciones. Por ejemplo, el conectivo [math] \ land [/ math] también se puede incluir, incluyendo como términos pares ordenados de valores escritos [math] (a: \ alpha, b: \ beta): [/ math] [math] \ alpha \ land \ beta [/ math].
La idea general es que los tipos forman proposiciones y los términos son, en cierto sentido, una prueba de la proposición, evidencia de la proposición.
Esto nos permite codificar una proposición y su prueba de deducción natural en un solo término tipo lambda. (o una prueba del sistema Hilbert como término de lógica combinatoria).
Por ejemplo, considere la siguiente prueba de [matemáticas] A \ supset A [/ matemáticas]:
[matemáticas] \ begin {array} {c | ll} 1 y A y \ text {Suposición} \\ 2 y A y \ text {Desde la línea 1 por reiteración} \\ 3 y A \ supset A y \ text {Desde las líneas 1 y 2 por} \ supset \ text {-introduction} \ end {array} [/ math]
Toda esta deducción puede codificarse como el término lambda [matemática] I :: = (\ lambda x: A. (X: A)): A \ supset A [/ math]. [Math] \ lambda [/ math] introduce una suposición llamada [math] x [/ math] que [math] A [/ math]. El uso de [math] x [/ math] en el cuerpo de la función ‘usa’ ese supuesto al citarlo o reiterarlo [math] (x: A) [/ math]. Unir la suposición junto con el cuerpo para formar la abstracción lambda es [math] \ supset [/ math] -introduction.
Y en el cálculo lambda podemos pasar funciones a otras funciones o devolverlas como resultado de una función, por lo que lo que tenemos aquí es un método de manipulación de pruebas.
La función [math] I [/ math] anterior se puede ver como una función que, dada cualquier prueba de una proposición [math] A [/ math] devuelve una prueba de la proposición [math] A \ supset A [/ math].
Esta es una herramienta muy poderosa de hecho.