2009-12-19 25 views
45

¿Qué tipo de problemas se resuelven mejor en Prolog que en Haskell? ¿Cuáles son las principales diferencias entre estos dos idiomas?Comparación Haskell vs. Prolog


Editar

¿Existe una biblioteca de Haskell (tipo de un solucionador lógico) que puede imitar la funcionalidad de Prolog?

+2

Esa pregunta adicional es buena por sí misma. Si hay alguna forma de transferir la respuesta de gknauth a una nueva pregunta, debe volver a formularla para que ambos tengan sus propias respuestas de alta calidad. –

+1

Eche un vistazo a la implementación KiCS2 del lenguaje Curry, un dialecto de Haskell que admite programación lógica desde cero. http://www-ps.informatik.uni-kiel.de/kics2/ & https://jeltsch.wordpress.com/2013/04/27/a-taste-of-curry/ –

Respuesta

27

Prolog es principalmente un lenguaje dirigido a problemas lógicos, especialmente de la IA y los campos lingüísticos. Haskell es más un lenguaje de propósito general.

Prolog es un lenguaje declarativo (lógico), lo que hace que sea más fácil indicar problemas lógicos en él. Haskell es un lenguaje funcional y, por lo tanto, se adapta mucho mejor a los problemas de cómputo.

Wikipedia sobre la programación declarativa:

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 control. Intenta minimizar o eliminar los efectos secundarios por , describiendo lo que el programa debería lograr , en lugar de describir cómo para lograrlo. Esto es en contraste con la programación imperativa , que requiere una descripción detallada del algoritmo ejecutada .

La programación declarativa consideran programas como teorías de un lógica formal, y cálculos como deducciones en ese espacio lógica. La programación declarativa se ha convertido recientemente en un interés particular en , ya que puede ser muy útil simplificar la escritura de programas paralelos.

Wikipedia sobre la programación funcional:

En informática, funcional programación es un paradigma de programación que trata cálculo como la evaluación de funciones matemáticas y evita datos de estado y mutables. Es enfatiza la aplicación de las funciones , en contraste con el estilo de programación imperativa , que enfatiza los cambios de estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en la década de 1930 a investigar la definición de función, la aplicación de función y la recursión. Muchos lenguajes de programación funcionales se pueden ver como adornos en el cálculo lambda .

En resumen un lenguaje declarativo declara un conjunto de reglas acerca de qué productos deben ser el resultado de que los insumos y utiliza esas reglas para deducir una salida de una entrada, mientras que un lenguaje funcional declara un conjunto de funciones matemáticas o lógicas que definen cómo la entrada se traduce a la salida.


En cuanto a la cuestión ha añadido: ninguno, que yo sepa, pero usted puede translate Haskell a Prolog, o implement Prolog en Haskell :)

+52

Esta respuesta es un poco engañosa. La programación lógica (Prolog) y la programación funcional (Haskell) son * ambos * lenguajes de programación declarativos, pero representan diferentes enfoques del paradigma declarativo. – nedned

+3

Haskell se puede traducir a Prolog si el sistema Prolog tiene soporte para objetivos suspendidos. Con objetivos suspendidos podemos modelar la evaluación perezosa. Pero la traducción será un programa borrado, ya que Prolog no tiene tipos. –

+3

Para los nuevos en Prolog, la respuesta anterior es de hecho una buena respuesta. Pero tenga en cuenta que el orden de las cláusulas en una meta de Prolog realmente importa mucho. Por lo tanto, la cita de Wikipedia "programación declarativa es un paradigma de programación que expresa la lógica de un cálculo sin describir su flujo de control" podría malinterpretarse para indicar que el orden de las cláusulas en un objetivo no importa, lo que sería incorrecto. El flujo de control de un programa Prolog se ve muy afectado por el orden de las cláusulas en un objetivo, incluida la secuencia en que los cortes "rojos" aparecen en las cláusulas. –

26

Prolog es un lógica de programación idioma, mientras que Haskell es un lenguaje funcional. Los lenguajes funcionales se basan en el concepto de una función que toma una cantidad de argumentos y calcula un valor.

Prolog, por otro lado, no tiene funciones. En cambio, predicados se usan para probar un "teorema". Los predicados de Prolog no calculan un valor, pueden responder "sí" o "no" y opcionalmente enlazar variables de entrada a valores:

La utilidad de la programación funcional y lógica a menudo se superponen. La programación funcional ha ganado bastante tracción últimamente, mientras que Prolog sigue siendo un lenguaje nicho, debido al hecho de que es mucho más diferente de los conceptos comunes de funciones y métodos de programación orientada a objetos que la programación funcional, y a menudo se considera (muy) difícil de aprender.

Ciertos problemas se vuelven casi triviales para implementar en Prolog, especialmente en combinación con constraint solvers.

Puede leer más acerca de la programación lógica en Wikipedia.

+1

Gracias por su valiosa respuesta. Es una pena que solo se pueda seleccionar una mejor respuesta. – danatel

+0

Definitivamente tenemos que aceptar que Prolog sea difícil de aprender. Lo usé en dos cursos: AI para crear un sistema experto, junto con la solución del problema de la jarra de agua. En los conceptos de lenguaje de programación, utilizamos Prolog para hacer problemas de números, estructuras de datos, por lo que fue estupendo ver las dos caras del lenguaje. En los lenguajes de programación, usamos un dialecto de Prolog llamado FP, que fue escrito por el instructor, en Prolog. Introdujo elementos funcionales en prolog, permitiendo coche, cdr, contras, cola/descanso, etc. También aprendimos a implementar nuestros propios motores de búsqueda de seguimiento en idiomas imperativos – Tanner

+0

@Tanner Es más difícil de aprender porque en mi experiencia la mayoría de los humanos no pensar naturalmente en árboles lógicos, sino en sistemas, que está más en línea con la programación OO. Por ejemplo, reconocer una silla como concepto es natural. No necesita definir cada silla individual para reconocerla como tal.En Prolog, resolver problemas lógicos basados ​​en árboles es muy fácil de implementar en comparación con OO, pero construir sistemas con entradas y salidas que cambian de estado o devuelven un resultado predecible son mucho más fáciles en los lenguajes basados ​​en OO. –

34

En cuanto a la pregunta de la biblioteca lógica: Si no existe, debería ser posible crear una de varias maneras. El esquema Razonado construye capacidades de razonamiento lógico en Scheme. Los capítulos 33-34 de PLAI discuten Prolog e implementan Prolog. Estos autores están creando puentes entre Scheme y Prolog. Los creadores de PLT Scheme han creado uno de sus idiomas como Lazy Scheme después de la función de evaluación diferida de Haskell. El documento LogicT de Oleg Kiselyov es genial, como de costumbre: empuja el límite de lo que es posible en muchos idiomas. También hay un logic programming example en Haskell Wiki.

+1

Gracias por su valiosa respuesta. Es una pena que solo se pueda seleccionar una mejor respuesta. – danatel

+1

'LogicT' parece ser el camino a seguir, con mucho gusto disfrutar de ese papel. – Profpatsch

-9

En realidad sólo hay 2 idiomas:

  1. Idioma de la máquina
  2. Lenguaje humano.

Todos los demás idiomas intermedios son meramente traductores y nada más. Cuando usamos el lenguaje de máquina, debemos pensar como la máquina y al usar lenguajes humanos, pensamos como humanos.

El verdadero trabajo de un programador es pensar de las dos maneras. Algunas herramientas de programación como el ensamblador obligan al programador a pasar mucho más tiempo pensando como la máquina.Otras herramientas como Prolog nos permiten dedicar más tiempo a pensar como humano.

Hay una multa que se paga en cada extremo, ya sea en rendimiento o en costo.

Si la lógica comercial de su aplicación se puede reducir a un conjunto de reglas y su resultado a un conjunto de objetivos (por ejemplo, escribir un juego de ajedrez), entonces Prolog es ideal. Por otro lado, si necesita tomar la entrada y decirle a la computadora cómo calcular la salida, entonces un lenguaje funcional sería más apropiado.

+5

Si ha usado mucho Prolog, sabe que pasa la mayor parte de su tiempo pensando como una máquina de restricción de resolución de retroceso en lugar de un ser humano. :) Los humanos no piensan como Prolog en absoluto, aunque tal vez más que como una máquina de Turing. –

+2

Tal vez debería dar marcha atrás dadas las limitaciones del hilo :) Tiene toda la razón sobre la máquina de Turing. He usado y sigo usando Prolog. De hecho, todavía tengo mi copia de Turbo Prolog en discos de doble densidad de doble cara de 5.1/4 pulgadas en perfectas condiciones. Tal vez debería llevarlo al tipo de cómic. –

+0

No me sorprende que haya obtenido -9 – PascalVKooten

10

Puede encontrar el documento Escape from Zurg: An Exercise in Logic Programming una lectura interesante. Muestra una comparación lado a lado de la implementación de un problema de búsqueda simple en Prolog y Haskell, junto con un pequeño marco de clase para representar los problemas de búsqueda en general. La conclusión a la que llegan los autores es que expresar al menos algunos de estos tipos de problemas en Haskell es más fácil que en Prolog, principalmente porque el sistema de tipo Haskell hace que resulte más fácil encontrar buenas representaciones de estados de búsqueda y movimientos de estado a estado. .

+2

Supongo que podríamos refutar el documento de muchas maneras: los tipos no son necesarios para una programación de orden superior (no veo ningún tipos en llamada/n), coincidencia de patrones Haskell y estructura El edificio podría ser lento en comparación con Prolog (no lo verificó todavía), el problema podría hacer uso de CLP (el <= 60) (I no veo que Haskell tenga nada que ofrecer aquí), etc. –

+5

El documento mencionado contiene programas Prolog claramente escritos por programadores no acostumbrados al lenguaje Prolog. Ejemplo: Fig. 1, 'trans/4':' append/3' se usa. Un programador de Prolog pondría la lista en la cabeza, convirtiéndola en una operación constante en lugar de lineal para cada respuesta. – false

+1

A [Prólogo nativo] (https://www.metalevel.at/zurg/). – false