You are on page 1of 6

Agenda

Lenguajes Formales y
Autómatas
Introducción a PROLOG

2º cuatrimestre de 2007
Departamento de Cs. e Ing. De la computación
Universidad Nacional del Sur

► PROLOG
► Hechos

y Reglas (reglas recursivas)
se hace con un programa Prolog: Consultas
► Intérprete Prolog: SWI-PROLOG
► Variables, unificación, is/2
► Datos: constantes (átomos, números), estructuras,
variables
► Listas
► Negación por falla (diferencia con negación lógica)
► ...
► Qué

PROLOG
► Lenguaje

Cómo es un programa Prolog

para programación/computación

simbólica
► Adecuado para la resolución de problemas que
involucra objetos y relaciones entre objetos

► Un

programa Prolog está conformado por cláusulas o
reglas.
► Las cláusulas o reglas tienen la siguiente forma
<Cabeza> :- <Cuerpo>
El cuerpo de la regla puede ser vacío, en cuyo caso se dice
que la regla es un Hecho.
► Al

cuerpo de una regla se lo denomina antecedente, y
a la cabeza conclusión
► Una regla se puede leer informalmente como: 
Si se verifica el antecedente entonces vale la conclusión 
Ejemplo: si llueve entonces está nublado

nublado :- llueve

Qué dice el programa

Ejemplo de un programa Prolog
profesor(ana).
profesor(guillermo).
profesor(alejandro).
asistente(sergio).
asistente(jessica).
ayudante(guadalupe).
ayudante(sebastian).
ayudante(nicolas).
recibido(sebastian).
recibido(nicolas).

profesor(pedro).
► si el término pedro lo utilizamos para
hechos

docente(X):- profesor(X).
docente(X):- asistente(X).
docente(X):- ayudante(X).

reglas

representar a alguien que conocemos y que se
llama Pedro, y el predicado profesor(X) lo
usamos para expresar que X es profesor/a,
entonces el hecho está expresando que Pedro
es profesor.
► Idem asistente, ayudante, recibido.

Qué dice el programa
docente(X):- profesor(X).
► si el predicado docente(X) lo utilizamos
para representar que X es docente, y como
antes el predicado profesor(X) lo usamos
para expresar que X es profesor/a, entonces,
la regla está diciendo que
Si X es profesor entonces X es docente.
profesor(X)  docente(X)

Varias reglas
docente(X):- profesor(X).
docente(X):- asistente(X).
docente(X):- ayudante(X).

Definimos docente(X) a través de tres reglas.
Estamos diciendo que X es docente si es
profesor, o si es asistente, o si es ayudante.
profesor(X) ∨ asistente(X) ∨ ayudante(X)  docente(X)

Cada una declara un “hecho” sobre la relación “parent” ► Podemos hacer consultas sobre lo que establece este programa parent(tom. si es ayudante y está recibido.arco(a.b).b). pat).arco(X.t(X). parent(tom. parent(pam. Consultas Prolog pam que tengo el siguiente programa PROLOG Hechos bob). Decimos que vale p(X) ∧ r(Y)  s(X.arco(c. no ¿llega algún arco hacia ‘b’ y algún arco hacia ‘a’ ? ?.p(X).p(X). bob). bob).Otra regla Resumiendo… ► Supongamos que definimos el concepto “ayudante A” a través de las siguientes reglas: p(1). Grafos y caminos ► Supongamos arco(a.c). q(1). parent(bob. no ¿hay un camino de ‘a’ hacia ‘d’? ?. s(X).d). parent(bob. ► Luego. ► Usaremos SWI-Prolog (http://www.Prolog programming for AI] D C Puedo estar interesado en averiguar cosas como: ¿hay un arco de ‘a’ hacia ‘c’? ¿hay un camino de ‘a’ hacia ‘d’? ¿hay un arco saliente desde ‘c’? ¿llega algún arco hacia ‘b’ y algún arco hacia ‘a’ ? ► Veamos estos ejemplos en un intérprete PROLOG. lo que se conoce de la situación.Y). parent(pam. arco(Y. r(X):.Z). parent(tom. recibido(X).Y):. bob).c).ayudante(X).arco(a.org/) Family tree parent(tom.arco(X. jim). pat). Estamos diciendo que X es ayudante categoría A. bob).r(Y). arco(d. bob). no tom A camino(X.swi-prolog. camino(X. escribo mi conocimiento sobre el dominio de algún problema que quiero modelar. jim). Decimos que vale t(X) ∨ (p(X) ∧ s(X))  r(X) s(X. liz).a).Y) ayudante(X) ∧ recibido(X)  ayudanteA(X) ¿Qué hago con un programa PROLOG? ► Cuando escribo un programa PROLOG. parent(pat.d). arco(b. r(X) :. y q(3). ► Escribo a través de reglas y hechos. parent(bob.X). q(3).Y):. parent(tom. arco(b. parent(pat. liz). B Intérprete PROLOG ¿hay un arco de ‘a’ hacia ‘c’? ?. parent(tom. ann). no ¿hay un arco saliente desde ‘c’? ?. ann).Y):. me va a interesar realizar consultas a ese programa (base de conocimiento) para ver si ciertas piezas de información “valen” según lo que expresé en mi programa.arco(X. ► Tenemos un programa de 6 cláusulas. camino(Z. parent(bob. . ► bob ann liz pat jim [Bratko. ayudanteA(X):.Y).c). q(1). Decimos que vale o es cierto p(1).

Para todo X e Y: Y es offspring (hijo) de X si X es parent (padre) de Y Reglas: P :. male( jim). X). jim).Z):. female( X).Y) :- X\=Y. predecessor(X. ¿Es padre tom de ben? ?.parent(Y. X = pat Cuerpo (condición) Más definiciones Más Hechos y Reglas female( female( female( female( :- grandparent(X.parent( X. ?.Z):- parent(X. ¿Quién es padre de liz? ?.Q Especifican que una conclusión P es cierta la condición Q se satisface P :. liz. parent(X. pat). Y).parent(X. pat). X). pat. parent( Y. ann). son átomos e identifican objetos fijos. ?.etc. different( X.female( X). Reglas Más consultas ¿Quiénes son los nietos de tom? ¿Tienen un mismo padre ann y pat? ¿Tiene hijos liz? offspring( Y.parent(X.parent(tom.parent( X.Y):- %ojo! parent( Z. pat). pat).Y).pat) :( Definición de ancestro o predecesor predecessor(X. % X es la madre de Y si X es padre de Y y X es % mujer % <.parent(liz.sister( X. male( tom). Consultas (2) ¿Encuentre un X y un Y tal que X sea padre de Y? ¿Es padre liz de pat? ?. Y). pat). . Y). parent( Z. ?. Y). En cambio. ?. Y). ¿Quiénes son los hijos de bob? ¿Quién es abuelo/a de jim? O dicho de otra forma: . Consultas ?. female( X). X). %caso gral.Y):- parent( Z.sister( X.para hacer comentarios :) sister/2 sister(X. liz). ?.pat). % sister(pat. liz).Z). yes ¿Cómo se obtiene esa respuesta? (pizarrón) %caso base .Quién es padre de Jim? Supongamos que es Y. Asumamos la definición de different/2 different(X. ?.Consultas (1) ¿Es padre bob de pat? ?. parent( Z. OBS: X es una variable.parent(bob.Y):- parent( Z.Quién es padre de ese Y? Supongamos que es X. X = ann. Otra definición de sister/2 sister(X. male( bob).parent( X. bob. Reglas recursivas parent( Z.Y). X).Z).parent(bob. predecessor(Y. Y). pat). mother( X.Z):- parent(X. Y).Z). ben). Y) :.sister( ann. sister(X. Y). female( X). X) :.Q Cabeza (conclusión) pam).predecessor(tom.

S). R is 2*3 is [1. ciao = chau. ni unificación ! La consulta o meta “T is E” es exitosa si T unifica con el resultado de la evaluación de la expresión numérica E Predicado de unificación: =/2 X = a.X). W = b. etc. 5 = 2+3.[X|Z]):. yes no no yes no Una variable INSTANCIADA… ya no se “desinstancia” Listas Son secuencias de elementos Predicado: is/2 2 2 R R W is 2+0 = 2+0 is 2*3 = 5.VARIABLES Empiezan con Mayúscula No se “declaran”.3] yes no yes no no Definiendo predicados sobre listas (cualquier término ► Longitud de una lista sintácticamente válido: ie. java. W = a. Casi cquier cosa!) Elementos entre corchetes “[”.[3.hola.Y. X Xs X Xs Y Y Z Ver interprete uso inverso .X.1. Variables e Instanciación ► Ver intérprete Son locales a la cláusula donde aparecen Pueden estar instanciadas o sin instanciar.0).[]]. [p(x).concatenar(Xs.Ns).CONSTANTES constantes objetos estructurados átomos: pam hola_mundo ‘Tom’ ‘Miss Jones’ simples variables constantes átomos números números Objetos. longitud([].a].Y. Una vez que se instancian completamente NO pierde más su INSTANCIACIÓN :) No puedo cambiarle el valor a una variable El concepto de variable es el mismo que en matemática o lógica. N is Ns+1. etc) is /2 Unificación (=) ¡ No es igualdad ! - ¡ No es asignación ! Una variable SIN INSTANCIAR…unifica con cualquier cosa ¡ No es ni igualdad.2. i. ► Concatenar dos listas concatenar([].simples.Z). ni asignación.b. concatenar([X|Xs].Datos Objetos.e NO ES la misma noción de variable (contenedor) de la programación imperativa (pascal. longitud([X|Xs].N):. “]” El término constante [ ] representa la lista vacía El término [X|Xs] representa la lista con cabeza X y cola Xs Ver ejemplos de matching en el intérprete Ejemplos de listas: [ ] . [a.q(R.longitud(Xs.chau].simples. Hola = Ciao.

P1=point(1. 2). no ?. a C5 b. tail(S)) Veamos cómo lo escribimos en PROLOG Negación por falla (not) menor(L. Menor).pertenece(Y. sort (x :: L) = insert (x. Los componentes pueden. pertenece(X. Lr) ultimoElemento( .L).B).2).X):. not(existeOtroMenor(L.p..append(As. abril. 2006) functor argumentos Obs: “un día cualquiera de abril de 2006”  fecha(D. 2) P2 = point(3.[X|Bs].X):- ?. yes √ Objetos. Y < Menor. S=segmento(P1. a : − e.4).Y):- not(Arg) Es exitoso (i.Menor):-menor(Ys. 2006) Más ejemplos: Prueba. de arriba para abajo. yes ?.B):. point(3. insert (x.p e C4 C3 e.e responde yes) cuando menor(Ys.Bs es L intersectan(A.M) de forma tal que sea exitoso si M es el menor elemento de la lista L ‘Arg’ no puede ser probado a:− − b. e. P2=point(3. sort (L)) . Ejemplos: fecha(4. b : − q. menor([Y|Ys]. p.M) ► Definamos menor(L. b:− − e. no Otros ejemplos Otra forma de definir menor minimo(L. e.L) reverso(L. P1 = point(1. Y\=X. : − a.L). C1 ?..not(p). 4) S = segmento(point(1.e.p C4 fail p fail pertenece(X. p. ¿Cómo funciona el intérprete PROLOG? Resolución y Backtracking C1) C2) C3) C4) C5) a : − b.abril. de izquierda a derecha 1 ?. Y<X. b : − e. 4)) . b:− − q.Menor).p C2 q.P2). a su vez.A).X).pertenece(X. menor([Y|Ys]. ► Dada una lista L. existeOtroMenor(L.L) X pertenece a L si existen As y Bs tales que As concatenado con X. A y B se intersectan si existe un X tal que X pertenezca a A y a B pertenece(X.Ejercicios ► Definir      InsertSort ► Algoritmo predicados visto en teoria Ordenamiento por inserción sort ([] ) = [] .ESTRUCTURADOS Son objetos con muchas componentes.L):. decimos que X es el menor o mínimo de L. cantidad_As(L. menor([X].not(e).X)). S) = if S = [] then [x] else if x ≤ head(S) then x :: S else head (S) :: insert(x.As) pertenece(X. si X pertenece a la lista y no existe otro elemento Y que pertence a L que sea distinto a X y que sea menor a X. ser estructurados.

Y) es una estructura distinta a punto(X. unifican solo si (1) S y T tienen el mismo functor principal y. (2) todos los componentes correspondientes (argumentos) unifican Observación: En Prolog la operación de matching resulta en la instanciación más general Fin . los objetos mencionados se denominan términos. A1).Z) Es un proceso que toma dos términos y chequea si coinciden o unifican.Y. Son términos las variables. entonces S y T unifican ssi son el mismo objeto (2) Si S es una variable y T es un término. punto(X. 1983) = fecha(D1. D = _G429 M = mayo D1 = _G429 A1 = 1983 . unifican si S se puede instanciarse a T (idem. Matching (3) Algoritmo de Matching (1) Si S y T son constantes.Términos Matching En Prolog. Viceversa) (3) Si S y T son estructuras. Matching (2) 1 ?. Un término estructurado se identifica por su functor/nombre y su aridad. a veces denominada unificación ya que se origina la noción de unificación conocida en lógica aunque no se exactamente lo mismo. Así. mayo. Si los términos no unifican el proceso falla. las constantes.fecha(D. Si los términos unifican el proceso es exitoso y se instancian las variables en ambos términos de forma tal que ambos términos sean idénticos. los objetos estructurados La operación más importante entre términos es la operación de matching. M.