stringtranslate.com

Programación declarativa

En informática , la programación declarativa es un paradigma de programación —un estilo de construir la estructura y los elementos de los programas de computadora— que expresa la lógica de un cálculo sin describir su flujo de control . [1]

Muchos lenguajes que aplican este estilo intentan minimizar o eliminar los efectos secundarios describiendo lo que el programa debe lograr en términos del dominio del problema , en lugar de describir cómo lograrlo como una secuencia de las primitivas del lenguaje de programación [2] (el cómo se deja). hasta la implementación del lenguaje ). Esto contrasta con la programación imperativa , que implementa algoritmos en pasos explícitos. [3]

La programación declarativa a menudo considera los programas como teorías de una lógica formal y los cálculos como deducciones en ese espacio lógico. La programación declarativa puede simplificar enormemente la escritura de programas paralelos . [4]

Los lenguajes declarativos comunes incluyen los de lenguajes de consulta de bases de datos (por ejemplo, SQL , XQuery ), expresiones regulares , programación lógica (por ejemplo , Prolog , Datalog , programación de conjuntos de respuestas ), programación funcional y sistemas de gestión de configuración .

El término se utiliza a menudo en contraste con la programación imperativa, que dicta explícitamente los pasos de transformación de su estado. [5]

Definición

La programación declarativa a menudo se define como cualquier estilo de programación que no es imperativo. Varias otras definiciones comunes intentan definirlo simplemente contrastándolo con la programación imperativa. Por ejemplo:

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 realizarse. Los lenguajes de programación funcional y lógica se caracterizan por un estilo de programación declarativa. En programación lógica, los programas constan de oraciones expresadas en forma lógica, y la computación utiliza esas oraciones para resolver problemas, que también se expresan en forma lógica.

En un lenguaje funcional puro , como Haskell , todas las funciones no tienen efectos secundarios y los cambios de estado solo se representan como funciones que transforman el estado, que se representa explícitamente como un objeto de primera clase en el programa. Aunque los lenguajes funcionales puros no son imperativos, a menudo brindan 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 funcional y procedimental.

Algunos lenguajes de programación lógica, como Prolog , y lenguajes de consulta de bases de datos, como SQL, aunque en principio son declarativos, también admiten un estilo de programación procedimental.

Subparadigmas

La programación declarativa es un término general que incluye una serie de paradigmas de programación más conocidos .

Programación de restricciones

La programación de restricciones establece relaciones entre variables en forma de restricciones que especifican las propiedades de la solución objetivo. El conjunto de restricciones se resuelve dando un valor a cada variable para que la solución sea consistente con el número máximo de restricciones. La programación de restricciones a menudo complementa otros paradigmas: programación funcional, lógica o incluso imperativa.

Idiomas específicos del dominio

Ejemplos bien conocidos de lenguajes declarativos específicos de dominio (DSL) incluyen el lenguaje de entrada del generador del analizador yacc , QML , el lenguaje de especificación de compilación Make , el lenguaje de gestión de configuración de Puppet , expresiones regulares , registro de datos , programación de conjuntos de respuestas y un subconjunto de SQL ( consultas SELECT, por ejemplo). Los DSL tienen la ventaja de ser útiles sin necesidad de ser necesariamente completos en Turing , lo que facilita que un lenguaje sea puramente declarativo.

Muchos lenguajes de marcado, como HTML , MXML , XAML , XSLT u otros lenguajes de marcado de interfaz de usuario, suelen ser declarativos. HTML, por ejemplo, solo describe lo que debe aparecer en una página web; no especifica ni el flujo de control para representar una página ni las posibles interacciones de la página con un usuario .

A partir de 2013 , algunos sistemas de software [ ¿cuáles? ] combinan lenguajes de marcado de interfaz de usuario tradicionales (como HTML) con marcado declarativo que define qué (pero no cómo) deben hacer los sistemas del servidor back-end para admitir la interfaz declarada. Dichos sistemas, que normalmente utilizan un espacio de nombres XML específico de un dominio , pueden incluir abstracciones de la sintaxis de la base de datos SQL o llamadas parametrizadas a servicios web mediante transferencia de estado representacional (REST) ​​y SOAP . [ cita necesaria ]

Programación funcional

Los lenguajes de programación funcionales como Haskell , Scheme y ML evalúan expresiones mediante una aplicación de funciones. A diferencia del paradigma relacionado pero más imperativo de la programación procedimental , la programación funcional pone poco énfasis en la secuenciación explícita. En cambio, los cálculos se caracterizan por varios tipos de aplicación y composición de funciones recursivas de orden superior y, como tales, pueden considerarse simplemente como un conjunto de asignaciones entre dominios y codominios . Muchos lenguajes funcionales, incluidos la mayoría de los de las familias ML y Lisp, no son puramente funcionales y, por lo tanto, permiten la introducción de efectos con estado en los programas.

Lenguajes híbridos

Los Makefiles, por ejemplo, especifican las dependencias de forma declarativa, [7] 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 generalmente es imperativo (como C ).

Programación lógica

Los lenguajes de programación lógica , como Prolog , Datalog y 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 las metas a submetas, de arriba hacia abajo usando razonamiento hacia atrás , mientras que la mayoría de los sistemas Datalog calculan de abajo hacia arriba usando razonamiento directo . 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 que sea declarativo. El 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, una computadora puede realizar manipulaciones algebraicas para formular mejor el algoritmo de solución. La causalidad matemática suele imponerse en los límites del sistema físico, mientras que la descripción conductual del sistema en sí es declarativa o acausal. Los lenguajes y entornos de modelado declarativos incluyen Analytica , Modelica y Simile. [8]

Ejemplos

Ceceo

Lisp es una familia de lenguajes de programación inspirados libremente en la notación matemática y el cálculo lambda de Alonzo Church . Si bien algunos dialectos, como Common Lisp , son principalmente imperativos, estos ceceos admiten la programación funcional y otros ceceos, como Scheme , están diseñados para la programación funcional.

En esquema, se puede definir la función factorial como tal:

( define ( factorial n ) ( si ( = n 0 ) 1 ;;; 0! = 1 ( * n ( factorial ( - n 1 ))))) ;;; ¡norte! = norte*(n-1)!                

Esto puede interpretarse como una definición de la función factorial utilizando su definición matemática recursiva, en lugar de simplemente definir un procedimiento, como se haría normalmente en un lenguaje imperativo.

En lisps, como en el cálculo lambda, las funciones son generalmente ciudadanas de primera clase . En términos generales, esto significa que las funciones pueden devolver funciones y usarse como parámetros para otras funciones.

Esto puede simplificar enormemente la definición de ciertas funciones.

Por ejemplo, si uno quiere crear una función que devuelva los primeros n cuadrados en Racket , simplemente puede escribir lo siguiente:

( definir ( primeros n-cuadrados n ) ( map ( lambda ( x ) ( * x x ) ;;; Una función que asigna x -> x^2 ( rango n ))) ;;; Lista de los primeros n enteros no negativos            

El mapa anterior toma una función y una lista, aplicando la función a cada miembro de la lista.

ml

ML (1973) [9] significa "Metalenguaje". ML se escribe estáticamente y se pueden anotar argumentos de función y tipos de retorno. [10]

 tiempos divertidos_10 ( n  :  int )  :  int  =  10  *  n ;

ML no se centra tanto en corchetes como Lisp y, en cambio, utiliza una variedad más amplia de sintaxis para codificar la relación entre los elementos del código, en lugar de recurrir al ordenamiento y anidamiento de listas para expresar todo. La siguiente es una aplicación de times_10:

veces_10 2

Devuelve "20:int", es decir, 20un valor de tipo int.

Al igual que Lisp , ML está diseñado para procesar listas, aunque todos los elementos de una lista deben ser del mismo tipo. [11]


Prólogo

Prolog (1972) significa "PROgramación en LOGic". Fue desarrollado para responder preguntas en lenguaje natural , [12] utilizando resolución SL [13] tanto para deducir respuestas a consultas como para analizar y generar oraciones en lenguaje natural.

Los componentes básicos de un programa Prolog son hechos y reglas . Aquí hay un ejemplo simple:

gato ( tom ).  % tom es un ratón gato ( 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 come ( X , Y )  : -  grande ( X ),  pequeño ( Y ).  % cada ser grande se come a cada ser pequeño

Dado este programa, la consulta tiene éxito y falla. Además, la consulta tiene éxito con la sustitución de la 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 las metas a submetas. En este ejemplo, se utiliza la última regla del programa para reducir el objetivo de responder la consulta a los subobjetivos de encontrar primero una X tal que se cumpla y luego mostrar que se cumple. Utiliza repetidamente reglas para reducir aún más los subobjetivos a otros subobjetivos, hasta que finalmente logra unificar todos los subobjetivos con hechos en el programa. Esta estrategia de razonamiento hacia atrás y reducción de objetivos trata las reglas de los programas lógicos como procedimientos y convierte a Prolog en un lenguaje de programación tanto declarativo como procedimental . [14]eat(X,jerry)big(X)small(jerry)

La amplia gama de aplicaciones Prolog se destaca en el Libro Año de Prolog, [15] que celebra el 50 aniversario de Prolog.

Registro de datos

Los orígenes de Datalog se remontan al comienzo de la programación lógica, pero se identificó como un área separada alrededor de 1977. Sintáctica y semánticamente , es un subconjunto de Prolog. Pero como no tiene 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 puedan derivarse, o cuando los hechos derivados se unifican con la consulta. En el ejemplo anterior, un sistema de registro de datos típico derivaría primero los nuevos hechos:

animal ( gato ). animal ( jersey ). grande ( tom ). pequeño ( jersey ).

Utilizando estos hechos, derivaría entonces el hecho adicional:

come ( tom ,  jerry ).

Entonces terminaría, porque no se pueden derivar hechos nuevos y adicionales y porque el hecho recién derivado se unifica con la consulta.

come ( X ,  jerry ).

Datalog se ha aplicado a problemas tales como integración de datos , extracción de información , redes , seguridad , computación en la nube y aprendizaje automático . [16] [17]

Programación del conjunto de respuestas

La programación de conjuntos de respuestas (ASP) evolucionó a finales de la década de 1990, basándose en la semántica del modelo estable (conjunto de respuestas) de la programación lógica. Al igual que Datalog, es un subconjunto de Prolog; y, como no tiene términos compuestos, no es Turing completo.

La mayoría de las implementaciones de ASP ejecutan un programa primero "conectándolo a tierra", reemplazando todas las variables en las reglas por constantes en todas las formas posibles y luego usando un solucionador SAT proposicional, como el algoritmo DPLL , para generar uno o más modelos del programa.

Sus aplicaciones están orientadas a la resolución de problemas difíciles de búsqueda y representación del conocimiento . [18] [19]

Ver también

Referencias

  1. ^ Lloyd, JW, Ventajas prácticas de la programación declarativa
  2. ^ "lenguaje declarativo". FOLDOC . 17 de mayo de 2004 . Consultado el 7 de septiembre de 2023 .
  3. ^ Sebesta, Robert (2016). Conceptos de lenguajes de programación . Boston: Pearson. ISBN 978-0-13-394302-3. OCLC  896687896.
  4. ^ "DAMP 2009: Taller sobre aspectos declarativos de la programación multinúcleo". Cse.unsw.edu.au. 20 de enero de 2009. Archivado desde el original el 13 de septiembre de 2013 . Consultado el 15 de agosto de 2013 .
  5. ^ "Programación imperativa: descripción general del paradigma de programación más antiguo". Guía digital de IONOS . 2021-05-21 . Consultado el 23 de mayo de 2023 .
  6. ^ Chakravarty, Manuel MT (14 de febrero de 1997). Sobre la ejecución masiva paralela de programas declarativos (Tesis doctoral). Universidad Técnica de Berlín . Consultado 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 en la teoría de prueba (o en ambos). de la lógica.
  7. ^ "Una descripción general de dsls". Archivado desde el original el 23 de octubre de 2007.
  8. ^ "Modelado declarativo". Simulistas . Consultado el 15 de agosto de 2013 .
  9. ^ Gordon, Michael JC (1996). «De LCF a HOL: una breve historia» . Consultado el 30 de octubre de 2021 .
  10. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 233.ISBN _ 0-201-71012-9.
  11. ^ Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. pag. 235.ISBN _ 0-201-71012-9.
  12. ^ "Nacimiento de Prólogo" (PDF) . Noviembre de 1992.
  13. ^ Robert Kowalski; Donald Kuehner (Winter 1971). "Linear Resolution with Selection Function" (PDF). Artificial Intelligence. 2 (3–4): 227–260. doi:10.1016/0004-3702(71)90012-9. ISSN 0004-3702.
  14. ^ Robert Kowalski Predicate Logic as a Programming Language Memo 70, Department of Artificial Intelligence, University of Edinburgh. 1973. Also in Proceedings IFIP Congress, Stockholm, North Holland Publishing Co., 1974, pp. 569-574.
  15. ^ Warren, D.S. (2023). "Introduction to Prolog". In Warren, D.S.; Dahl, V.; Eiter, T.; Hermenegildo, M.V.; Kowalski, R.; Rossi, F. (eds.). Prolog: The Next 50 Years. Lecture Notes in Computer Science(). Vol. 13900. Springer, Cham. pp. 3–19. doi:10.1007/978-3-031-35254-6_1. ISBN 978-3-031-35253-9.
  16. ^ Huang, Shan Shan; Green, Todd J.; Loo, Boon Thau (June 12–16, 2011). Datalog and Emerging applications (PDF). SIGMOD 2011. Athens, Greece: Association for Computing Machinery. ISBN 978-1-4503-0661-4.
  17. ^ 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.
  18. ^ Baral, Chitta (2003). Knowledge Representation, Reasoning and Declarative Problem Solving. Cambridge University Press. ISBN 978-0-521-81802-5.
  19. ^ Gelfond, Michael (2008). "Answer sets". In van Harmelen, Frank; Lifschitz, Vladimir; Porter, Bruce (eds.). Handbook of Knowledge Representation. Elsevier. pp. 285–316. ISBN 978-0-08-055702-1. as PDF Archived 2016-03-03 at the Wayback Machine

External links