En ciencias de la computación , la programación declarativa es un paradigma de programación que expresa la lógica de un cálculo sin describir completamente su flujo de control . [ 1 ]
Los lenguajes que permiten este estilo permiten al desarrollador minimizar o eliminar los efectos secundarios al describir lo que el programa debe lograr en términos del dominio del problema , en lugar de describir completamente cómo lograrlo como una secuencia de las primitivas del lenguaje de programación (el cómo se deja a la implementación del lenguaje ). Esto contrasta con la programación imperativa , que implementa algoritmos en pasos explícitos. [ 2 ] [ 3 ]
La programación declarativa puede considerar los programas como teorías de una lógica formal y los cálculos como deducciones en esa teoría lógica. La programación declarativa a veces simplifica la escritura de programas paralelos . [ 4 ]
Entre los paradigmas comunes de lenguajes declarativos se incluyen la programación lógica (por ejemplo, Prolog , Datalog , programación de conjuntos de respuestas ) y los sistemas de modelado algebraico .
Definición
La programación declarativa se define a menudo como cualquier estilo de programación que no sea imperativo. Otras definiciones comunes intentan definirla simplemente contrastándola con la programación imperativa. Por ejemplo:
- Un programa de alto nivel que describe lo que debe realizar un cálculo.
- Cualquier lenguaje de programación que carezca de efectos secundarios , o más específicamente, que tenga transparencia referencial .
- Un lenguaje con una clara correspondencia con la lógica matemática . [ 5 ]
Estas definiciones se superponen sustancialmente.
La programación declarativa es un estilo de programación no imperativo en el que los programas describen los resultados deseados sin enumerar explícitamente los comandos o pasos que deben ejecutarse. Los lenguajes de programación lógica se caracterizan por un estilo de programación mayoritariamente declarativo. En la programación lógica, los programas constan de sentencias expresadas en forma lógica , y el cálculo utiliza esas sentencias para resolver problemas, que también se expresan en forma lógica.
En un lenguaje funcional puro , como Haskell , todas las funciones carecen de efectos secundarios , y los cambios de estado se representan únicamente mediante funciones que transforman dicho estado, el cual se representa explícitamente como un objeto de primera clase en el programa. Si bien los lenguajes funcionales puros no son imperativos, suelen ofrecer la posibilidad de describir el efecto de una función como una serie de pasos. Otros lenguajes funcionales, como Lisp , OCaml y Erlang , admiten una combinación de programación procedimental y funcional.
Algunos lenguajes de programación lógica, como Prolog , y lenguajes de consulta de bases de datos , como SQL , si bien son declarativos en principio, también admiten un estilo de programación procedimental.
Subparadigmas
La programación declarativa es un término general que incluye varios paradigmas de programación más conocidos .
Programación con restricciones
La programación con restricciones establece relaciones entre variables mediante restricciones que especifican las propiedades de la solución objetivo. El conjunto de restricciones se resuelve asignando un valor a cada variable de manera que la solución sea consistente con el número máximo de restricciones. La programación con restricciones suele complementar otros paradigmas: programación funcional, lógica e incluso imperativa.
Lenguas híbridas
Los Makefiles, por ejemplo, especifican dependencias de forma declarativa, [ 6 ] pero también incluyen una lista imperativa de acciones a realizar. De manera similar, yacc especifica una gramática libre de contexto de forma declarativa, pero incluye fragmentos de código de un lenguaje anfitrión, que suele ser imperativo (como C ).
Programación lógica
Los lenguajes de programación lógica, como Prolog , Datalog y la programación de conjuntos de respuestas , calculan demostrando que un objetivo es una consecuencia lógica del programa o mostrando que el objetivo es verdadero en un modelo definido por el programa. Prolog calcula reduciendo los objetivos a subobjetivos, de arriba hacia abajo mediante razonamiento hacia atrás , mientras que la mayoría de los sistemas Datalog calculan de abajo hacia arriba mediante razonamiento hacia adelante . Los programas de conjuntos de respuestas suelen utilizar solucionadores SAT para generar un modelo del programa.
Modelado
Los modelos, o representaciones matemáticas, de sistemas físicos pueden implementarse en código informático declarativo. Este código contiene una serie de ecuaciones, no asignaciones imperativas, que describen ("declaran") las relaciones de comportamiento. Cuando un modelo se expresa en este formalismo, un ordenador puede realizar manipulaciones algebraicas para formular de la mejor manera el algoritmo de solución. La causalidad matemática se impone normalmente en los límites del sistema físico, mientras que la descripción del comportamiento del sistema en sí es declarativa o acausal. Entre los lenguajes y entornos de modelado declarativo se incluyen Analytica , Modelica y Simile . [ 7 ]
Ejemplos
Prólogo
Prolog (1972) significa "PROgramación en lógica". Fue desarrollado para responder preguntas en lenguaje natural , [ 8 ] utilizando la resolución SL [ 9 ] tanto para deducir respuestas a consultas como para analizar y generar oraciones en lenguaje natural.
Los componentes básicos de un programa Prolog son los hechos y las reglas . He aquí un ejemplo sencillo:
gato ( tom ). % Tom es un gato ratón ( jerry ). % Jerry es un ratónanimal ( X ) :- gato ( X ). % cada gato es un animal animal ( X ) :- ratón ( X ). % cada ratón es un animalgrande ( X ) :- gato ( X ). % cada gato es grande pequeño ( X ) :- ratón ( X ). % cada ratón es pequeñocomer ( X , Y ) :- ratón ( X ), queso ( Y ). % cada ratón come cada queso comer ( X , Y ) :- grande ( X ), pequeño ( Y ). % cada ser grande come cada ser pequeñoDado este programa, la consulta tiene éxito, mientras que falla. Además, la consulta tiene éxito con la sustitución de respuesta .eat(tom,jerry)eat(jerry,tom)eat(X,jerry)X=tom
Prolog ejecuta programas de arriba hacia abajo, utilizando la resolución SLD para razonar hacia atrás , reduciendo los objetivos a subobjetivos. En este ejemplo, utiliza la última regla del programa para reducir el objetivo de responder a la consulta a los subobjetivos de encontrar primero una X tal que se cumpla y luego demostrar que se cumple. Repite el uso de reglas para reducir aún más los subobjetivos a otros subobjetivos, hasta que finalmente logra unificar todos los subobjetivos con los hechos del programa. Esta estrategia de razonamiento hacia atrás y reducción de objetivos trata las reglas en los programas lógicos como procedimientos, y convierte a Prolog en un lenguaje de programación tanto declarativo como procedimental . [ 10 ]eat(X,jerry)big(X)small(jerry)
La amplia gama de aplicaciones de Prolog se destaca en el libro Año de Prolog, [ 11 ] que celebra el 50 aniversario de Prolog.
Registro de datos
Los orígenes de Datalog se remontan a los inicios de la programación lógica, pero se identificó como un área independiente alrededor de 1977. Sintáctica y semánticamente , es un subconjunto de Prolog. Sin embargo, debido a que carece de términos compuestos , no es Turing-completo .
La mayoría de los sistemas Datalog ejecutan programas de abajo hacia arriba, utilizando reglas para razonar hacia adelante , derivando nuevos hechos a partir de hechos existentes y finalizando cuando no hay nuevos hechos que se puedan derivar, o cuando los hechos derivados se unifican con la consulta.
Datalog se ha aplicado a problemas como la integración de datos , la extracción de información , las redes , la seguridad , la computación en la nube y el aprendizaje automático . [ 12 ] [ 13 ]
Programación de conjuntos de respuestas
La programación de conjuntos de respuestas (ASP) surgió a finales de la década de 1990, basándose en la semántica de modelos estables (conjuntos de respuestas) de la programación lógica. Al igual que Datalog, es un subconjunto de Prolog; y, debido a que carece de términos compuestos, no es Turing-completa.
La mayoría de las implementaciones de ASP ejecutan un programa estableciendo primero su base , reemplazando todas las variables en las reglas por constantes de todas las maneras posibles, y luego utilizando un solucionador SAT proposicional, como el algoritmo DPLL , para generar uno o más modelos del programa.
Sus aplicaciones están orientadas a resolver problemas de búsqueda difíciles y a la representación del conocimiento . [ 14 ] [ 15 ]
Véase también
Referencias
- ↑ Lloyd, JW (19-22 de septiembre de 1994). "Ventajas prácticas de la programación declarativa" (PDF) . En Alpuente, María; Barbuti, Roberto; Ramos, Isidro (eds.). GULP-PRODE'94 1994 Joint Conference on Declarative Programming . Vol. I. Peñíscola , España. pp. 3-17 .
- ↑ Sebesta, Robert (2016). Conceptos de lenguajes de programación . Boston: Pearson. ISBN 978-0-13-394302-3OCLC 896687896 .
- ↑ "Programación imperativa: Panorama general del paradigma de programación más antiguo" . Guía digital de IONOS . 21 de mayo de 2021. Archivado del original el 3 de mayo de 2022. Consultado el 23 de mayo de 2023 .
- ↑ "DAMP 2009: Taller sobre aspectos declarativos de la programación multinúcleo" . Cse.unsw.edu.au. 20 de enero de 2009. Archivado del original el 13 de septiembre de 2013. Consultado el 15 de agosto de 2013 .
- ↑ Chakravarty, Manuel MT (14 de febrero de 1997). Sobre la ejecución masivamente paralela de programas declarativos (tesis doctoral). Universidad Técnica de Berlín . Archivado del original el 23 de septiembre de 2015. Recuperado el 26 de febrero de 2015.
En este contexto, el criterio para llamar declarativo a un lenguaje de programación es la existencia de una correspondencia clara y matemáticamente establecida entre el lenguaje y la lógica matemática, de modo que una semántica declarativa para el lenguaje pueda basarse en el modelo o la teoría de la prueba (o ambos) de la lógica.
- ↑ "Descripción general de las DSSL" . Archivado del original el 23 de octubre de 2007.
- ↑ "Modelado declarativo" . Simulistics. Archivado del original el 11 de agosto de 2003. Recuperado el 15 de agosto de 2013 .
- ↑ "Nacimiento de Prolog" (PDF) . Noviembre de 1992. Archivado (PDF) del original el 2 de abril de 2015. Consultado el 25 de mayo de 2022 .
- ↑ Robert Kowalski; Donald Kuehner (Invierno de 1971). "Resolución lineal con función de selección" (PDF) . Inteligencia artificial . 2 ( 3–4 ): 227–260 . doi : 10.1016/0004-3702(71)90012-9 . ISSN 0004-3702 . Archivado (PDF) del original el 23 de septiembre de 2015. Recuperado el 13 de agosto de 2023 .
- ↑ Robert Kowalski, Lógica de predicados como lenguaje de programación. Archivado el 7 de febrero de 2016 en Wayback Machine. Memorando 70, Departamento de Inteligencia Artificial, Universidad de Edimburgo, 1973. También en Actas del Congreso IFIP, Estocolmo, North Holland Publishing Co., 1974, págs. 569-574.
- ↑ Warren, DS (2023). «Introducción a Prolog». En Warren, DS; Dahl, V.; Eiter, T.; Hermenegildo, MV; Kowalski, R.; Rossi, F. (eds.). Prolog: Los próximos 50 años . Lecture Notes in Computer Science (LNCS). Vol. 13900. Springer, Cham. pp. 3–19 . doi : 10.1007/978-3-031-35254-6_1 . ISBN 978-3-031-35253-9.
- ↑ Huang, Shan Shan; Green, Todd J.; Loo, Boon Thau (12-16 de junio de 2011). Datalog y aplicaciones emergentes (PDF) . SIGMOD 2011. Atenas, Grecia: Association for Computing Machinery. ISBN 978-1-4503-0661-4. Archivado (PDF) del original el 22-10-2020 . Consultado el 13-08-2023 .
- ↑ Mei, Hongyuan; Qin, Guanghui; Xu, Minjie; Eisner, Jason (2020). "Neural Datalog Through Time: Informed Temporal Modeling via Logical Specification". Proceedings of ICML 2020 . arXiv : 2006.16723 .
- ↑ Baral, Chitta (2003). Representación del conocimiento, razonamiento y resolución declarativa de problemas . Cambridge University Press. ISBN 978-0-521-81802-5.
- ↑ Gelfond, Michael (2008). «Answer sets» . En van Harmelen, Frank; Lifschitz, Vladimir; Porter, Bruce (eds.). Handbook of Knowledge Representation . Elsevier. pp. 285–316 . ISBN 978-0-08-055702-1.Como PDF archivado el 3 de marzo de 2016 en Wayback Machine.
Enlaces externos
- Frans Coenen. Características de los lenguajes de programación declarativos . 1999.
- Robert Harper .
- ¿Qué es, si es que existe, un lenguaje declarativo? 2013.
- " Existe un lenguaje declarativo, y es el mejor lenguaje específico de dominio del mundo ". 2013.
- Olof Torgersson. Una nota sobre los paradigmas de programación declarativa y el futuro de la programación definicional . 1996.
- Programación declarativa
- paradigmas de programación