PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.1 – Introducción PROLOG es un lenguaje declarativo e interpretado, en este tipo de lenguajes se representan los conocimientos sobre un determinado dominio y sus relaciones. A partir de ese conocimiento, se deducen las respuestas a las preguntas planteadas, es decir se obtiene una inferencia. El conocimiento se formaliza mediante un conjunto de relaciones que describen de forma simultánea las propiedades y sus interacciones. Se declara el conocimiento disponible acerca de: OBJETOS: propiedades relaciones REGLAS, que determinan interacciones lógicas del tipo: si ocurre q, r, s y t entonces P Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.1 – Introducción Un programa Prolog está constituido por un conjunto de cláusulas de Horn. Una cláusula de Horn tiene la forma general: p(t1,t2,….,tn) :- p1(….),p2(….),…,pm(….) con m >= 0 Donde tanto p como las pi son símbolos predicados con sus argumentos entre paréntesis. A los argumentos de un predicado se les denomina Términos. Las cláusulas de Horn son expresiones condicionales, siendo el símbolo “:-” el condicional o símbolo de la implicación (normalmente en lógica se utiliza el símbolo “ ”) . ⇒ Así la cláusula anterior podría leerse de la siguiente forma: “SI p1(….) Y p2(….) Y … Y pm(….) ENTONCES p(t1,t2,…,tn)” Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 1 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.1 – Introducción Cuando m=0, la cláusula no tiene parte derecha, en este caso diremos que se trata de un hecho o afirmación. p(t1,t2,…,tn). Cuando la cláusula no tiene parte izquierda (o cabeza), se tiene pregunta, este tipo de cláusulas se utilizan para realizar la entrada/salida del programa: ?p1(….),p2(….),…,pm(….) Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.2 – Cláusulas Un programa en Prolog está constituido por una secuencia de cláusulas. Estas cláusulas deben representar todo el conocimiento necesario para resolver el problema. Se pueden diferenciar tres tipos de Cláusulas: Hechos (afirmaciones), se pueden representar: Objetos Propiedades de objetos Relaciones entre objetos Reglas. Consultas. Cada cláusula puede estar formada por uno o varios predicados. Las cláusulas deben terminar obligatoriamente en punto. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 2 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.3 – Hechos Es el mecanismo básico para representar: objetos/personas/conceptos. propiedades de los objetos. relaciones entre los objetos. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO padre(luis). padre_de(luis, pedro). azul(cielo). INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.3 – Hechos Ejemplo Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 3 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.4 – Consultas Es el mecanismo para extraer conocimiento del programa. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.4 – Consultas Por ejemplo si Vicente busca amigos/as de mis amigos que sean millonarios/as y estén solteros/as: Una consulta estará constituida por una o varias metas que Prolog deberá resolver. El intérprete de Prolog nos devuelve más soluciones si utilizamos el punto y coma “;” Cuando no existen más soluciones que unifiquen con el objetivo, el intérprete contesta No. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 4 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.5 – Reglas Permiten establecer relaciones más elaboradas entre objetos, por ejemplo, relaciones causa-efecto. padre_de(juan, jose). familiares(pedro, miguel). hermanos(enrique,jose). familiares(X, Y) :- padre_de(X, Y). familiares(X, Y) :- padre_de(Y, X). familiares(X, Y) :- hermanos(Y, X). familiares(X, Y) :- hermanos(Y, X). Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.6 – Equiparación Por ejemplo, si una variable está libre y es equiparada con un valor numérico, se obtiene una instanciación (asignación) de la variable con dicho valor. Este mecanismo permite comprobar si dos expresiones son equivalentes, produce como resultado una sustitución de términos cuando esta es posible. Ejemplos: amigos(pedro, vicente) y amigos(pedro, vicente) son equiparables. amigos(pedro, vicente) y amigos(X, vicente) son equiparables. X = pedro. amigos(pedro, Y) y amigos(X, vicente) son equiparables. X = pedro, Y = vicente. amigos(X, X) y amigos(pedro, vicente) no son equiparables porque X = pedro, X = vicente no es posible. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 5 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.7 – Desigualdad Para comprobar si dos términos son distintos, disponemos de diferentes operadores. Desigualdad \== Comprueba si dos términos son distintos. Por ejemplo, si dos variables tienen distintos valores instanciados. Desigualdad aritmética =\= Verifica la desigualdad numérica de dos expresiones. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.8 – Igualdad y asignación Disponemos de cuatro tipos de operadores de ‘igualdad’: Igualdad aritmética [=:=]. Comprueba la igualdad numérica de las expresiones argumento. igual1(X, Y) :- X =:= Y. Identidad [==]. Comprueba si los términos argumento son idénticos. igual2(X, Y) :- X == Y. Unificación [ = ]. Comprueba si los términos argumento son unificables (equiparables). Es equivalente a la asignación directa entre variables en un lenguaje procedimental. Da fallo si la unificación no es posible. igual3(X, Y) :- X = Y. Una definición equivalente sería: igual4(X,X). Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 6 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.8 – Igualdad y asignación Asignación [is]. Evalúa la segunda expresión e intenta asignar el valor obtenido a la variable. No es conmutativo incremento(X,Y) :- Y is X+1. Una definición similar a la de igualdad sería: igual5(X, Y) :- X is Y. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.8 – Igualdad y asignación A continuación se muestra una tabla comparativa de todas las posibilidades existentes. Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 7 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.9 – Operadores lógicos y aritméticos Para comprobar si dos términos son distintos, disponemos de diferentes operadores. Operadores y funciones aritméticas válidas en Prolog son: Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO INF 152 – Programación en Lógica Escuela de Ingeniería Informática Capítulo 4 – PROLOG 4.10 – Negación Existe un predicado de negación en Prolog (not) que está implementado como negación por fallo, esto quiere decir que se evalúa como falso cualquier cosa que Prolog sea incapaz de verificar que su predicado argumento es cierto. no_nulo(X):-not(X=:=0). saldo_cuenta(maria,1000). saldo_cuenta(flora,3000000). saldo_cuenta(antonio,2000000). millonario(X) :- saldo_cuenta(X, Y), Y > 1000000. pobre(X) :- not(millonario(X)). Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática INF 152 – Programación en Lógica 8