2009-03-10 12 views
22

A medida que pasa el tiempo, parece que la programación funcional tiene cada vez más efecto en otros lenguajes de programación. Estamos empezando con Prolog en mi clase de IA, y parece que hay algunas cosas que facilitarían la programación en campos que no son de IA. Mi pregunta es esta: ¿por qué la programación lógica no se ha visto de la misma manera?¿Por qué no ha atrapado la programación lógica?

En este topic, parece que se llegó a un consenso general de que la programación lógica es útil, pero debe demostrarse como tal. ¿Hay alguna razón por la cual no se considera útil?

Actualización: Quizás debería ser un poco más claro. Realmente no estoy preguntando sobre Prolog. Puedo ver por qué no sería una buena idea elegir Prolog para la mayoría de las aplicaciones del mundo real.

Para dar un ejemplo de más de lo que estoy hablando, considere la lista de comprensiones/mapa/filtro en Python. Estos están claramente influenciados por los lenguajes funcionales. ¿Por qué los lenguajes como Python no se han familiarizado con este tipo de cosas desde los lenguajes de programación lógica como si tuvieran lenguajes funcionales?

+1

Si no estás hablando de Prolog, ¿de qué estás hablando? – user51568

+2

... Tal vez deberías leer el resto de las frases después de "No estoy preguntando sobre Prolog". –

+0

¿Qué lenguajes de programación lógica, ya que no estamos hablando de Prolog? Si son tan oscuros, esa puede ser la respuesta. Las personas han estado expuestas a la programación funcional durante décadas, con Lisp y Scheme. –

Respuesta

29

Cuando aprendes acerca de la programación lógica en clases de Informática usando Prolog, el punto principal no es convertirte en un experto programador de Prolog, sino en abrir tu mente a formas alternativas de programación técnicas (estructuras de datos/algoritmos) que no habría considerado antes.

Para ilustrar mi punto cuando comencé a estudiar Informática, mi escuela de ingeniería solía exigir a todos los estudiantes que escribieran sus programas de software en Pascal, pero desde que me gradué, nunca he usado Pascal ni una sola vez. Pero las habilidades que aprendí seleccionando las estructuras de datos correctas y los algoritmos que todavía uso todos los días.

Pascal no aparece en mi currículum como un idioma que conozco, pero ha sido fundamental en mi formación como ingeniero de software. Su utilidad no solo puede medirse por el número de línea de código Pascal actualmente en producción.

Cuando desarrolles el software, te darás cuenta de que, aunque no estás escribiendo una sola línea de código Prolog, estás a veces reutilizando técnicas que quizás aprendiste en este Prolog "inútil" o Clases de IA a las que asististe

La evaluación de la utilidad de una tecnología (lenguaje de programación específico, herramienta/aplicación de software específico) no es simplemente una cuestión de evaluar su nivel real de uso, sino su influencia.

Si observa la influencia que la programación lógica ha tenido en el campo de los sistemas expertos, los juegos de computadora AI, el control del tráfico aéreo y probablemente un buen número de otros campos (¿sugerencias a alguien?) No creo que pueda se dice que la programación lógica no ha tenido éxito ...

3

Desde mi propia experiencia con Prolog es muy agradable para tareas específicas, pero como lenguaje de programación de propósito general no es tan flexible como muchos otros lenguajes en mi opinión.

4

La programación funcional es cada vez más popular porque tiene algunos beneficios importantes cuando se aplica a la programación de subprocesos múltiples, y a medida que avanzamos cada vez más hacia procesadores multinúcleo, la programación multiplataforma será cada vez más importante.

+6

Los programas lógicos también se pueden paralelizar bastante bien. – TrayMan

2

Es un hecho que Prolog es muy agradable para tareas específicas, pero en mis 11 años de experiencia laboral nunca tuve un problema donde Prolog sería la mejor solución. Es solo una cuestión que el tipo de problemas donde Prolog sería ideal, es muy raro.

1

El hecho de que esté iniciando en Prolog en su clase AI debería ser una pista. AI tampoco ha captado demasiado bien.

Recuerdo en el '80 desafiar a un profesor para que demostrara usos significativos para la inteligencia artificial (bueno, "burlarse" sería un término más preciso, pero yo era más joven entonces). No podía hacerlo entonces, y hoy, Sospecho que está enseñando aproximadamente la décima parte de las aplicaciones para IA de las que tanto hablaba en aquel entonces.

Quizás lo mismo se aplique a Prolog. No recuerdo la última vez que vi a una compañía buscando experiencia en Prolog. Tal vez nunca, o tal vez lo vi e ignoré.

+2

AI es el estudio de cosas que realmente no podemos hacer todavía. Si podemos hacer algo y entenderlo, ya no es AI. Nunca ha habido, y nunca habrá, aplicaciones de IA generalizadas, por definición. Eso no lo hace inútil. –

+0

No dije inútil; Dije "sin usos significativos". Estoy seguro de que su uso puede ser significativo en un sentido académico; simplemente no en un sentido comercial. –

+0

El reconocimiento de patrones (por varios medios, incluidas las redes neuronales) y la lógica difusa tienen mucho uso significativo, si los acepta como AI. – TrayMan

3

Encontré Prolog ser absolutamente fascinante cuando lo tomé en mis clases de IA en la universidad, pero solo puedo pensar en un puñado de situaciones en las que lo usaría fuera de AI hoy. Y vísperas n en esas situaciones, prefiero no usarlo. Me tomó mucho tiempo finalmente "obtener" Prolog, y cuando lo hice, pensé que era genial, pero de inmediato vi que era un rango limitado de utilidad.

Aún así, recomiendo aprenderlo, aunque solo sea para aprender a enfocar la programación de otra manera. Ser capaz de ver un problema desde muchos puntos de vista diferentes te convierte en un mejor programador.

7

El primer problema que tuve con Prolog es que no es un lenguaje de programación lógico. Carece de la lógica estándar de tres valores de "verdadero", "falso" y "no sé", combinando los dos últimos. En otras palabras, los dos valores de verdad son en realidad "se pueden mostrar" y "no se pueden mostrar". Esto le da a Prolog problemas reales con la idea de "no", que es bastante básico para el razonamiento lógico.

En lógica normal, es perfectamente razonable probar una proposición refutando su negación, esto se llama "reductio ad absurdam" (a menos que lo haya escrito mal). (Sí, hay personas que han tratado de reconstruir las matemáticas sin usarlo, pero eso se está volviendo un tanto esotérico). Esto simplemente no funciona en Prolog, ya que no hay distinción entre que se probó ser falso y no se probó nada.

Por lo tanto, cuando hice un proyecto de clase en Prolog, me metí en problemas cada vez que pensaba en ello como lógica de programación. Siempre terminaba haciendo algo que requería una negación real. Tal vez otras personas no hacen eso, pero terminé pensando en él como un lenguaje de coincidencia de patrones, y luego tuve poca dificultad para terminar el proyecto.

No es posible tener un verdadero lenguaje basado en lógica donde el programador puede escribir cosas y realmente confiar en los resultados. El cálculo de predicados de primer orden (es decir, la lógica con variables, funciones de verdadero o falso, "y", "o", "no", "para todos" y "existe") es positivamente indecidible. (Hay razones por las que seguimos vertiendo café en matemáticos en lugar de generar todos los teoremas posibles mecánicamente, después de todo.) No hay forma de que un programador sepa a priori si una proposición determinada será probada o no, incluso si el programador ya sabe es verdadero o falso

Editar: También olvidé la necesidad crítica de ordenar correctamente las cláusulas. En lógica, no importa en qué orden anotes las cosas. En Prolog, seguí entrando en ciclos infinitos, hasta que dejé de tratarlo como un lenguaje basado en lógica. De nuevo, tiene algunas características agradables como un lenguaje de coincidencia de patrones, pero no es lógica, y me pareció como un pony de un solo idioma. YMMV, pero algunas otras personas parecen estar de acuerdo conmigo.

+0

Es 'reductio ad absurdum' y el Teorema de Incompletitud de Gödel que nos dice que la existencia de una (des) prueba de una fórmula es indecidible y está estrechamente relacionada con el problema de terminación, lo que sugiere por qué la demostración automática de teoremas puede funcionar bastante bien en la práctica . – TrayMan

+0

Prolog tiene la regla de corte por lo que no necesita reductio ad absurdum. ¿Lo estás usando? – rjh

+0

@rjh: El corte evita el retroceso. No es en ningún sentido una operación lógica. Permite tratar con la negación solo en algunos casos limitados y fácilmente conduce a errores al cambiar la semántica del programa de una manera no obvia. – TrayMan

9

Mi impresión de Prolog simple es que es un lenguaje de juguete. Eso no quiere decir que la programación lógica no puede ser útil. Por ejemplo, en Twelf es posible declarar la semántica para un lenguaje de programación simple con bastante facilidad y hacer que las declaraciones actúen como un intérprete. También he escuchado algunas cosas buenas sobre λProlog.

El problema Creo que al tratar de usar un lenguaje de programación lógica como lenguaje de propósito general es que algunas tareas simplemente no se ajustan muy bien al concepto. Creo que las características de programación lógica deben incorporarse a un lenguaje que también tenga construcciones imperativas y funcionales. Hay al menos uno de esos idiomas: Oz, pero aún no lo he probado.

Editar: Hay una idea que he querido probar durante algún tiempo: alimentar una base de datos relacional a Prolog como átomos y usarla para hacer consultas en lugar de SQL. Tengo la sensación de que sería una gran mejora con respecto a SQL.

+1

He estado pensando en la misma idea para SQL. Alguien tiene que comenzar un proyecto :) – Saintali

+2

En lo que respecta a la idea del lenguaje de base de datos (y también pensé en esto), hay una abstracción de lenguaje sobre bases de datos distribuidas en desarrollo que ha basado su lenguaje de consulta en el lenguaje lógico Datalog . No sé mucho al respecto, pero vale la pena mencionar dado el tema de esta respuesta. http://en.wikipedia.org/wiki/Datomic – josiah

2

Este es el caso estándar del uso de la herramienta adecuada para el trabajo. Verá programación lógica en ciertas situaciones: por lo general, se los denomina sistemas basados ​​en reglas o expertos.

En su computability theory course, discutirá el hecho de que todos estos lenguajes de uso general son efectivamente equivalentes (desde un punto de vista matemático). Sin embargo, la creación de prototipos y el desarrollo a largo plazo son dominios muy diferentes. Por lo tanto, es muy posible que, en un sistema basado en reglas, pueda calcular su conjunto de reglas usando algo como Prolog (si eso funciona bien para usted) y luego implementar el sistema final en su plataforma de entrega (por ejemplo, Java).

Por cierto, siempre me ha encantado la forma en que la respuesta de Prolog a casi todo es "no".

7

Cuando aprendimos prolog (solo un par de semanas en una clase de lenguajes de programación, así que no soy un experto), el profesor también señaló que dependiendo de sus definiciones, la programación lógica puede no ser programación en absoluto.

Cuando decimos programación, generalmente nos referimos a algo así como 'emitir una serie de tareas o instrucciones a la computadora'. Eso es lo que hacen los lenguajes de programación imperativos o funcionales. Eso es lo que hace cada lenguaje de programación "real". Prolog, o la programación lógica, realmente no hace eso. Es más como SQL. Tienes que hacerle muchas preguntas a la computadora. Te responderá, lo mejor que pueda, en función de los datos que le diste previamente, pero a diferencia de otros paradigmas de programación, no le estás diciendo realmente a la computadora qué hacer.

Es muy especializado, y no adecuado para la programación de propósito general. Y las cosas que se especializa para no son a menudo necesarios.

La programación funcional, por otro lado, es definitivamente una programación de propósito general, y se puede utilizar para cualquier cosa, sin mayores problemas. Por eso, este último se está poniendo al día y la programación lógica no. Creo que ... :)

+1

El tipo de programación que está llamando "real" generalmente se llama "programación imperativa". SQL y Prolog son ejemplos de "programación declarativa". http://en.wikipedia.org/wiki/Programación_declarativa – rmeador

+1

No, no estoy hablando específicamente de programación imperativa (también incluyo programación funcional). Simplemente estoy señalando que, dependiendo de cómo lo defina, los lenguajes declarativos pueden no ser programación en absoluto (hay muchos debates sobre si HTML o SQL son lenguajes de programación) – jalf

10

Pasé unos 4 años de mi carrera de programación trabajando en un "Sistema experto" basado en reglas para el aprovisionamiento y configuración de hardware para centrales telefónicas según los requisitos del cliente.

Tuve mucho éxito, y hasta donde sé, todavía está en uso diario más de 10 años después. Pero encontrar programadores que pudieran entender cómo funcionaba era una tarea mayor que desarrollar el sistema en sí mismo.

Creo que esta es la razón por la cual el enfoque no ha despegado, porque pocas personas tienen la mentalidad necesaria para la programación basada en lógica en comparación con el número de personas que pueden comprender los conceptos de programación procedimental y funcional.

Los lenguajes de programación lógica proporcionan un mecanismo para alimentar hechos y reglas de inferencia en un "motor de inferencia" que luego se pone en movimiento para aplicar las reglas a los hechos dados para producir nuevos hechos.Un lenguaje lógico particular se sostiene o cae en la fuerza de su particular motor de inferencia.

El motor de inferencia de Prolog tiene una implementación muy ingenua y es muy ineficiente. El mismo problema podría resolverse de manera más eficiente en la mayoría de los lenguajes de procedimiento simplemente escribiendo muchas declaraciones if en un ciclo.

El lenguaje que elegimos para nuestro "Configurador" fue RuleWorks de DEC, que es un refinamiento del lenguaje OPS5 más conocido. Esto tiene un motor de inferencia basado en el Rete Algorithm que lo hace mucho más eficiente que el enfoque de procedimiento.

Dado que DEC se tragó por Compaq que se tragó por HP, RuleWorks se convirtió en código abierto y se obtuvo from this web page.

Es una lástima que no haya más interés en tales técnicas porque pueden ser muy efectivas para resolver una variedad de problemas por lo demás insolubles.

8

Recientemente utilicé una pila de programación lógica en un proyecto de investigación de diseño de IA (teaser video!), Pero al menos la mitad de mi proyecto de lógica pesada era código Scala funcional o imperativo que implementaba un motor de juego básico. El punto de programación, si se me permite afirmar tal cosa, es llevar a la comprensión de la máquina de lo que quiere en sincronía con su propia - y la mayoría de la sincronización es requiere dando los imperativas detalles, por lo algún nivel, de cómo quieres que se haga algo. Esas tontas máquinas son siempre tan literales ...

La programación lógica, ya sea el estilo tradicional, deductivo, de estilo prólogo o la programación lógica inductiva más exótica o los sabores de programación del juego de respuestas, proporciona un apalancamiento masivo para algunos sabores de problemas a costa de poder comunicar fácilmente el conocimiento imperativo (que siempre es necesario en algún lugar en aplicaciones del mundo real). A veces, las inquietudes de una aplicación interactiva hacen que incluso los golpes más pequeños a su productividad al expresar el conocimiento imperativo sean inaceptables. Escribir un motor de juego completo en un estilo de programación lógica siempre será una mala idea (al igual que intentarlo usando expresiones regulares compatibles con Perl que tengan la misma potencia de cálculo). En un lenguaje híbrido (o en uno que le permite incrustar fácilmente un intérprete lógico) puede obtener lo mejor de ambos mundos (utilicé jTrolog para incrustar Prolog en mi motor Scala, formando un voltron de paradigma múltiple).

Creo que la programación lógica podría ser más popular y bien entendida, pero, en cierto sentido, la programación de lógica pura no puede hacer mucho mejor que SQL o expresiones en términos de "atrapar" porque su magia viene de quitarle su expresividad imperativa (evitando que se pierda en detalles sin importancia, idealmente). Esta explicación se aplica casi por igual a la programación funcional. Me encanta la programación lógica, pero solo porque puedo elegir cuándo usarla. La mejor manera de avanzar parece ser los lenguajes híbridos que presentan esa elección de una manera consistente y bien diseñada.

2

Hay llamadas en este hilo de discusión para un lenguaje de programación lógica que es verdaderamente declarativo (las declaraciones se pueden hacer en cualquier orden) y que podría utilizarse para consultar la base de datos como un reemplazo de SQL.

Datalog es lo que estás buscando. Se usa en integración de datos, aplicaciones de seguridad y análisis de programas, por ejemplo.

Cuestiones relacionadas