wolfram programacion lenguaje language golang language-design

language design - programacion - ¿Lenguajes de programación que definen el problema en lugar de la solución?



rust language (13)

¿Qué pasa con la programación declarativa ? Extracto del artículo de wikipedia (énfasis añadido):

En informática, la programación declarativa es un paradigma de programación que expresa la lógica de una computación sin describir su flujo de control . Muchos idiomas que aplican este estilo intentan minimizar o eliminar los efectos secundarios al describir lo que el programa debe lograr, en lugar de describir cómo hacerlo . Esto contrasta con la programación imperativa, que requiere un algoritmo proporcionado explícitamente.

¿Hay algún lenguaje de programación diseñado para definir la solución a un problema dado en lugar de definir instrucciones para resolverlo? Por lo tanto, uno definiría cómo debería verse la solución o el resultado final y el intérprete del idioma determinaría cómo llegar a ese resultado. Mirando la lista de lenguajes de programación , no estoy seguro de cómo comenzar a investigar esto.

Los mejores ejemplos que se me ocurren actualmente para ayudar a ilustrar lo que estoy tratando de preguntar son SQL y MapReduce, aunque ambos son una especie de mini idiomas diseñados para recuperar datos. Pero, al escribir sentencias de SQL o MapReduce, está definiendo el resultado final y la base de datos decide el mejor curso de acción para llegar al conjunto de resultados finales.

Pude ver estos tipos de idiomas, si existen, que se utilizan para procesar muchos datos o para encontrar soluciones a un conjunto de ecuaciones. El lenguaje de los sueños sería uno que pudiera interpretar el problema definido, identificar qué partes se pueden paralelizar y ejecutar la solución en múltiples procesos / núcleos / cajas.


Ceceo. Hay tantos sistemas Lisp por ahí definidos en términos de reglas y comandos imperativos. Google ahoy ...


Déjame intentar responder ... puede ser que Prolog pueda responder a tus necesidades.


Esto puede parecer frívolo, pero en cierto sentido es lo que es . Usted declara un problema y / o un resultado deseado y la comunidad proporciona la solución, generalmente en código.

Parece inmensamente difícil modelar sistemas abiertos dinámicos hasta un número finito de soluciones. Creo que hay una razón por la cual la mayoría de los lenguajes de programación son imperativos. Sin mencionar que hay problemas masivos de P = NP que acechan en la oscuridad que harían que un sistema así sea difícil de diseñar.

Aunque lo que sería interesante sería si existiera un marco formal que pudiera aprovechar el aporte humano para "crujir los números" y proporcionar una solución, tal vez la generación imperativa de código. Los motores de búsqueda de internet y google son una especie de herramienta, pero muy primitivos.

Los problemas grandes y el software son básicamente una colección de problemas más pequeños resueltos en código. Por lo tanto, cualquier sistema que genere código requeriría conjuntos de problemas bastante delimitados que se pueden asignar a soluciones más o menos atómicas.


Esto suena como una descripción de un lenguaje declarativo (específicamente un lenguaje de programación lógico), cuyo ejemplo más conocido es Prolog. Sin embargo, no tengo idea de si Prolog es paralelizable.

En mi experiencia, Prolog es excelente para resolver problemas de satisfacción de restricciones (en los que hay un conjunto de condiciones que deben cumplirse): usted define su conjunto de entrada, define las restricciones (por ejemplo, un orden que debe imponerse en el orden no ordenado anteriormente). entradas) - pero los casos patológicos son posibles y, a veces, el proceso de deducción lógica tarda mucho tiempo en completarse.

Si puede definir su problema en términos de una fórmula booleana, podría lanzarle un solucionador SAT, pero tenga en cuenta que el problema 3SAT (asignación de variable booleana en cláusulas de tres variables) es NP-completo, y su lógica de primer orden es grande hermano, el problema de la fórmula booleana cuantificada (que usa el cuantificador existencial y el cuantificador universal), es PSPACE completo.

Hay algunos probadores de teoremas muy buenos escritos en OCaml y otros idiomas de FP; here hay un montón de ellos.

Y, por supuesto, siempre hay programación lineal a través del método simplex.



Hay varios motores de reglas basados ​​en Java que permiten la programación declarativa. Drools es uno con el que he jugado y parece bastante interesante.


LINQ también podría considerarse otro DSL declarativo (retomando el argumento de que es demasiado similar a SQL). De nuevo, declara cómo se ve su solución y LINQ decide cómo encontrarla.

La belleza de este tipo de idiomas es que los proyectos como PLINQ (que acabo de encontrar) pueden surgir a su alrededor. Vea este video con los desarrolladores de PLINQ (enlace directo de WMV) sobre cómo paralelizan la búsqueda de soluciones sin modificar el lenguaje LINQ (mucho).


Lo más cercano que puedes llegar a algo como esto es con un lenguaje lógico como Prolog. En estos idiomas, modelas la lógica del problema, pero de nuevo no es magia.


Muchos idiomas definen más problemas que soluciones (no tome esto en serio).

En una nota seria: un voto más para Prolog y diferentes tipos de DSL diseñados para ser declarativos.


Recuerdo haber leído algo sobre computación usando el ADN cuando estaba en la universidad. Debería colocar segmentos de ADN en una solución que representara segmentos del problema y definirlos de tal manera que si el ADN encaja, es una solución válida. Luego deja que las propiedades de los productos químicos le resuelvan el problema y busque hilos terminados que representen una solución. Suena algo así como a lo que te refieres.

Sin embargo, no recuerdo si era teórico o se había hecho, sin embargo.


Si bien las pruebas matemáticas no constituyen un lenguaje de programación, sí forman un lenguaje formal en el que simplemente define soluciones (siempre que permita pruebas no constructivas). Por supuesto, no es algorítmico, por lo que "matemáticas" podría no ser una respuesta aceptable.


Yo diría que Objective Caml (OCaml) también ...