Programación Lógica Ing. Iván Adrianzén Olano Fundamentos de Visual Prolog Visual Prolog es orientado a objeto Para el curso de Sistemas Expertos usaremos el Prolog de la forma clásica usando el PIE (Prolog Interpretation Engine: Motor de Interpretación de Prolog). Es el intérprete clásico de Prolog. Lo encontrará en la carpeta Ejemplos que se crea al instalarlo. Lógica de la Cláusula Horn Visual Prolog se basa en la lógica de la cláusula Horn. Es un sistema formal usado para razonar sobre objetos y las relaciones que tienen éstos. Un ejemplo en lenguaje natural se expresa como: John es el padre de Bill. Se tienen 2 objetos (John y Bill) y una relación, el saber que uno es el padre del otro. Formalizando esta oración: padre(“Bill”,”John”). Lógica de la Cláusula Horn Podemos decir que padre es un predicado (una relación) que tiene 2 argumentos. El orden de los argumentos es determinado por el diseñador de la formalización. Debe ser consistente. Ejms: vive_en(“Pedro”,”Lima”). esta_casado_con(“Carlos”,”Claudia”). Lógica de la Cláusula Horn No hay límite para el número de argumentos. Ejm: % tiene 1 argumento. es_soltero(“Ricardo”). % tiene 3 argumentos. especialista_en(“Jeannet”,”Matemáticas”,”Lógica”). Estas especificaciones se denominan: hechos Un hecho consiste de un predicado, uno o más argumentos entre paréntesis separados por comas y terminados en un punto. Lógica de la Cláusula Horn Un hecho describe una relación estática entre los objetos (argumentos). Las relaciones generales entre objetos (o grupos de objetos) se llaman reglas. Ejm: Persona3 es abuelo de Persona1, si Persona2 es padre de Persona1 y Persona3 es padre de Persona2. Formalizando: Regla abuelo. abuelo(Persona1, Persona3):padre(Persona1, Persona2), padre(Persona2, Persona3). Lógica de la Cláusula Horn En esta regla usamos: Los operadores lógicos SI (“:-”) también Y (“,”). Cada regla termina en un punto (.). La primera parte se denomina conclusión (antes del símbolo “:-”). Lo que sigue se denomina premisas formado por uno o más hechos separados por comas y termina en punto (.). Note que “abuelo” comienza con minúscula. Los argumentos deben empezar con mayúscula. A estos argumentos denominamos variables. Lógica de la Cláusula Horn Si en lógica escribimos: SI p Y q ENTONCES r. En Prolog es: r:- p, q. Cuando las premisas son verdaderas la conclusión también lo es. La forma general es: Conclusión:- premisa1, premisa2,…premisaN. Lógica de la Cláusula Horn Resulta difícil establecer al final quién es el abuelo. Vamos a usar nombres de variables en vez de Persona1, Persona2 y Persona3. Usted es libre de elegir los nombres de variables. Reformulando la regla abuelo: abuelo(Nieto, Abuelo):padre(Nieto, Padre), padre(Padre, Abuelo). Lógica de la Cláusula Horn En la regla usamos variables en vez de nombres de objetos. En Prolog los hechos y las reglas se llaman cláusulas. Con hechos y reglas estamos listos para formular teorías. En general una teoría es una colección de hechos y reglas; es decir es un sistema de cláusulas. Lógica de la Cláusula Horn Una pequeña teoría: padre(“Bill”,”John”). padre(“Pam”,”Bill”). padre(“Sue”,”Jim”). abuelo(Nieto, Abuelo):padre(Nieto, Padre), padre(Padre, Abuelo). Con esta teoría se puede contestar a las siguientes preguntas: Lógica de la Cláusula Horn ¿Jim es padre de Sue? Esta pregunta puede ser contestada observando los hechos. El tercer hecho reconoce que Jim es el padre de Sue, así que la respuesta es “Si”(True). ¿John es padre de Sue? No hay un hecho que indique que John es el padre de Sue, así que la respuesta es “No“. Note sin embargo que hay un hecho que dice que Jim es el padre de Sue. Esto implica que John no puede ser el padre de Sue. La inteligencia de los seres humanos notaría esto, pero no es la manera en que razonó Prolog. En Prolog la respuesta es "no" porque no hay un hecho que indica que debe ser "sí". Lógica de la Cláusula Horn ¿Quién es el padre de Pam? Esta pregunta puede ser contestada observando el segundo hecho. Dice que Bill es el padre de Pam. ¿John es el padre de Ana? No hay hechos sobre Ana, no podemos contestar a esta pregunta. En Prolog asumimos que la respuesta es “No", pues no podemos indicar que la respuesta es “Sí". Lógica de la Cláusula Horn ¿John es el abuelo de Pam? Para contestar esta pregunta tenemos que usar la regla y los hechos. La regla nos dice que necesitamos encontrar dos hechos. El primero debe decir que alguien es el padre de Pam y el segundo hecho debe indicar que John es el padre del mismo. Repasando los hechos se observa que los hechos están diciendo precisamente que tomamos a Bill para algo. En efecto sí, John es el abuelo de Pam. Lógica de la Cláusula Horn Las Preguntas y/o Metas En Prolog puede hacer estas preguntas al motor de inferencia. Tales preguntas se llaman metas. Las metas se pueden formalizar de la siguiente manera: La pregunta ¿Jim es el padre de Sue?: ?-padre(“Sue", "Jim"). La pregunta ¿John es el padre de Sue?: ?-padre("Sue", "John"). La pregunta ¿Cuál es el nombre del padre de Pam?: ?-padre("Pam", X). La pregunta ¿John es el padre de Ana?: ?-padre("Ana", "John"). La pregunta ¿John es el abuelo de Pam? : ?-abuelo("Pam", "John"). Lógica de la Cláusula Horn A todos, los hechos, reglas y metas se llama las cláusulas Horn, por lo tanto el nombre de lógica de la cláusula Horn. Algunas metas como la primera, segunda y última se responden con un simple SI o NO, porque está preguntando si un hecho es verdadero. Para otras metas como la tercera buscamos una solución como X = "Bill". Algunas metas pueden incluso tener muchas soluciones. Por ejemplo: ?- padre(X, Y). Tiene tres soluciones (hay tres hechos que dan una solución): X = "Bill", Y = "John". X = "Pam", Y = "Bill". X = "Sue", Y = "Jim". PIE: Motor de Inferencia de Prolog Ventana del programa Ventana de diálogo PIE: Motor de Inferencia de Prolog Antes de poder usar el programa, debe instalar y construir el PIE ejemplo. Si aún no ha instalado los ejemplos, por favor hágalo ahora. Seleccione "instalar los ejemplos" en el menú de inicio de Windows (ejemplos de Start/Visual Prolog/Install). Inicie Visual Prolog Busque el proyecto PIE en la carpeta Ejemplos que está instalada. Abra el proyecto PIE en el IDE y ejecute el programa. Puede ejecutar PIE como un proyecto normal. No tiene que cambiar nada, así que utilice solamente el IDE para ejecutar el programa. PIE: Motor de Inferencia de Prolog Para crear un programa, seleccione File/New de la barra de menú. PIE abre una segunda ventana, la ventana del programa que usaremos para agregar el programa. Ahora hay dos ventanas abiertas, la ventana del programa y la ventana de diálogo. En la ventana del programa escribe los hechos y las reglas de su teoría. La ventana de diálogo se usa para el diálogo con el motor de inferencia. Aquí escriba las metas para el programa, que son las preguntas que se contestarán. También los mensajes de PIE aparecen en esta ventana. Es importante tener cuidado de cuál ventana tiene el control (ventana activa). Para dar control a una ventana haga clic en su barra de título. Agregue en la ventana del programa las cláusulas padre y abuelo (que son los hechos y las reglas) que evaluamos anteriormente. Ventana del Programa Hechos Regla Si todo va bien se mostrará una ventana como ésta PIE: Motor de Inferencia de Prolog Para que el motor de inferencia utilice éstas cláusulas y ésta regla debemos cargarlo previamente. Mientras la ventana del programa está activa seleccione el menú Engine/Reconsult o también puede pulsar la tecla F9. El procedimiento en general es: Crear o cargar un archivo en la ventana del programa con File/New o File/Consult Guarde esos archivos cuando sea necesario con File/Save Reconsúltelo con el motor con Engine/Reconsult Agregue una meta en la ventana de diálogo y presione <enter> PIE: Motor de Inferencia de Prolog Una vez que "haya consultado" la teoría, puede utilizarla para responder a metas. En una línea en blanco en la ventana de diálogo digite una meta (sin ?- adelante). Vamos a hacer la pregunta quién es abuelo de quién. En Prolog esto se convierte en una meta con 2 variables. Queremos que el motor de inferencia encuentre los valores (nombres) para las variables. abuelo(X, Y). Note que abuelo está en minúscula y las variables en mayúscula "X" y "Y“, no olvide terminarlo en punto. Ejecutando las metas Escribimos la meta como se observa en la figura: Meta Para consultarlo sitúe el cursor al final del párrafo y presione enter Resultado Reglas para establecer las metas Puede utilizar cualquier predicado en el programa para formular una meta. En este caso puede utilizar "padre" o "abuelo". Con un predicado debe dar los argumentos apropiados. Eso significa el número correcto y el tipo correcto. En este caso el tipo es siempre cadena de caracteres, es difícil que se equivoque aquí. Un argumento puede incorporar el nombre de un objeto específico o puede usar una variable. Los nombres de objetos específicos son "Sue", "Jim", "Bill", etc. Todas en cadena de caracteres. Cuando incorpora una meta, el motor de inferencia contestará sí o no dependiendo de las reglas y de los hechos en su programa. Cuando incorpora una meta con variables el motor de inferencia intentará buscar los valores para las variables de modo que la meta iguale un hecho. Cuando tiene éxito, mostrará los valores para las variables. La salida se entenderá mejor cuando use los nombres de variables que tengan sentido. Reglas para establecer las metas Puede usar nombres de objetos y variables en la misma meta. Por ejemplo padre("Sue", Padre). En este caso el motor de inferencia intenta otra vez encontrar un valor para la variable que empareje la meta con uno de los hechos. Una meta puede consistir en más de un predicado. En ese caso tiene que utilizar los operadores lógicos "," para y o ";" para o. Un ejemplo es la meta padre("Sue", "Jim"),padre("Bill", "Juan"). Ejercicios Hagas las consultas respectivas de la regla del abuelo tratadas anteriormente al motor de inferencia del prolog. Establezca metas propias a la teoría redactada.