Programación lógica: características y ejemplos
La programación lógica es un paradigma de programación que utiliza los circuitos lógicos en lugar de solamente las funciones matemáticas para controlar cómo se enuncian los hechos y las reglas.
En lugar de un flujo de control cuidadosamente estructurado que dictamina cuándo ejecutar y cómo evaluar las llamadas a funciones u otras instrucciones, las reglas lógicas del programa se escriben como cláusulas o predicados lógicos.
Este enfoque, que a menudo es utilizado en la programación genética y evolutiva, generalmente le dice a un modelo qué objetivo lograr, en vez de cómo lograrlo.
Cada regla contiene un encabezado y un cuerpo con una lógica formalizada, en lugar de una función matemática ejecutable. Por ejemplo, “Y es verdadero (encabezado): si C1, C2 y C3 son verdaderos (cuerpo)”. Los hechos o resultados se expresan sin un cuerpo, tal como “Y es verdadero”.
Sin embargo, con algunos lenguajes de programación como Prolog se puede incluir también la programación imperativa para decirle al modelo cómo resolver ciertos problemas. Por ejemplo, “Para resolver Y, sumar C1, C2 y C3”.
Índice del artículo
Características de la programación lógica
La programación lógica es sustancialmente diferente de las otras estrategias de programación existentes. En lugar de darle instrucciones a una computadora con el programa, se establecen relaciones entre los objetos. De esta manera la computadora puede razonar estas relaciones y así alcanzar soluciones lógicas.
Dentro de un programa lógico existen dos conjuntos principales de código: hechos y reglas. Las reglas se aplican a los hechos para así obtener conocimiento sobre el medio ambiente.
Verdad y deducción lógica
Los programas lógicos se pueden descifrar a través de dos conceptos importantes: verdad y deducción lógica. La verdad sale si el cálculo en el programa es verdadero o no, bajo la implementación de los símbolos del programa. La deducción lógica determina si una cláusula lógica es una consecuencia del programa.
Estas instrucciones siempre se interpretarán como sentencias y cláusulas lógicas, siendo el resultado de su ejecución una consecuencia lógica de los cálculos que contenga.
Lógica de primer orden
Es una ramificación de la lógica proposicional. Considera si los objetos son verdaderos o falsos desde una perspectiva parcial del mundo, llamada dominio. La programación lógica se basa en una generalización de la lógica de primer orden.
Esta lógica está compuesta de sintaxis y semántica. La sintaxis es el lenguaje formal que se utiliza para expresar conceptos. Por otro lado, la semántica de las fórmulas lógicas de primer orden indica cómo determinar el valor verdadero de cualquier fórmula.
Esta lógica se fundamenta en un alfabeto y un lenguaje de primer orden, además de un conjunto de axiomas y reglas de inferencia.
Forma clausal
Es un subconjunto de la lógica de primer orden. Tiene una forma normalizada donde una sentencia viene definida por un prefijo universal o cadena de cuantificadores universales, y un conjunto libre de cuantificadores de la cláusula.
Al solicitar una consulta al programa se considerará el cuerpo de la cláusula cuyo encabezado pueda coincidir. Esto es lo mismo que aplicar en lógica una regla de inferencia.
Como paso de la inferencia se eligen dos cláusulas que tengan como propiedad que una contenga un disyuntivo X (un literal positivo) y la otra contenga un disyuntivo ¬X (un literal negativo). Estos disyuntivos se conocen como complementarios.
A partir de estas dos cláusulas iniciales se construye una nueva cláusula resolutiva utilizando todos los literales, excepto los complementarios.
Inteligencia artificial
La programación lógica es una metodología que es empleada para buscar que las computadoras deduzcan, porque resulta útil para representar el conocimiento. Se utiliza la lógica para representar el conocimiento y la inferencia para manejarlo.
La lógica utilizada para representar el conocimiento es la forma clausal. Se utiliza porque la lógica de primer orden se entiende bien y es capaz de representar todos los problemas computacionales.
Prolog es un lenguaje de programación que se basa en las ideas de programación lógica. La idea de Prolog es hacer que la lógica parezca un lenguaje de programación.
Ejemplos de programación lógica
Ejemplo 1
– Hecho: Rubí es un gato.
– Regla: todos los gatos tienen dientes.
– Consulta: ¿Rubí tiene dientes?
– Conclusión: sí.
La regla “todos los gatos tienen dientes” se puede aplicar a Rubí, porque hay un hecho que dice “Rubí es un gato”. Este ejemplo no está escrito con ninguna sintaxis de un lenguaje de programación real.
Ejemplo 2
Este ejemplo se puede ver escrito en Prolog, por ser uno de los lenguajes de programación lógica más conocido:
– femenino(alissa).
– masculino(bobby).
– masculino(carlos).
– femenino(doris).
– hijo_de(doris, carlos).
– hijo_de(carlos, bobby).
– hijo_de(doris, alissa).
– padre_de(F, P) :- masculino(F), hijo_de(P, F).
Este programa se hace difícil de leer, porque Prolog es notablemente diferente a otros lenguajes. Todo componente del código que se asemeje a “femenino(alissa).” es un hecho.
Una regla es “padre_de(F, P) :- masculino(F), hijo_de(P, F)”. El símbolo “:-” se puede leer como “es verdadero si”. Las letras mayúsculas significan que las variables se pueden aplicar a cualquier objeto, por lo cual F podría significar carlos, doris, alissa o bobby. Este código se puede traducir como:
– Alissa es mujer.
– Bobby es hombre.
– Carlos es hombre.
– Doris es mujer.
– Doris es hija de Carlos.
– Carlos es hijo de Bobby.
– Doris es hija de Alissa.
– “F es padre de P” es cierto si F es hombre y si P es hijo de F.
Consulta
Supongamos que se quiera consultar al programa para obtener más información. Se puede buscar pedir que se encuentre de quién es padre Bobby con: ?- padre_de(bobby, X). El sistema indicará la siguiente respuesta: X = carlos.
En este caso se está pasando una relación donde uno de sus valores es una variable. Prolog lo que hizo fue aplicar diferentes objetos a esta relación hasta que uno de ellos resultó lógicamente sólido.
El único padre de Carlos es Bobby, y Bobby es hombre. Esto satisfizo la regla “padre_de(F, P) :- masculino(F), hijo_de(P, F).”. Cuando X es igual a “carlos”, la lógica es sólida.
Otras consultas
Se pueden realizar otras consultas más generales a Prolog, que hagan que el sistema genere múltiples resultados:
– ?- padre_de(Padre, Niño).
– Padre = bobby
– Niño = carlos
– Padre = carlos
– Niño = doris
Como se ha podido observar, la programación lógica no requiere tener la información que alissa o bobby son personas para poder obtener un conocimiento sobre ellos. De hecho, tampoco se le precisa indicar que existe un concepto denominado persona.
En la mayoría de los lenguajes de programación no lógicos habría que definir primero dichos conceptos antes de poder escribir programas que procesen información sobre personas.
Referencias
- Deep AI (2020). Logic Programming. Tomado de: deepai.org.
- Wikiversity (2020). Theory of Programming Languages/Logic Programming. Tomado de: en.wikiversity.org.
- Imperial College London (2006). Logic Programming. Tomado de: doc.ic.ac.uk.
- Jia-Huai You (2020). Introduction to Logic Programming. University of Alberta. Tomado de: eng.ucy.ac.cy.
- C2 Wiki (2020). Logic Programming. Tomado de: wiki.c2.com.