Вы находитесь на странице: 1из 10

UNIVERSIDAD NACIONAL PEDRO RUIZ GALLO FACULTAD DE CIENCIAS FSICAS Y MATEMTICAS ESCUELA PROFESIONAL DE COMPUTACIN E INFORMTICA

INTELIGENCIA ARTIFICIAL
UNIDAD II: Introduccin AL Lenguaje de programacin Lgica
6. 7. 8. 9. UNIFICACIN ..................................................................................................................................................................2 RESOLUCIN DE PROGRAMAS....................................................................................................................................6 ESTRUCTURAS DE CONTROL ......................................................................................................................................7 ARITMTICA DE VISUAL PROLOG ................................................................................................................................ 8

Docente: Ing. Mara Ncida Malca Quispe

6. UNIFICACIN
Cuando se intenta igualar (o ajustar) un objetivo con una clusula, hacemos uso de la unificacin. Este mecanismo incluye cosas propias de otros lenguajes tradicionales, tales como el paso de parmetros, la seleccin por casos, la construccin y acceso a estructuras de datos o la asignacin. La unificacin es un mtodo interno de manipulacin de datos que pasa parmetros, retorna resultados, selecciona y construye estructuras de datos. La unificacin, como ya se ha comentado, es el algoritmo que se encarga de resolver las igualdades lgicas. Aunque la unificacin en Prolog sustituye a la asignacin de los lenguajes procedurales, no hay que confundirla con esta, son operaciones totalmente distintas. La operacin de unificacin se representa mediante el operador =. Ejemplos: X = pepe. 3 = X. X = Y. f(3, 2) = f(X, 2). f(X, p(a) ) = f(p(Y), Y). X = 3 + 2. 5 = 3 + 2. X + 3 = 2 + Y. f(X, f(X) ) = f(Y, Y).

El mecanismo de unificacin Dadas estas clusulas: clauses written_by(fleming,"DR NO"). written_by(melville,"MOBY DICK"). book("MOBY DICK",250). book("DR NO",310). long_novel(Title):-written_by(_,Title),book(Title,Length),Length > 300. Consideremos el objetivo: written_by(X, Y).

Cuando se ejecuta este objetivo, Prolog intenta encontrar una clusula en el programa (en el orden de aparicin) cuya cabeza se pueda igualar al objetivo. Entonces, le asigna valores a las variables desinstanciadas, de forma que ambos, el objetivo y la cabeza de la clusula, se hagan idnticos. A este proceso le llamamos unificacin. En nuestro caso concreto, ya que el objetivo tiene como argumentos dos variables desinstanciadas X e Y, ste unificara con cualquier clusula cuya cabeza contenga el predicado written_by. Por ejemplo, se produce la siguiente unificacin:

Docente: Ing. Mara Ncida Malca Quispe

, instanciando la variable X al valor fleming y la variable Y al valor "DR NO". En este instante, aparece por pantalla la solucin: X = fleming, Y = "DR NO" , y el sistema se dispone a buscar otras soluciones al objetivo (si las hay). Para ello, se desinstancian las variables, y se intenta buscar otra clusula con cuya cabeza unifique el objetivo, por ejemplo:

As, Visual Prolog muestra por pantalla una nueva solucin: X = melville, Y = "MOBY DICK" De nuevo, desinstancia las variables e intenta buscar una nueva solucin. En este caso, sin embargo, ya no hay ms clusulas que unifiquen con el objetivo, y por tanto muestra finalmente el mensaje: 2 Solutions , y termina la ejecucin del programa.

Consideremos ahora el objetivo: written_by(X, "MOBY DICK"). Prolog comienza a buscar clusulas con las que unificar, y prueba con la primera:

Sin embargo, puesto que "MOBY DICK" y "DR NO" son dos strings distintos, el intento de unificacin falla, y Visual Prolog prueba con otra clusula:

, que s tiene xito, instanciando la variable X a melville.

Considera ahora el objetivo: long_novel(X). Cuando Visual Prolog ejecuta este objetivo, comienza por buscar una clusula cuya cabeza unifique con l. En este caso, selecciona la nica clusula para long_novel: long_novel(Title) :- written_by(_, Title), book(Title, Length), Length>300.

Ya que tanto la variable X como Title estn desinstanciadas, entonces long_novel(X) unifica con long_novel(Title) instancindose una variable a la otra. Ahora, Visual Prolog intenta ejecutar los subobjetivos en el cuerpo de la clusula anterior, comenzando por written by(_, Title).

Docente: Ing. Mara Ncida Malca Quispe

Observe que, puesto que el autor del libro no es importante (slo queremos comprobar que dicho ttulo existe), empleamos una variable annima. Este objetivo unifica con el primer hecho para written_by:

, instanciando la variable Title a "DR NO". Prolog intenta ahora la ejecucin del siguiente subobjetivo book(Title,Lenght) con la instanciacin realizada, es decir, intenta la ejecucin de: book("DR NO", Length).

El intento de unificacin con el hecho book("MOBY DICK", 250) falla, puesto que "DR NO" y "MOBY DICK" no unifican. Con la segunda clusula de book, s que hay xito:

, instanciando la variable Length a 310. Finalmente, ejecutamos Length >300 que, con la instanciacin anterior, se convierte en: 310 > 300 , que tiene xito.

En este punto, todos los subobjetivos de long_novel han sido ejecutados con xito y, por tanto, la llamada inicial termina con xito. Cul ser el valor de la variable X del objetivo inicial? Puesto que X se ha instanciado a Title, y Title a su vez se ha instanciado a "DR NO", Visual Prolog devuelve: X = "DR NO" 1 Solution

Equiparacin Este mecanismo permite comprobar si dos expresiones son equivalentes, produce como resultado una sustitucin de trminos cuando esta es posible. Por ejemplo, si una variable est libre y es equiparada con un valor numrico, se obtiene una instanciacin (asignacin) de la variable con dicho valor. 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.

Docente: Ing. Mara Ncida Malca Quispe

En general, dos trminos T1 y T2 son equiparables: T1, T2 son constantes => idnticas. T1 o T2 es una variable => se equiparan instanciando el otro trmino a la variable. T1, T2 son estructuras => los trminos que los componen son equiparables manteniendo una instanciacin de las variables coherente. Por otra parte, dos variables desinstanciadas siempre se pueden ajustar. Por ejemplo: parent(tom,X) se ajusta a parent(tom,Y) , instanciando las variables X e Y una a otra. Mientras esta instanciacin sea vlida, las variables X e Y se tratarn como si fueran una nica variable (dos punteros a una misma posicin de memoria), de forma que si una toma un valor, la otra tambin lo tomar de forma inmediata. La tcnica con la que igualamos (o ajustamos) un objetivo con la cabeza de una clusula puede considerarse como un mecanismo de paso de parmetros (bidireccional) en Prolog. As, dada una llamada: parent(tom, Y) , y una clusula encabezada por: parent(X, joe) , tenemos que parent(tom, Y) se ajusta a parent(X, joe), instanciando la variable X a tom y la variable Y a joe. Esto se corresponde con el paso del parmetro tom a la variable X, y el paso del parmetro joe a la variable Y, en el momento de la llamada.

En Prolog, los valores a los que se instancian las variables se pueden pasar en dos modos: entrada (input) y salida (output). Si una variable en la cabeza de una clusula recibe un valor desde el objetivo, se dice que es un argumento de entrada y se denota por (i). Si la variable sirve para devolver un valor al objetivo, se dice que es un argumento de salida, y se denota por (o). A la declaracin de los distintos modos de un predicado lo llamamos patrn de flujo de datos. Por ejemplo, la clusula: doble(X,Y) :- Y = X+X. , permite calcular el doble de un nmero (X). Su patrn de flujo de datos es (i,o), es decir, la X es de entrada, y la Y de salida. La unificacin se realiza, para cada predicado, de izquierda a derecha, y para cada conjunto de predicados, de arriba a abajo. Se pueden unificar variables con constantes, siempre que la variable no est instanciada. Si la variable est instanciada, el hecho de hacer unificacin entre ambas se corresponde con la situacin de unificacin de dos constantes. Para que dos constantes se puedan unificar ambas han de ser iguales. Algunos casos que muestran el funcionamiento de la unificacin: Variable no instanciada se intenta unificar con cualquier tomo XITO X=5 X que X=6 FAIL 5=6 X=6, X=7 contiene 5,

Variable instanciada se intenta unificar con cualquier tomo distinto al FAIL valor que contiene Constante se intenta unificar con otra constante distinta

Variable se intenta instanciar dos veces en la misma ejecucin del FAIL programa. En el segundo intento de instanciacin Docente: Ing. Mara Ncida Malca Quispe

Vemos que las instanciacin es un caso de unificacin en la que a una variable no instanciada se le asigna un valor. Tambin podemos observar que no es necesario definir los tipos de las variables locales usadas dentro de cada regla de inferencia. Cuando las variables se instancian a un valor, entonces todas las operaciones que se realicen con dicho valor debern tener en cuenta el tipo especificado. Por ejemplo, si una variable se instancia al valor 5, todas las comparaciones posteriores se harn con nmeros y no con tomos del tipo pepe, blas similar. El proceso de unificacin intenta enlazar un predicado con otro para comprobar si son absolutamente iguales, cuando es posible hacer sustituciones, stas se realizan de manera que los predicados que se estn unificando se tornen completamente iguales y proporcionen un resultado de XITO.

7. RESOLUCIN DE PROGRAMAS
humano(pepe). humano(juan). mortal(X):- humano(X). Ante las siguientes consultas: humano(pepe). mortal(pepe). mortal(javi). mortal(X). %1 Yes %2 Yes %3 No %4 %X = pepe more %X = juan

Si encuentra la pregunta como un hecho, la respuesta es directamente que s (pregunta 1 del ejemplo anterior). Si encuentra la pregunta como la cabeza (o consecuencia) de una regla, toma cada uno de los predicados del cuerpo de la regla como nuevas preguntas y slo si todas son ciertas, la respuesta ser s (pregunta 2). Si no encuentra ningn hecho o regla que haga cierta la pregunta, la respuesta ser no (pregunta 3). Es importante tener en cuenta que para comprobar si la pregunta coincide con un hecho o con la cabeza de una regla se aplica unificacin. Esto significa que si en la pregunta hay alguna variable, sta unificar con los trminos del hecho o regla, es decir, ser igual a los valores que hacen cierta la pregunta. Esto se utiliza para extraer resultados (pregunta 4).

Docente: Ing. Mara Ncida Malca Quispe

8. ESTRUCTURAS DE CONTROL
En Prolog, a diferencia de lenguajes procedurales como Pascal o C, no existen estructuras de control para bucles. stos se implementan mediante predicados recursivos. En cambio existen estructuras de control nuevas que no existen en otros lenguajes y que describiremos a continuacin. AND

El AND o Y lgico se representa en Prolog mediante la coma ,. Este operador ya se ha visto en detalle en todos los ejemplos utilizados hasta ahora.

OR

El OR o O lgico se puede realizar en Prolog de dos formas distintas: Mediante varias clusulas para un mismo predicado Mediante el operador ;.

Mediante varias clusulas se consigue poniendo cada una de las opciones en una clusula distinta del predicado. Entre las distintas clusulas de un mismo predicado se puede considerar que existe un OR. El operador ; se utiliza igual que el operador ,. nicamente hay que prestar especial atencin a la prioridad de los operadores, ya que ; tiene menor prioridad que ,, lo que significa que normalmente habr que encerrar entre parntesis la operacin. A este respecto hay que recordar que el OR se considera una suma lgica y el AND una multiplicacin lgica. NOT

La negacin se realiza mediante el predicado not. El predicado not/1 antes de la llamada a un predicado P cambia su valor de verdad, es decir, si el predicado P tiene xito, not(P) fallar y si el predicado P falla, not(P) tendr xito. Ejemplo no_entero(X):- not(integer(X)). not(2>3).

Sin embargo hay que tener la precaucin de aplicar la negacin nicamente en llamadas a predicados donde todas las variables existentes estn ya instanciadas, ya que si no el comportamiento no es el esperado. Ejemplo: padre(pepe, juan). huerfano(X):-not(padre(Z, X)).

Para la pregunta huerfano(pepe) funcionar bien y dir que s, pero si preguntamos quin es hurfano con huerfano(X), reportara un error.

Docente: Ing. Mara Ncida Malca Quispe

9. ARITMTICA DE VISUAL PROLOG


Las expresiones aritmticas en Visual Prolog se componen de operandos (nmeros y variables), operadores (+, -, *, /, div, y mod) y parntesis: A = 1 + 6 / (11 + 3) * Z. Los nmeros "0x" o "0o" significan hexadecimal y octal respectivamente: 0xFFF = 4095; 86 = 0o112 + 12. El valor de una expresin se puede calcular si todas las variables estn unificadas en el momento de la evaluacin. El clculo ocurre entonces en un orden determinado por la prioridad de los operadores aritmticos. Los operadores de mayor prioridad son evaluados primero.

Operaciones Operando 1 entero real entero real entero real entero entero Operador +, -, * +, -, * +, -, * +, -, * / div mod Operando 2 entero entero real real entero real entero entero Resultado entero real real real real entero entero

Orden de evaluacin Si la expresin contiene subexpresiones entre parntesis, las subexpresiones se evalan primero. Si la expresin contiene multiplicacin o divisin, estas operaciones son realizadas trabajando de izquierda a derecha a travs de la expresin. Las operaciones de suma y resta son llevadas a cabo de izquierda a derecha tambin. En el orden de evaluacin se tiene en cuenta, lgicamente, la precedencia de los operadores. Operador - + (unario * / mod div +Prioridad 1 2 3

Funciones y predicados Visual Prolog posee una gran cantidad de funciones y predicados matemticos para realizar las ms variadas operaciones. Entre algunos de ellos, tenemos:

Docente: Ing. Mara Ncida Malca Quispe

Nombre X mod Y X div Y abs(X) cos(X) sin(X) tan(X) arctan(X) exp(X) ln(X) log(X) sqrt(X) random(X)

Descripcin Resto de X dividido entre Y. Cociente de X dividido entre Y. Valor absoluto de X. Coseno de X. Seno de X. Tangente de X. Arcotangente de X. e elevado al valor almacenado en X. (Exponencial). Logaritmo neperiano de X. Logaritmo en base 10 de X. Raz cuadrada de X. Almacena en X un nmero aleatorio real entre 0 y 1. Almacena en Y un nmero aleatorio en el intervalo 0 <= Y < X. Valor redondeado de X. El resultado es un nmero real. Valor truncado de X. El resultado es un nmero real. Conversin explcita entre dominios numricos.

random(X, Y)

round(X) trunc(X) val(domain,X)

Comparaciones En Visual Prolog podemos comparar expresiones aritmticas, caracteres, cadenas de caracteres y smbolos. Las comparaciones de este tipo se realizan a travs de operadores relacionales. Ver Tabla 4. Smbolo < <= = > >= <> o >< Relacin menor que menor o igual que igual que mayor que mayor o igual que distinto

Docente: Ing. Mara Ncida Malca Quispe

Comparacin de caracteres, cadenas de caracteres y smbolos Adems de las expresiones numricas, podemos comparar caracteres, cadenas y smbolos: a" < b; "antony" > "antonia" y P1 = peter, P2 = sally, P1 > P2.

Caracteres: Visual Prolog convierta la comparacin a" < b a su expresin aritmtica correspondiente 97 < 98, usando el cdigo ASCII correspondiente a cada carcter. Cadenas de caracteres: Cuando se comparan dos cadenas o smbolos, la comparacin se realiza carcter a carcter en sus correspondientes posiciones. El resultado es el mismo que se consigue comparando el carcter inicial a menos que los dos sean iguales en cuyo caso se pasa al siguiente. Cuando se encuentran dos caracteres iguales, el proceso de comparacin termina y se produce el resultado.

Smbolos: No pueden ser comparados directamente debido a la sintaxis. Primero deben ser unificados a variables o escritos como cadenas de caracteres.

Docente: Ing. Mara Ncida Malca Quispe

10

Вам также может понравиться