Documente Academic
Documente Profesional
Documente Cultură
Introduccin a PROLOG o
PROLOG es un lenguaje interpretado basado en la lgica o de predicados de primer orden. Puede ser visto como un lenguaje de programacin o como o un demostrador mecnico de teoremas. a Fue implementado a principios de los aos 70 por Alain Coln merauer y junto con Lisp son los lenguajes que histricamente o se han utilizado para construir aplicaciones en gran parte de las ramas de IA. Hoy existen muchas implementaciones de PROLOG, la que nosotros usaremos es SWI-Prolog desarrollado en la Universidad de Amsterdam. Es una versin libre y puede ser deso cargada para distintos ambientes. http://www.swi-prolog.org
LPOP a la rpida... a
(supondremos cierta familiaridad con el tema) A grandes razgos la lgica de predicados de primer orden o (LPOP) es un lenguaje formal para expresar cierta parte del lenguaje matemtico. a Sus componentes principales son los predicados (atributos, relaciones), constantes, variables, y cuanticadores (, ). Ejemplo: Todos los hombres son mortales, y dado que Scrates es un hombre, o podemos concluir que Scrates es mortal. o Podemos modelarla con la siguiente frmula: o (X(hom(X) mor(X)) hom(socrates)) mor(socrates) que es una frmula de LPOP donde hom y mor son preo dicados, X es una variable cuanticada y socrates es una constante... la frmula resulta ser siempre verdadera. o Desde otro punto de vista podr amos pensar en la misma frmula anterior pero en un esquema de consulta donde: o 1. X(hom(X) mor(X)) 2. hom(socrates) son oraciones, y Q: mor(socrates)? es una consulta. Luego si suponemos las oraciones 1 y 2 como hechos verdaderos, y preguntamos por la consulta Q, la respuesta debiera ser SI. PROLOG sigue un esquema similar de hechos y consultas.
3
PROLOG
PROLOG es un lenguaje interpretado que nos permite especicar hechos y reglas, similares a los de LPOP, y luego hacer consultas sobre ellos. El interprete presenta un prompt para iteractuar ?-. La interaccin con el interprete es a partir del ingreso de o hechos y reglas de manera directa ?- [user]. |: aqu se ingresan los hechos y reglas uno a uno... o cargando desde un archivo ?- [ejemplo.pl]. Donde ejemplo.pl es el nombre de un archivo con los hechos y reglas a cargar. El prompt siempre est a la espera de consultas a responder. a Veremos con ejemplos las distintas formas de interaccin y o los conceptos fundamentales de PROLOG.
Hechos
Los hechos son el tipo bsico de oraciones de un prograa ma PROLOG. Supongamos que queremos modelar informacin genealgica acerca de un grupo de personas. Para esto o o utilizaremos los predicados o relaciones padre y madre sobre ciertas constantes. padre(juan, amanda). madre(ximena, amanda). madre(laura, juan). padre(andres, juan). padre(patricio, bonifacio). padre(juan, patricio). padre(juan, ana). madre(ximena, ana). Esto lo podemos ingresar haciendo ?|: |: |: [user]. padre(juan, amanda). madre(ximena, amanda). ....
o cargando desde un archivo ?- [genealogico.pl]. Los hechos anteriores representan un modelamiento del mundo en donde, por ejemplo Juan es el padre de Amanda. Algunas observaciones de sintaxis: los hechos son predicados instanciados en valores constantes, en nuestro caso juan y amanda son valores constantes. En PROLOG siempre las constantes comienzan con minscuu la, segn esto la oracin padre(Juan, Ana) no ser un hecho u o a de PROLOG ms adelante veremos qu signica. a e
5
Consultas
Dados los hechos agregados al interprete PROLOG, podemos hacer consultas como por ejemplo ?- madre(ximena,ana). Yes ?- padre(juan, ximena). No Los Yes y No son las respuestas que entrega PROLOG luego de presionar [enter]. Note que son consistentes con los hechos agregados. Consultas ms interesantes involucran el uso de variables (en a el sentido de la lgica LPOP que es distinta al de una variable o usual de un lenguaje de programacin). o Todas las variables en PROLOG comienzan con maysculas. u Cul puede ser el signicado de la siguiente consulta? a ?- padre(X, juan). En la anterior consulta X representa a una variable y juan a un valor constante. Cuando aparece una variable en una consulta, PROLOG la interpreta cmo una pregunta existencial, o sea ser equivao a lente a la consulta en LPOP X padre(X, juan)? Entonces la respuesta de PROLOG debiera ser Yes segn u nuestros hechos, pero la respuesta va ms all... a a ?- padre(X, juan). X = andres
Consultas (cont.)
La respuesta fue X = andres porque PROLOG determin que o si la variable X se reemplazaba por el valor constante andres la consulta era verdadera a partir de los hechos. En este caso PROLOG responde ms que slo Yes o No. a o En el ejemplo anterior despus de responder X = andres PROe LOG espera una accin del usuario, este puede preionar [enter] o o digitar ; obteniendo las siguientes respuestas: ?- padre(X, juan). X = andres Yes si presiona [enter], o ?- padre(X, juan). X = andres; No si digita ;. Para responder consultas PROLOG realiza un proceso de bsqueda entre los valores constantes y los predicados. u Si digitamos ; se le pide a PROLOG que siga buscando, si en el proceso de bsqueda PROLOG no encuentra un valor u constante para satisfacer la consulta la respuesta nal es No, por ejemplo ?- madre(ximena, X). X = amanda; X = ana; No
Consultas (cont.)
Tambin se pueden hacer consultas que involucren ms de e a una variable. ?- madre(X,Y). X = ximena, Y = amanda Yes Del mundo modelado por nuestros hechos es fcilmente dea ducible que el abuelo paterno de Ana es Andrs. cmo e o podemos consultar esto en PROLOG? Primero, sabemos que Andrs es el abuelo paterno de Ana e porque entre nuestros hechos existen los hechos padre(andres,juan). padre(juan,ana). La consulta a PROLOG debiramos hacerla pensando en pree guntar si existe un abuelo paterno para ana, dado que si esto efectivamente ocurre PROLOG responder Yes y adems ena a tregar la constante que hace verdadera la consulta. a Si lo miramos en LPOP la consulta debiera ser algo como Z(X(padre(Z, X) padre(X, ana)))? En PROLOG se sigue exactamente la misma idea: ?- padre(Z,X), padre(X,ana). Z = andres X = juan Yes En PROLOG el s mbolo , representa al conector de conjuncin lgico . o o Si no nos interesa el valor de X podemos usar la variable X.
8
Reglas
Las reglas en PROLOG son oraciones que nos permiten deducir informacin. o Su correspondencia en LPOP son las clusulas de Horn a denitivas. En nuestro primer ejemplo de LPOP ten amos 1. X(hom(X) mor(X)) 2. hom(socrates). La oracin 2 puede representarse por hom(socrates), y 1? o Un tipo especial de oracin en PROLOG son las reglas que o sirven para representar consecuencia lgica. o En PROLOG se usan los caracteres :- en correspondencia con el lgico. o La regla mor(X) :- hom(X). es la representacin en PROLOG de 1. o PROLOG impl citamente supone cuanticacin universal () o en todas las variables utilizadas en una regla particular As si ingresamos el programa PROLOG , hom(socrates). mor(X) :- hom(X). obtenemos respuestas como ?- mor(socrates). Yes
La regla anterior se podr haber denido tambin como a e abuelo(X,Y) :- padre(X,Z), (padre(Z,Y); madre(Z,Y)). El s mbolo ; representa la disyuncin , el o lgico. o o Ejercicio: dena la relacin herm(X,Y) para representar que X o e Y son hermanos.
10
Predicados Recursivos
Las reglas tambin pueden ser recursivas... tendrn la forma e a de una denicin recursiva usual de matemticas. o a Queremos denir la relacin ancestro(X,Y) con el sentido geo nealgico usual. o Para esto denimos un predicado para la relacin ancestroDirecto. o ancestroDirecto(X,Y) :- (padre(X,Y); madre(X,Y)). que representa el caso base de la denicin recursiva. o Luego denimos la relacin ancestro a parir del caso base y o una recursin: o ancestro(X,Y):- ancestroDirecto(X,Y). ancestro(X,Y):- ancestroDirecto(X,Z), ancestro(Z,Y). As obtenemos ?- ancestro(X,Y). X = juan, Y = amanda ; ...... X = andres, Y = juan ;
Ejercicio: modele un grafo dirigido usando constantes para los nodos (u,v, etc.) y un predicado e(U,V) para indicar las aristas. Un grafo particular resultar de los hechos que agrea gue a PROLOG.
Dena un predicado camino(U,V) para determinar si existe un camino dirigido entre dos nodos U y V. Dena un predicado ciclo(U) para determinar si en el grafo hay un ciclo dirigido que contenga al nodo U. Puede denir un predicado ciclo (sin argumentos)? Y un predicado caminoNoDirigido(U,V) para determinar si existe un camino entre U y V que no toma en cuenta la direccin o de las aristas?
11
Sintaxis y Semntica a
Los elemntos sintcticos bsicos de un programa PROLOG e a a son constantes, variables, functores y predicados. Los predicados son los elementos ms importantes y ha sido a el centro de nuestra discusin anterior. Cada predicado tiene o cierta aridad (cantidad de argumentos). Si el predicado p tiene aridad m escribiremos p/m. A cada predicado en PROLOG se le asocia un valor de verdad Yes o No. Las constantes pueden ser:
S mbolos que comienzan con letra minscula, por ej. x, y, u abc, etc., s mbolos encerrados en comillas simples, por ej. X, 5, x23, a, etc. Nmeros: enteros y/o reales, por ej. 4, 4.5, etc. u Caracteres y textos (strings): Los caracteres y los strings se encierran entre comillas dobles, por ej. "f", "fam", etc.
Las variables son s mbolos que comienzan con maysculas o u un underscore, por ej. X, x23, etc. La variable representada por el s mbolo es especial, ya veremos su signicado. Los functores representan a funciones, son similares sintctia camente a los predicados con la diferencia de que a ellos se les asocia un objeto en vez de un valor de verdad (no se consulta por un functor). Si f es un functor y m es su aridad escribiremos f/m. Veremos que los functores nos sirven por ejemplo para crear estructuras de datos en PROLOG. Estos tres ltimos tipos de elementos se llaman trminos. u e Diremos que un literal es un elemento de la forma p(t1,t2,...,tm) donde p/m es un predicado y cada ti es un trmino. e
12
Programas y Consultas
Un programa PROLOG est compuesto por un conjunto de a reglas de la forma l0 :- l1, l2, ..., ln. donde cada li es un literal. Los hechos pueden verse como reglas donde slo existe el o literal de ms a la izquierda (l0:-. o simplemente l0.). a Por ejemplo un programa ser a: padre(juan, amanda). padre(andres, juan). abuelo(X,Y) :- padre(X,Z), padre(Z,Y). bisabuelo(X,Y) :- abuelo(X,Z), padre(Z,Y). Una consulta PROLOG es simplemente una conjuncin de o literales (literales separados por comas) g1, g2, ..., gm. Los literales que aparecen en la consulta se llaman objetivos El interprete de PROLOG recibe como entrada un programa ms una consulta. La salida ser Yes si a partir del prograa a ma fue posible demostrar la consulta haciendo verdadero simultneamente todos sus objetivos, y No en el caso contrario. a Al demostrar un objetivo el interprete usa los conceptos de sustitucin y unicacin. o o
13
Sustitucin y Unicacin o o
Una sustitucin es simplemente un mapeo entre variables y o trminos, por ejemplo e
{X = juan, Y = amanda}
es una sustitucin. o Dada una sustitucin esta puede ser aplicada a un literal. Si o l es un literal y una sustitucin diremos que l es el literal o que resulta de l al cambiar sus variables segn el mapeo u indicado por , por ejemplo: padre(X,Y){X = juan, Y = amanda} corresponde al trmino e padre(juan,amanda) Se dice que una sustitucin unica a dos literales l1 y l2 si o ocurre que l1 es igual caracter a caracter a l2 (a veces usaremos para referirnos a esta igualdad). Por ejemplo, los literales padre(X,ana) y padre(juan,Y) son unicados por la sustitucin {X = juan, Y = ana} ya que o padre(X,ana){X = juan, Y = ana} y padre(juan,Y){X = juan, Y = ana} resultan ambos ser padre(juan, ana). En algunos casos hay ms de una sustitucin que unica a a o un par de literales, ej. padre(X,ana) y padre(Y,Z) Cul podr ser el unicador para el par de literales padre(X,ana) a a y padre(Y,X)? Hay ms de uno? Y para el par padre(X,ana) a y padre(Y,juan)?
14
15
y la consulta ?- oscuro(X),grande(X). el interprete ejecutar a la siguiente secuencia: 1: 2: 3: 4: 5: 4: 5: oscuro(X), grande(X) negro(X), grande(X) grande(gato) negro(X), grande(X) oscuro(X), grande(X) cafe(X), grande(X) grande(oso) (reg.7) (X = gato reg.5) (Falla, back-track 2) (Falla, back-track 1) (reg. 8) (X = oso reg.4) (reg.1) (Yes, lista vac a)
Si tenemos en cambio el programa padre(juan, ramon). padre(ramon, jorge). ancestro(X,Y) :- ancestro(X,Z), padre(Z,Y). ancestro(X,Y) :- padre(X,Y). obtenemos el siguiente resultado al preguntar por los ancestros de Jorge: ?- ancestro(X,jorge). ERROR: Out of local stack Cul es el problema? a
17
nil es una lista y corresponde a la lista vac a. Si l es una lista y a es una constante entonces, a seguida de l es tambin una lista. e
Si la idea de a seguida de l la capturamos por el functor seg(a,l) nuestra denicin de lista resulta: o lista(nil). lista(seg(X,L)) :- lista(L). as por ejemplo: ?- lista(seg(a,seg(b,seg(c,(seg(d,nil)))))). Yes Podemos denir algunos predicados sobre listas, por ejemplo el predicado primero/2, que se satisface cuando el primer argumento es el primer elemento de la lista en el segundo argumento. primero(X,L) :- L = seg(X,L2). Ntese como se us la unicacin. En este caso la variable o o o L2 no nos interesa para nada por lo que podemos usar primero(X,L) :- L = seg(X,_). Otra cosa importante es que lo nico que hacemos con L u unicarla por lo que podemos simplemente reemplazarla para obtener primero(X,seg(X,_)). que es la versin ms pequea del predicado primero/2. Ahora o a n podemos hacer:
18
?- primero(X, seg(a,seg(b,seg(c,(seg(d,nil)))))). X = a Yes Podemos denir el predicado ultimo/2 con el signicado evidente ultimo(X,seg(X,nil)). ultimo(X,seg(_,L)) :- ultimo(X,L). as por ejemplo: ?- ultimo(X, seg(a,seg(b,seg(c,(seg(d,nil)))))). X = d Yes Note que en esta denicin se ve claramente la recursividad, o una denicin base ms una regla denida en funcin del o a o mismo predicado. Es claro que en los dos ejemplos anteriores los predicados se pueden utilizar como operaciones sobre listas para obtener el primer y ltimo elemento de ellas. u Ejercicio: Qu tan ecientes son las operaciones anteriores e con respecto a la cantidad de elementos de las listas? (la eciencia est dada por la cantidad de pasos del backtraking a usado para responder). Ejercicio: dena predicados segundo/2 que se satisfaga cuando el primer argumento sea el segundo elemento de la lista en el segundo argumento, y penultimo/2 que se satisfaga cuando el primer argumento sea el penltimo elemento de la lista en u el segundo argumento.
Listas en PROLOG
Las listas son elementos bsicos del lenguaje PROLOG y se a encuentran predenidas. En esta denicin, la lista vac se denota como [] y nuestro o a functor seg corresponde al operador . (punto). As por ejemplo nuestros predicados primero/2 y ultimo/2 pueden denirse como primero(X,.(X,_)). ultimo(X,.(X,[])). ultimo(X,.(_,L)) :- ultimo(X,L). Para simplicar la lectura y creacin de listas PROLOG deo ne nuevas formas, por ejemplo la lista .(a,.(b,.(c,.(d,[])))) es equivalente a [a,b,c,d], que tambin puede escribirse como e [a|[b,c,d]] o [a,b|[c,d]]. Algunas otras equivalencias: .(a,[]) .(a,.(b,[])) .(a,X) .(a,.(b,X)) [a|[]] [a|[b|[]]] [a|X] [a|[b|X]] [a] [a,b] [a|X] [a,b|X]
Hay que tener cuidado al trabajar con el operador |, la lista [a|L] es totalmente diferente a la lista [a,L] por qu? e Con esta notacin nuestros predicados se pueden implemeno tar como primero(X,[X|_]). ultimo(X,[X])). ultimo(X,[_|L]) :- ultimo(X,L).
19
20
21
22
=:= y =\= que permiten comparar dos valores numricos. El e primero es verdadero si los valores son iguales, y el segundo si son diferentes. <, >, =< y >=, que corresponden a comparaciones usuales.
Las expresiones aritmticas se forman de la manera usual e utilizando parntesis y operadores +, -, *, mod, / y // correse pondiendo estos ltimos a la divisin de punto otante y u o entera, respectivamente.
23
24