En informática , la coinducción es una técnica para definir y demostrar propiedades de sistemas de objetos concurrentes que interactúan entre sí .
La coinducción es el dual matemático de la inducción estructural . Los tipos de datos definidos coinductivamente se conocen como codata y suelen ser estructuras de datos infinitas , como los flujos .
Como definición o especificación , la coinducción describe cómo un objeto puede ser "observado", "descompuesto" o "destruido" en objetos más simples. Como técnica de demostración , puede utilizarse para mostrar que una ecuación se satisface con todas las posibles implementaciones de dicha especificación.
Para generar y manipular datos de codificación, normalmente se utilizan funciones corecursivas , junto con la evaluación perezosa . De manera informal, en lugar de definir una función mediante la coincidencia de patrones en cada uno de los constructores inductivos, se definen cada uno de los "destructores" u "observadores" sobre el resultado de la función.
En programación, la programación co-lógica (co-LP para abreviar) "es una generalización natural de la programación lógica y la programación lógica coinductiva, que a su vez generaliza otras extensiones de la programación lógica, como árboles infinitos, predicados perezosos y predicados comunicantes concurrentes. La co-LP tiene aplicaciones a árboles racionales, verificación de propiedades infinitas, evaluación perezosa, programación lógica concurrente , verificación de modelos , pruebas de bisimilitud , etc." [ 1 ] Hay implementaciones experimentales de co-LP disponibles en la Universidad de Texas en Dallas [ 2 ] y en el lenguaje Logtalk (para ejemplos, véase [ 3 ] ) y SWI-Prolog .
Descripción
En su libro Types and Programming Languages , [ 4 ] Benjamin C. Pierce ofrece una formulación concisa tanto del principio de inducción como del principio de coinducción . Si bien este artículo no se centra principalmente en la inducción , resulta útil considerar de inmediato sus formas algo generalizadas. Para enunciar los principios, se requieren algunos preliminares.
Preliminares
Dejarser un conjunto yser una función monótona, eso es:
Salvo que se indique lo contrario,Se asumirá que es monótono.
- X es F-cerrado si
- X es F-consistente si
- X es un punto fijo si
Estos términos pueden entenderse intuitivamente de la siguiente manera. Supongamos quees un conjunto de afirmaciones, yes la operación que produce las consecuencias de. Entonceses F-cerrado cuando no se puede concluir nada más de lo que ya se ha afirmado, mientras quees F-consistente cuando todas las afirmaciones están respaldadas por otras afirmaciones (es decir, no hay "suposiciones no F -lógicas").
El teorema de Knaster-Tarski nos dice que el punto fijo más pequeño de(denotado) viene dado por la intersección de todos los conjuntos F-cerrados , mientras que el mayor punto fijo (denotado) viene dado por la unión de todos los conjuntos F-consistentes . Ahora podemos enunciar los principios de inducción y coinducción.
Definición
- Principio de inducción : Sies F-cerrado , entonces
- Principio de coinducción : Sies F-consistente , entonces
Discusión
Los principios, tal como se han enunciado, son algo opacos, pero pueden pensarse útilmente de la siguiente manera. Supongamos que desea probar una propiedad dePor el principio de inducción , basta con exhibir un conjunto F-cerrado.para lo cual la propiedad se posee. De manera similar, supongamos que desea demostrar que. Entonces basta con exhibir un conjunto F-consistente queSe sabe que es miembro de.
Ejemplos
Definir un conjunto de tipos de datos
Consideremos la siguiente gramática de tipos de datos:
Es decir, el conjunto de tipos incluye el "tipo inferior"., el "tipo superior"y tipos de productos. Estos tipos se pueden identificar con cadenas sobre el alfabeto.. Dejardenotan todas las cadenas (posiblemente infinitas) sobre. Consideremos la función:
En este contexto,significa "la concatenación de cadena", el símboloy cuerda." Ahora deberíamos definir nuestro conjunto de tipos de datos como un punto fijo de, pero importa si tomamos el punto fijo menor o el mayor .
Supongamos que tomamoscomo nuestro conjunto de tipos de datos. Utilizando el principio de inducción , podemos demostrar la siguiente afirmación:
Para llegar a esta conclusión, consideremos el conjunto de todas las cadenas finitas sobre. Claramenteno puede producir una cadena infinita, por lo que resulta que este conjunto es F-cerrado y la conclusión se deduce.
Ahora supongamos que tomamoscomo nuestro conjunto de tipos de datos. Nos gustaría utilizar el principio de coinducción para demostrar la siguiente afirmación:
Aquídenota la cadena infinitaPara utilizar el principio de coinducción , consideremos el siguiente conjunto:
Este conjunto es F-consistente . Primero,Segundo, puesto quey, tenemos. Interpretación de cadenas como secuencias (funciones de), anteponiendo el prefijo finitoa la cadena infinitarendimientossí mismo, así que. Por lo tantoy por el principio de coinducción ,.
Nota. La representación de tipos como cadenas sobreno es fiel a la estructura de árbol subyacente. Cadenas finitas comoson ambiguos sin corchetes, y para cualquier cadena infinitala concatenacióna pesar de, de modo que se pueden identificar árboles distintos. Esto no afecta al argumento anterior, que solo ilustra el principio de coinducción a través de la consistencia F , pero importaría en entornos donde se debe preservar la estructura del constructor. Un tratamiento estructural estándar representa los tipos a través del isomorfismo; consulte F-coalgebra para obtener más detalles.
Tipos de datos coinductivos en lenguajes de programación
Consideremos la siguiente definición de un flujo en Haskell : [ 5 ]
Flujo de datos a = S a ( Flujo a )-- Destructores de flujo cabeza :: Flujo a -> a cabeza ( S a flujo a ) = a cola :: Flujo a -> Flujo a cola ( S a flujo a ) = a flujoLa primera línea indica que un flujo se compone de un elemento seguido de otro flujo (S es un constructor de elementos, y a denota un tipo arbitrario para los elementos). Dado que no existe un caso base , esta definición parecería poco fundamentada , pero no obstante resulta útil en programación y se puede razonar sobre ella. En cualquier caso, un flujo es una lista infinita de elementos de la que se puede observar el primer elemento o colocar un elemento delante para obtener otro flujo.
Relación con las F -coalgebras
Consideremos el endofunctoren la categoría de conjuntos :
La F-coalgebra finaltiene asociado el siguiente morfismo:
:\nu F\rightarrow F(\nu F)=A\times \nu F}
Esto induce otra coalgebracon morfismo asociado. Porquees final , hay un morfismo único
de tal manera que
La composicióninduce otro homomorfismo de F -coalgebra. Desdees final, este homomorfismo es único y por lo tantoEn total tenemos:
Esto evidencia el isomorfismo, lo cual en términos categóricos indica quees un punto fijo dey justifica la notación. [ 6 ]
Transmisión como una coalgebra final
Demostraremos que Stream Aes la coálgebra final del functorConsideremos las siguientes implementaciones:
salida astream = ( cabeza astream , cola astream ) salida' ( a , astream ) = S a astreamEs fácil observar que son inversamente proporcionales, lo que evidencia el isomorfismo. Consulte la referencia para obtener más detalles.
Relación con la inducción matemática
Demostraremos cómo el principio de inducción engloba la inducción matemática. SeaSea alguna propiedad de los números naturales . Tomaremos la siguiente definición de inducción matemática:
Ahora consideremos la función:
No debería ser difícil ver quePor lo tanto, por el principio de inducción , si deseamos demostrar alguna propiedadde, basta con demostrar quees F-cerrado . En detalle, requerimos:
Eso es,
Esto es precisamente inducción matemática, tal como se ha dicho.
Véase también
Referencias
- ↑ "Co-Logic Programming | Lambda the Ultimate" .
- ↑ "Página principal de Gopal Gupta" .
- ↑ "Logtalk3/Ejemplos/Coinducción en master · LogtalkDotOrg/Logtalk3" . GitHub .
- ↑ Pierce, Benjamin C. Tipos y lenguajes de programación . MIT Press.
- ^ Kozen, Dexter ; Silva, Alejandra . "Coinducción práctica". CiteSeerX 10.1.1.252.3961 .
- ↑ Hinze, Ralf (2012). "Programación genérica con adjunciones" . Programación genérica e indexada . Notas de clase en informática. Vol. 7470. Springer. pp. 47–129 . doi : 10.1007/978-3-642-32202-0_2 . ISBN 978-3-642-32201-3.
Lecturas adicionales
- Libros de texto
- Davide Sangiorgi (2012). Introducción a la bisimulación y la coinducción . Cambridge University Press.
- Davide Sangiorgi y Jan Rutten (2011). Temas avanzados en bisimulación y coinducción . Cambridge University Press.
- Textos introductorios
- Andrew D. Gordon (1994). "Un tutorial sobre coinducción y programación funcional". 1994. pp. 78– 95. CiteSeerX 10.1.1.37.3914 . — descripción con orientación matemática
- Bart Jacobs y Jan Rutten (1997). Un tutorial sobre (co)álgebras e (co)inducción ( enlace alternativo ) — describe la inducción y la coinducción simultáneamente
- Eduardo Giménez y Pierre Castéran (2007). "Un tutorial sobre tipos [co-] inductivos en Coq"
- Coinducción : breve introducción
- Historia
- Davide Sangiorgi . " Sobre los orígenes de la bisimulación y la coinducción ", ACM Transactions on Programming Languages and Systems , vol. 31, n.º 4, mayo de 2009.
- Misceláneas
- Programación co-lógica: Ampliando la programación lógica con coinducción — describe el paradigma de programación co-lógica
- informática teórica
- Programación lógica
- Programación funcional
- Teoría de categorías
- Inducción matemática