programming languages examples programming-languages prolog logic-programming

programming languages - languages - ¿Por qué la programación lógica no se ha puesto de manifiesto?



programming languages definition (13)

Cuando aprendimos prólogo (solo un par de semanas en una clase de lenguajes de programación, por lo que apenas soy un experto), el profesor también señaló que, dependiendo de sus definiciones, la programación lógica podría no estar programada en absoluto.

Cuando decimos programación, generalmente nos referimos a algo 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". Prólogo, o programación lógica, realmente no hace eso. Es más como SQL. Tienes la oportunidad de hacerle a la computadora una serie de preguntas, bastante. Responderá, en la medida de lo posible, en función de los datos que ingresó anteriormente, pero a diferencia de otros paradigmas de programación, en realidad no le está diciendo a la computadora qué hacer.

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

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

A medida que pasa el tiempo, parece que cada vez más la programación funcional está afectando más a otros lenguajes de programación. Estamos comenzando con Prolog en mi clase de IA, y parece que hay algunas cosas que harían más fácil la programación en campos que no son de IA. Mi pregunta es la siguiente: ¿por qué la programación lógica no se ha desarrollado de la misma manera?

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

Actualización : Tal vez debería ser un poco más claro. Realmente no estoy preguntando por 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 listas de comprensión / mapa / filtro en Python. Estos están claramente influenciados por los lenguajes funcionales. ¿Por qué es que los lenguajes como Python no han captado este tipo de cosas de los lenguajes de programación lógica como los que tienen lenguajes funcionales?


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


El hecho de que comiences con Prolog en tu clase de IA debería ser una pista. AI tampoco se ha dado cuenta demasiado bien.

Recuerdo que en el ''80 desafié a un profesor a demostrar usos significativos para la IA (bueno, "burlarse" sería un término más preciso, pero era más joven entonces). No podía hacerlo entonces, y hoy, sospecho que está enseñando Aproximadamente la décima parte de las solicitudes de inteligencia artificial sobre las que estaba hablando en aquel entonces.

Tal vez lo mismo se aplica a Prolog. No recuerdo la última vez que vi a una compañía en busca de experiencia con Prolog. Tal vez nunca, o tal vez lo vi y lo ignoré.


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 verdaderos problemas con la idea de "no", que es bastante básico para el razonamiento lógico.

En la lógica normal, es perfectamente razonable probar una proposición refutando su negación, lo que se denomina "reductio ad absurdam" (a menos que la haya escrito incorrectamente). (Sí, hay personas que han intentado reconstruir las matemáticas sin usarlas, pero eso se está volviendo un poco esotérico). Esto simplemente no funciona en Prolog, ya que no hay distinción entre lo falso y lo comprobado.

Por lo tanto, cuando hice un proyecto de clase en Prolog, me metí en problemas cada vez que lo consideraba como lógica de programación. Siempre terminaba haciendo algo que requería una negación real. Quizás otras personas no lo hacen, pero terminé por pensar que era un lenguaje de ajuste de patrones, y luego tuve pocas dificultades para terminar el proyecto.

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

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


En este hilo de discusión hay llamadas para un lenguaje de programación lógico que sea verdaderamente declarativo (las declaraciones se pueden hacer en cualquier orden), y que se podría usar para consultar la base de datos como un reemplazo de SQL.

Datalog es lo que buscas. Se utiliza en integración de datos, aplicaciones de seguridad y análisis de programas, por ejemplo.


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


Este es el caso estándar de utilizar la herramienta adecuada para el trabajo. Usted ve la programación lógica en ciertas situaciones: generalmente se les llama algo así como sistemas basados ​​en reglas o expertos.

En su curso de teoría de la computabilidad , analizará el hecho de que todos estos lenguajes de propósito 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 completamente posible que, en un sistema basado en reglas, pueda elaborar su conjunto de reglas utilizando algo como Prolog (si le funciona bien) y luego implementar el sistema final en su plataforma de entrega (por ejemplo, Java).

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


La programación funcional se está volviendo más popular porque tiene algunos beneficios importantes cuando se aplica a la programación de múltiples subprocesos, y a medida que avanzamos cada vez más hacia los procesadores de múltiples núcleos, la programación de múltiples hilos será cada vez más importante.


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

Sin embargo, recomiendo aprenderlo, aunque solo sea para aprender a enfocar la programación de otra manera diferente. Ser capaz de ver un problema desde muchos puntos de vista diferentes absolutamente te hace un mejor programador.


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

El problema que pienso al intentar usar un lenguaje de programación lógico como un lenguaje de propósito general es que algunas tareas simplemente no encajan muy bien con el concepto. Creo que las funciones de programación lógica deben incorporarse a un lenguaje que también tenga construcciones imperativas y funcionales. Existe al menos uno de estos idiomas: Oz , pero todavía tengo que probarlo.

Edición: 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.


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

Tuvo mucho éxito, y por lo que sé, todavía se usa diariamente 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í.

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

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

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 con solo escribir muchas declaraciones if en un bucle.

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

Desde que DEC fue tragado por Compaq, que fue tragado por HP, RuleWorks se ha convertido en código abierto y se puede obtener de esta página web .

Es una pena que no haya más interés en tales técnicas porque pueden ser muy efectivas para resolver una variedad de problemas que de otra manera serían intratables.


Recientemente utilicé un montón de programación lógica en un proyecto de investigación de diseño de juegos de inteligencia artificial (¡ video de prueba !), Pero al menos la mitad de mi proyecto de lógica pesada era funcional o imperativo con el código Scala implementando un motor de juego básico. El punto de la programación , si puedo afirmar tal cosa, es hacer que la comprensión de la máquina de lo que quiere se sincronice con la suya , y la mayoría de la sincronización requiere dar los detalles imperativos , en algún nivel, de cómo quiere algo. hecho. Esas máquinas tontas son siempre tan literales ...

La programación lógica, ya sea tradicional, deductiva, estilo de prólogo, o la programación de lógica inductiva más exótica o los sabores de programación de conjuntos de respuestas, proporciona un apalancamiento masivo para algunos sabores de problemas al costo de poder comunicar fácilmente el conocimiento imperativo (que Siempre se necesita en algún lugar de las aplicaciones del mundo real). A veces, las preocupaciones de una aplicación interactiva hacen que los más pequeños impactos a su productividad al expresar un 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 utilizando expresiones regulares compatibles con perl que tengan la misma potencia de cálculo). En un lenguaje híbrido (o en uno que te permita integrar fácilmente un intérprete lógico) puedes tener lo mejor de ambos mundos (usé jTrolog para incrustar Prolog en mi motor Scala, formando una especie de voltrón de paradigma múltiple).

Creo que la programación lógica podría realmente ser más popular y bien entendida, pero, en cierto sentido, la programación de lógica pura no puede hacer mucho más que SQL o expresiones regulares en términos de "captura" porque su magia proviene de quitarte tu Expresividad imperativa (evitando que te pierdas 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. El mejor camino a seguir parece ser los idiomas híbridos que presentan esa elección de una manera consistente y bien diseñada.


Cuando aprende sobre programación lógica en las clases de Ciencias de la Computación usando Prolog, el punto principal no es hacer que usted sea un programador de Prolog competente, sino más bien abrir su mente a formas alternativas de técnicas de programación (estructuras de datos / algoritmos). No lo he 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 a Pascal ni una sola vez. Pero las habilidades que aprendí al elegir las estructuras de datos y algoritmos correctos que todavía utilizo 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íneas de código de Pascal actualmente en producción.

Cuando desarrolles software, te darás cuenta de que, aunque no estés escribiendo una sola línea de código Prolog, a veces estás reutilizando las técnicas que aprendiste por primera vez en estas clases inútiles o de próloga o IA que asististe. .

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

Si nos fijamos en la influencia que ha tenido la programación lógica en el campo de los sistemas expertos, la inteligencia artificial de los juegos de computadora, el control del tráfico aéreo y, probablemente, muchos otros campos (¿alguien tiene alguna sugerencia?), No creo que se pueda decir lógica. La programación no se ha puesto al día ...