2009-08-06 5 views
21

¿Hay algún lenguaje de programación diseñado para definir la solución a un problema determinado en lugar de definir instrucciones para resolverlo? Entonces, uno definiría cómo debería ser la solución o el resultado final y el intérprete de idiomas determinaría cómo llegar a ese resultado. Mirando el list of programming languages, no estoy seguro de cómo comenzar a investigar esto.Lenguajes de programación que definen el problema en lugar de la solución?

Los mejores ejemplos en los que actualmente puedo pensar para ayudar a ilustrar lo que estoy tratando de hacer son SQL y MapReduce, aunque ambos son mini-idiomas diseñados para recuperar datos. Pero, al escribir sentencias de SQL o MapReduce, está definiendo el resultado final, y el DB decide el mejor curso de acción para llegar al conjunto de resultados finales.

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

+0

Me encanta la pregunta, ¡ojalá tuviera una respuesta! –

+0

Suena como otra idea para cambiar el problema para mí, al igual que un lenguaje de especificación :) Si creas algo como esto, pierdes mucho poder (SQL y MapReduce son altamente especializados e inútiles para cosas de propósito general) o simplemente creas algo tan complejo como lo que estás tratando de reemplazar. – workmad3

+0

@ workmad3: Totalmente de acuerdo en que estos tipos de idiomas serían especializados o demasiado ridículos e innecesariamente complicados para el uso práctico. Aún así, parece que habrá nichos para esos idiomas, y no sabremos si son viables hasta que lo intentemos, ¿verdad? –

Respuesta

30

¿Qué hay de Declarative Programming? Extracto del artículo de Wikipedia (énfasis añadido):

En informática, declarativa programación es un paradigma de programación que expresa la lógica de un cálculo sin describir su flujo de control . Muchos lenguajes que apliquen el presente intento estilo a minimizar o eliminar los efectos secundarios por describiendo lo que el programa debe lograr, en lugar de describir la forma en a ir sobre el cumplimiento que.Este está en contraste con la programación imperativa , que requiere un algoritmo proporcionado explícitamente .

+0

Ah, ese es el término que necesito jaja. Odio cuando ni siquiera conoces el término para buscar/preguntar. Además, "la programación declarativa se ha convertido en un tema de particular interés recientemente, ya que puede simplificar en gran medida la redacción de programas paralelos": parece que no estoy solo. –

+0

+1 - Exactamente lo que iba a sugerir – Draemon

14

Lo más cercano que puede llegar a algo así es con un lenguaje lógico como Prolog. En estos idiomas modela la lógica del problema, pero nuevamente no es mágico.

+1

Sí, es difícil imaginar cómo sería esto/podría ser prácticamente, debido al factor mágico. ¿Cuánta magia es demasiado? Prolog parece un gran ejemplo, sin embargo. –

+0

Este es exactamente el ejemplo en el que pensé cuando leí la pregunta. Después de usar Prolog por un tiempo, también se da cuenta de por qué este paradigma se emula con poca frecuencia. – Beska

12

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

Según mi experiencia, Prolog es ideal para resolver problemas de satisfacción de restricciones (donde hay un conjunto de condiciones que deben cumplirse) - define su conjunto de entrada, define las restricciones (por ejemplo, un orden que debe imponerse) en las entradas previamente desordenadas) - pero los casos patológicos son posibles, y algunas veces el proceso de deducción lógica toma mucho tiempo en completarse.

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

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

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

+1

Prolog es muy paralelo. El orden de evaluación de las cláusulas puede ocurrir en cualquier orden, e incluso al mismo tiempo. –

+0

Impresionante. Solo lo he usado en máquinas de un solo procesador, e incluso eso no mucho. Gracias por el punto de datos! –

3

Déjame intentar responder ... puede ser Prolog podría responder a tus necesidades.

4

Estos idiomas se conocen comúnmente como 5th generation programming languages. Hay algunos ejemplos en la entrada de Wikipedia a la que me he vinculado.

+0

¿Qué tan común es "comúnmente" cuando nunca he oído hablar de los lenguajes de programación categorizados en este significado de "generación"? – erjiang

0

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

2

diría Objetivo Caml (OCaml) también ...

0

Una gran cantidad de idiomas a definir más problemas que soluciones (no tome esto uno de gravedad).

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

0

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

No recuerdo si era teórico o si ya se había hecho.

+0

Si puede encontrarlo, sería increíblemente interesante leerlo. –

+0

Asomándome, creo que me pueden haber colgado antes de esa conferencia. No puedo encontrar ninguna referencia al uso de ADN real para hacer el cálculo. – quillbreaker

+0

Busque "informática biológica" o "biocomputadoras". http://news.nationalgeographic.com/news/2003/02/0224_030224_DNAcomputer.html http://en.wikipedia.org/wiki/Biocomputers – outis

1

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

Parece inmensamente difícil modelar sistemas dinámicos abiertos 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 enormes problemas de P = NP al acecho en la oscuridad que dificultarían la construcción de un sistema de este tipo.

Aunque lo que sería interesante es si existiera un marco formal que podría aprovechar los aportes humanos para "reducir los números" y proporcionar una solución, tal vez la generación de código imperativa. Los motores de búsqueda de internet y de Google son una especie de herramienta pero muy primitivos.

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

0

LINQ también podría considerarse otra DSL declarativa (como el argumento de que es muy similar a SQL). Una vez más, declaras cómo es tu solución y LINQ decide cómo encontrarla.

La belleza de este tipo de idiomas es que proyectos como PLINQ (que acabo de encontrar) pueden surgir a su alrededor. Check out this video with the PLINQ developers (enlace directo WMV) sobre cómo paralelizan el descubrimiento de la solución sin modificar el lenguaje LINQ (mucho).

1

Lisp. Hay tantos sistemas Lisp definidos en términos de reglas, no de comandos imperativos. Google ahoy ...

0

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

Cuestiones relacionadas