Practicas prolog2011 listas

20
Manejo de Manejo de Listas en Listas en Prolog Prolog Inteligencia Artificial Esp. Leonardo Bernal Zamora

description

Listas en Prolog

Transcript of Practicas prolog2011 listas

Page 1: Practicas prolog2011 listas

Manejo de Listas Manejo de Listas en Prologen Prolog

Inteligencia Artificial

Esp. Leonardo Bernal Zamora

Page 2: Practicas prolog2011 listas

• LISTAS.• Una lista en PROLOG es un conjunto de nombres de objetos,

o átomos, separados por comas y encerrados en paréntesis cuadrados.

• [member1,member2,...,memberN]

• Los miembros de una lista deben ser nombres válidos de objetos, pero todos los miembros deben ser declaraciones de un mismo dominio.

Ejemplo:• ["Maria","Ana","Juan"]• [33,25.51,20,10,7]• [a,b,c,d,e,f,g]

Page 3: Practicas prolog2011 listas

• La lista puede ser vista, como un objeto don dos partes: [Cabeza|Cola]– La cabeza de la lista, conformada por el

primer elemento.– La cola, es la parte restante de la lista.

• En el ejemplo, la cabeza es a, mientras que la cola de la lista es [b,c,d,e,f,g,].

Page 4: Practicas prolog2011 listas

ELEMENTOS DE UNA LISTA• El siguiente código es para saber si un elemento se encuentra dentro de una

lista y/o para sacar a la cabecera de la lista. Elemento (X,R). es verdadero si X es una lista y R es elemento de esa lista.

elemento([X|R],X). %A esto se le llama el caso base.elemento([X|R],Y):-elemento(R,Y).

| ?- elemento(["Mouse","Video","Parlantes","web Cam"],"Mouse").yes| ?- elemento(["Mouse","Video","Parlantes","web Cam"],"Ram").no

Page 5: Practicas prolog2011 listas

ARIDAD DE UNA LISTA

• Aridad es el numero de elementos de una lista.

aridad([ ],0). %Caso basearidad([X|R],N):-aridad(R,Z),N is Z+1.

:?-aridad([a,b,c,d,e],N).N=5.

| ?- elemento([a,e,i,o,u],X).X = a ;X = e ;X = i ;X = o ;X = u ;no

Page 6: Practicas prolog2011 listas

ANÁLISIS DEL EJEMPLO ANTERIOR.Nivel 1.- X=a, R=[b,c,d,e], N=Naridad([ ],0). %Aquí tenemos una lista vacía, así que continua a la siguiente línea.aridad([X|R],N):-aridad(R,Z),N is Z+1.Aquí todo coincide, pues son variables, así que pasa a la primera acción, que es volver a empezar pero sin el primer elemento de la lista y así hasta llegar a la e.Nivel 2.- X=b, R=[c,d,e], N=NNivel 3.- X=c, R=[d,e], N=NNivel 4.- X=d, R=[e], N=NNivel 5.- X=e, R=[ ], N=N

ARIDAD DE UNA LISTA

Page 7: Practicas prolog2011 listas

En este nivel vemos que la lista vacía y la variable N coincidirán con el caso base, así que se dará por terminada la acción aridad(R,Z) por lo que se continuara con la segunda acción del Nivel 5, N is Z+1

Nivel 5.- N=1

Al terminar con esto, terminara con el nivel 4 y continuara con la segundaacción del nivel anterior.

Nivel 4.- N=2Nivel 3.- N=3Nivel 2.- N=4Nivel 1.- N=5

N=5.

ARIDAD DE UNA LISTA

Page 8: Practicas prolog2011 listas

CONCATENAR LISTASConcatenar no es más que unir dos elementos o listas. Lo cual se podría decir que es unir 2 listas, pues una lista puede contener solo un elemento. De esto concluimos que concatenar es unir la lista L1 y L2 en una lista L3.

conc([ ],L2,L2).conc([X|R],L2,[X|Z]):-conc(R,L2,Z).

| ?- conc([a,b,c,d,e],[1,2,3],R).

R = [a,b,c,d,e,1,2,3]

?- conc(['Universidad', 'de', 'Boyaca'],['Inteligencia', 'Artificial'],R).

R = ['Universidad',de,'Boyaca','Inteligencia','Artificial']

Nota: cambiar las comillas sencillas por comillas dobles

Page 9: Practicas prolog2011 listas

INVERSO DE UNA LISTAinverso([ ],[ ]).inverso([X],[X]).inverso([X,Y],[Y,X]).inverso([X|R],E):-inverso(R,Z),conc(Z,[X],E).

| ?- inverso([a,b,c],L).

L = [c,b,a] ;

| ?- inverso(['Universidad', 'de', 'Boyaca','Inteligencia', 'Artificial'],R).

R = ['Artificial','Inteligencia','Boyaca',de,'Universidad'] ;

Si tenemos L=[a,b,c], su inverso es Li=[c,b,a].

Page 10: Practicas prolog2011 listas

duplicar([ ],[ ]).duplicar([C|L1],[C,C|L2]):-duplicar(L1,L2).

DUPLICAR UNA LISTALx=[1,2,3] Ly=[1,1,2,2,3,3]

| ?- duplicar([a,b],R).R = [a,a,b,b]

eliminar EL ÚLTIMO ELEMENTO DE LA LISTAL1=[a,b,c,d] Lq=[a,b,c]

Page 11: Practicas prolog2011 listas

ANÁLISIS DEL EJEMPLO ANTERIOR.Nivel 1.- C=a, P1=[b,c,d], eliminar([b,c,d],X)Nivel 2.- C=b, P1=[c,d], eliminar([c,d],X)Nivel 3.- C=c, P1=[d], eliminar([d],X)De regreso:Nivel 3.- X=[a]Nivel 2.- X=[a,b]Nivel 1.- X=[a,b,c]

ELIMINAR EL ÚLTIMO ELEMENTO DE LA LISTAL1=[a,b,c,d] Lq=[a,b,c]

eliminar([A],[ ]).eliminar([C|P1],[C|P2]):-eliminar(P1,P2).

?-eliminar([2,0,1,2],X).X=[2,0,1]

?-eliminar([a],X).X=[a]

Page 12: Practicas prolog2011 listas

BORRAR UN ELEMENTO CUALQUIERA DE UNA LISTA

borrar (X,Y,Z). es verdadero si X es un elemento de la lista Y, y Z es la lista Y sin el elemento X.

borrar(X,[ ],[ ]).borrar(X,[X|R],L):- borrar(X,R,L).borrar(X,[Y|R],[Y|L]):-X\=Y,borrar(X,R,L).

| ?- borrar(a,[b,d,a,c,f],L).L = [b,d,c,f] ;

\= corresponde a diferente

Page 13: Practicas prolog2011 listas

MÁXIMO DE UNA LISTA DE NÚMEROSmax_lista([X],X).max_lista([X1,X2|L],Y):- X3 is max(X1,X2), max_lista([X3|L],Y).

| ?- max_lista([1,2,50,800,9,89],L).L = 800 ;

Ejercicios propuestos:Ejercicios propuestos:•Sumar los elementos de una lista.Sumar los elementos de una lista.•Ordenar una listaOrdenar una lista•Generar una lista desde N hasta M Generar una lista desde N hasta M

Page 14: Practicas prolog2011 listas

Aplicación de ListasFuente: http://www.cs.us.es/~jalonso/publicaciones/

Page 15: Practicas prolog2011 listas

Ver Fuente http://www.cs.us.es/~jalonso/publicaciones/2006-ej_prog_declarativa.pdf

Page 16: Practicas prolog2011 listas
Page 17: Practicas prolog2011 listas
Page 18: Practicas prolog2011 listas
Page 19: Practicas prolog2011 listas
Page 20: Practicas prolog2011 listas

Link de Interés

• http://fcqi.tij.uabc.mx/docentes/ardiaz/material/manual_lab_prolog.pdf

• Ejercicios de programación declarativa con Prolog - http://www.cs.us.es/~jalonso/ José A. Alonso Jiménez