¿Qué es programación lógica?
En la actualidad, el paradigma de programación más extendido entre los programadores, es la programación orientada a objetos, en cualquiera de los lenguajes disponibles. Otro paradigma ya ampliamente usado, pero que cada día capta más usuarios, es la programación funcional.
Sin embargo, existen otras estructuras de programación, quizás menos conocidas, pero que tienen una gran base de usuarios y un extenso abanico de aplicaciones. Uno de estos paradigmas es la programación lógica.
¿Que vas a encontrar aquí? Historia de la programación lógica. Campos de aplicación de la programación lógica. Historia de la programación lógica y mucho más!
Qué es la programación lógica?
En pocas palabras, la programación lógica es un tipo de programación. En ella el programador debe programar a la computadora para tomar sus propias decisiones basándose en la lógica matemática.
Aquí encontrarás un super post sobre el significado de programar y mucho más!
Como sabes, el software se compone de código, el cual le ordena a la computadora los pasos a seguir. Pero puede pasar que en un punto, la computadora se encuentre ante la necesidad de tomar una decisión sobre qué camino tomar.
Obviamente, la computadora, si no posee registros que le indiquen que hacer, no hará nada. Es decir que no podrá culminar con la tarea encomendada.
Es aquí en donde la programación lógica entra en el juego. Este paradigma de programación está diseñado para que la computadora tome su propia decisión basándose en la lógica.
Por supuesto que para que la programación lógica cumpla con su función, es necesario que el programador escriba un código libre de ambigüedades, es decir que las sentencias que escriba sean verdaderas y tengan sentido. Esto significa en pocas palabras que sean lógicas.
Esto significa que el programador debe asegurarse que sus enunciados sean correctos. Para ello es necesario el uso de una herramienta llamada demostrador de teoremas, del cual hablaremos más abajo.
¿Para qué sirve esto? Esto te asegurará que el software que estás escribiendo sea capaz de leer los enunciados claramente, con lo cual podrá tomar las decisiones más eficientes.
Qué es un demostrador de teoremas?
Para que la programación lógica tenga coherencia, se requiere de una herramienta de software llamada demostrador de teoremas. Es también conocido como “Demostrador automático de teoremas” o en inglés ATP “Automated theorem proving”.
Esta herramienta no es otra cosa que un software diseñado para resolver enunciados matemáticos, más conocidos como teoremas.
Explicado en forma sencilla, los teoremas son declaraciones capaces de mostrarse verdaderas basándose en declaraciones anteriores. En el campo de la programación lógica, el demostrador de teoremas debe funcionar en conjunto con los enunciados escritos por el desarrollador, con los cual se llegará a la conclusión debida.
Un ejemplo básico de ello es este. Si el código escrito por el programador dice que A es igual a B y B es igual a C, entonces el demostrador de teoremas tomará la decisión de que A debe ser igual a C.
Obviamente, este procesamiento es muy diferente a que el programador indique fehacientemente que A es igual a C. El software debe obtener esta conclusión a través de la combinación de las declaraciones escritas del programador y el probador de teoremas.
El demostrador automático de teoremas es en la actualidad el subcampo con más desarrollo del razonamiento automático. En este sentido, la combinación de declaraciones del programador y demostrador de teoremas abre puertas que son muy interesantes en la programación, en campos como la inteligencia artificial y otros.
Software demostrador de teoremas
- ACL2
- Acumen RuleManager
- Alligator
- Automath
- CARINE
- Coq
- CVC
- DATEM
- E
- EQP
- Gandalf
- Gödel-machines
- HOL
- HOL Light
- Isabelle
- Jape
- KeY
- KIV
- LCF
- LoTREC
- Matita
- MetaPRL
- Mizar
- NuPRL
- Otter
- Paradox
- PhoX
- ProofPower
- Prover Plug-In
- Prover9/Mace4
- ProverBox
- PVS
- ResearchCyc
- Simplify
- SNARK
- SPARK
- SPASS
- Spear Modular ATP
- Tau
- Theorem Proving System (TPS)
- Twelf
- Vampire/Vampyre
- Waldmeister
Como puedes ver, los dos campos se combinan. Los programados en estos casos, deben modificar el código de sus programas para que coincida con el resultado del demostrador de teoremas.
Esto es por supuesto con el objetivo que sus desarrollos ofrezcan los resultados planeados.
En este punto es necesario destacar un hecho muy importante. En la programación lógica, por más que presentes declaraciones precisas acerca de cómo la computadora tiene que tomar una decisión, a veces no es suficiente.
Además de ajustar su código a los resultados del demostrador de teoremas, se debe tener en cuenta el encadenamiento hacia atrás. El encadenamiento hacia atrás es una técnica ampliamente usada en campos como la inteligencia artificial, por ejemplo.
El encadenamiento hacia atrás
Se podría describir al encadenamiento hacia atrás como comenzar a trabajar desde el punto de finalización. Esta técnica es soportada por los motores de inferencia de la mayoría de los lenguajes de programación.
Este encadenamiento hacia atrás es utilizado en la programación lógica a través de la resolución selectiva lineal de cláusula definida. Esta es a la razón una de las técnicas con reglas de interferencia e implicación lógica más usadas.
Básicamente, el funcionamiento del encadenamiento hacia atrás comienza desde una lista de objetivos para determinar si hay datos que los respalden.
En este sentido, el motor de inferencia del lenguaje que se encuentra usando encadenamiento hacia atrás, buscará las reglas de inferencia. Esto es con el objetivo de hallar una regla con un consecuente que se igual al objetivo buscado.
En el caso que se encuentren datos para confirmar que el antecedente de esta regla sea verdadero, la misma se agregará a la lista de objetivos hasta encontrar datos que pueden confirmarlo.
Cabe destacar que a la técnica del encadenamiento hacia atrás también se la conoce como razonamiento hacia atrás.
Historia de la programación lógica
La historia de la programación lógica comienza bien atrás en el tiempo, junto a la lógica matemática. Uno de los primeros pensadores que dejaron huella de esto fue Aristóteles y su teoría silogística.
Básicamente, la teoría del silogismo está formada por dos proposiciones como premisas y otra como conclusión. La última es una inferencia necesariamente deductiva de las otras dos.
Si bien la teoría fue largamente estudiada por filósofos contemporáneos a Aristóteles, y se la siguió estudiando durante mucho tiempo después, lo cierto es que nada quedaba en claro.
No fue hasta el siglo XVII que surgieron nuevos puntos de vista sobre esta teoría del silogismo. Esto vino de la mano de Gottfried Leibnitz y René Descartes. Luego de ello, hubo que esperar dos siglos más para dar un paso importante.
Este paso fue dado por el matemático inglés George Boole, quien relacionó el álgebra, la lógica y el razonamiento de Aristóteles. Estos ensayos iniciales más tarde fueron retomados y ampliados por otros matemáticos de la talla de Huntington, Jevon, Schroeder o Pierce entre otros.
Luego de ello, a principios del siglo 20 comenzó lo que podría considerarse como una de las etapas más importantes, en términos de actividad, de la lógica matemática.
Aquí se llega al primer contacto entre la lógica matemática y la ejecución de programas. Esto es de la mano de Allonzo Church, desarrollador de una característica de los cálculos lamba.
A este periodo se lo conoce como la “Revolución de la fundamentación de las Matemáticas”. Y fue posible debido a los formidables papeles de Whitehead, Peano, Frege, Cantor y Russell, entre muchos otros.
Sin embargo, es a mediados del siglo 20 que aparecen las primeras máquinas de calcular electrónicas. En conjunto con el desarrollo de la lógica, prepararon el camino de todo lo que conoces hoy.
En este sentido, Alan Turing publica un artículo llamado “Can machines think?”, más conocido en español como “¿Pueden pensar las máquinas?”. Este trabajo fue publicado en 1950, y para muchos científicos y matemáticos es considerado como el inicio del desarrollo de la inteligencia artificial.
Nuevamente tendrá que pasar unos cuantos años para dar otro paso importante. En este sentido, Cordell Green presenta a la comunidad científica la primera propuesta para usar la forma causal de la lógica para representar programas de cómputo. Esto ocurrió en el año 1969.
Para llegar a este resultado, se utilizó una axiomatización de un subconjunto de LISP junto con una representación de una relación de entrada-salida. Esto permitió calcular la relación mediante la simulación de la ejecución del programa en LISP.
Cabe destacar que LISP (LISt Processor) es un lenguaje de programación de tipo multiparadigma. Entre sus características principales se pueden listar que su sintaxis se lleva a cabo totalmente entre paréntesis.
Ya con el camino marcado, se comenzaron a desarrollar las primeras aplicaciones de la programación lógica. Estas eran mayormente sistemas de preguntas y respuestas.
En este sentido, ABSYS fue de mucha ayuda. Cabe destacar que este es el primer lenguaje de programación basado en afirmaciones.
Unos pocos años después, recién comenzada la década de 1970, se desarrolla en la Universidad de Marsella Prolog. Los creadores de este lenguaje fueron Alain Colmerauer y Philippe Roussel.
Prolog no se desarrolló de manera intencional, sino que fue a consecuencia de un proyecto distinto. Este tenía como objetivo la clasificación algorítmica de lenguajes naturales.
Más tarde se unirían al desarrollo Robert Pasero, Jean Trudel y Robert Kowalsk. Entre los cinco lograron terminar la primera versión de Prolog en el año 1972. Cabe destacar que la primera versión de Prolog fue desarrollada en el conocido lenguaje de programación ALGOL W.
Para completar la idea, terminando la década de 1970 Robert Kowalski desarrolla el “método de prueba por refutación”. Este utiliza el algoritmo de unificación como mecanismo de base y permite la extracción de respuestas SLD, también conocidas como “Selective Linear Definite clause resolution”.
Al comienzo de su historia, Prolog era un lenguaje de programación totalmente interpretado. Esto cambió en 1983 cuando el matemático David H.D. Warren desarrolló un compilador.
Este era capaz de traducir Prolog en un conjunto de instrucciones de una máquina abstracta denominada WAM, acrónimo de “Warren Abstract Machine”. Desde este punto, Prolog es considerado como un lenguaje semi-interpretado.
Ahora, ¿Quieres saber qué es el paradigma de la programación lógica? Debajo de esto te lo explicamos de forma sencilla.
Paradigma de la programación lógica
Muchos de los lenguajes de programación están basados en la llamada “teoría lógica de primer orden”. Pero también ofrecen comparten algunas características de orden superior. En este punto destacar destacan los llamados lenguajes funcionales, ya que se encuentran basados en el Cálculo Lambda, la única teoría lógica de orden superior.
Aquí se debe destacar que la programación lógica es un tipo de paradigma de programación enmarcada dentro del paradigma de programación declarativa.
Con respecto a los demás subparadigmas de programación incluidos dentro de la programación declarativa, estos son:
- Programación funcional
- Programación con restricciones
- Programas DSL
- Híbridos.
Antes de continuar, debes entender que la programación funcional está basada en el concepto de función, una evolución de los predicados. Sin embargo, tiene un enfoque más matemático.
En cambio, la programación lógica se basa en el concepto de predicado, es decir la relación que existe entre los elementos.
¿Por qué programación lógica?
Desde los inicios de la historia de la informática, las computadoras han sido programadas usando lenguajes de programación centrados en las características del propio dispositivo.
Es decir, operaciones aritméticas simples, instrucciones de acceso a memoria y demás. Esto por supuesto es una desventaja, ya que esconde su finalidad a cualquiera que desee saberlo.
En la actualidad, esto ha cambiado. Los lenguajes de programación, más aún aquellos del tipo “Paradigma de Programación imperativa” han cambiado al punto en que son entendibles para todos aquellos con un cierto entrenamiento.
Sin embargo, la lógica matemática todavía es el método más fácil de representar y resolver problemas complejos. Esto se hace a través del uso de teoremas, reglas e hipótesis.
Es por ello que el concepto de “programación lógica” es tan importante para algunos ámbitos, sobre todo en aquellos en donde la programación tradicional no ofrece resultados satisfactorios.
Para qué se usa la programación lógica?
Como has podido ver, la programación lógica se desarrolla en el uso de la lógica para la visualización y resolución de problemas. Además estudia el control sobre las reglas de inferencia para conseguir una solución automática.
No existe un consenso o una fórmula sobre el uso de la programación lógica para el desarrollo de aplicaciones. Sin embargo, el ámbito más importante de aplicación de la programación lógica es la inteligencia artificial.
También es posible encontrar desarrollos programados con el paradigma de la programación lógica en:
- Sistemas expertos: En este campo, los sistemas de información simulan las recomendaciones de un experto acerca de múltiples temas.
- Demostración automática de teoremas: En este caso, un aplicativo es capaz de generar nuevos teoremas sobre teorías que ya existían previamente.
- Reconocimiento de lenguaje natural: En este campo, de mucha actividad en la actualidad, un programa es capaz de entender, aunque con ciertas limitaciones, la expresión lingüística humana.
Con respecto a la aplicación de la programación lógica en el campo del software de usuario, se suele utilizar. Sin embargo, su ámbito de aplicación es realmente muy limitado.
Esto es así ya que con la programación tradicional se obtienen mejores resultados, sobre todo en la informática de consumo, que lo que se podría obtener mediante la programación lógica.
Ventajas y desventajas de la programación lógica
Como todo sistema de computación, la programación, de cualquier tipo, tiene sus claras ventajas y desventajas. En este punto nos centraremos en las ventajas y desventajas de la programación lógica.
Ventajas de la programación lógica
- Mediante la programación lógica, es más sencillo escribir código sin conocer del todo el lenguaje de programación usado.
- Es muy cercano a las especificaciones del problema llevadas a cabo con lenguajes más formales.
- Con la programación lógica es posible modificar el componente de control, pero sin modificar la lógica del algoritmo.
Desventajas de la programación lógica
- Lamentablemente, en la actualidad no existen herramientas de depuración efectivas para la programación lógica.
- La programación lógica tiene pocos ámbitos de aplicación. Esto es debido a que no se puede aplicar del todo bien en la informática de consumo diario.
- Los motores de inferencia de la programación lógica son limitados.
- Otro punto negativo es que siempre retornará un “False” si no cuenta con la suficiente información para satisfacer determinadas consultas.
Lenguajes usados en la programación lógica
Prolog Gödel
- Es el primer lenguaje para programación lógica.
- También es uno de los más usados en la actualidad.
- Es capaz de polimorfismo.
- Simple pero poderoso.
- Se basa en nociones matemáticas de relaciones de inferencia
- Es un lenguaje declarativo e interpretado
- Tipos de datos.
- Utiliza módulos.
- Es capaz de meta-programación.
Mercury
- Es un lenguaje de tipo “Algebraic Logic Functional”, es decir que es capaz de combinar programación funcional y programación lógica.
- Alto nivel.
- Lenguaje puramente declarativo.
- Más rápido que Prolog.
- Se puede traducir a lenguaje de programación C.
Deja una respuesta