You are on page 1of 10

2.

TratamientodelistasenPROLOG
CONTENIDO
2.1. 2.2. 2.3. 2.4. 2.5. ListasenPROLOG. EjemplosdesolucindeproblemasdelistasenPROLOG. ConstruccindeexpresionesaritmticasenPROLOG. ComparacindetrminosenPROLOG. ComparacindeexpresionesenPROLOG.

2.1.ListasenPROLOG
La lista es una estructura de datos simple, muy usada en la programacin no numrica.Unalistaesunasecuenciadeelementostalescomo: clara,tomas,jose,isabel La sintaxis de PROLOG para las listas consiste en englobar las secuencias de elementosentrecorchetes. [clara,tomas,jose,isabel] LarepresentacininternadelaslistasenPROLOGescon rbolesbinarios,donde laramadelaizquierdaeselprimerelementoocabezadelalistaylaramadela derechaeselrestoocoladelalista.Delaramaquecontieneelrestodelalista tambinsedistinguendosramas:lacabezaylacola.Yassucesivamentehastaque laramadeladerechacontengalalistavaca(representadopor[])

clara tomas jose isabel []

Decualquierformaconsideraremosdoscasosdelistas:Laslistasvacasylasno vacas.Enelprimercasoescribiremoslalistavacacomoun tomodePROLOG,

[].Yenelsegundocaso,lalistalaconsideraremos formadapordospartes;el primerelemento,alquellamaremoslacabezadelalista;yelrestodelalistaalque llamaremoslacoladelalista. En el ejemplo anterior, la cabeza ser clara y la cola [tomas,jose,isabel]. Aunquecomohemosvistoanteriormentenoesnecesario,engenerallaestructura listaserepresentaenPROLOGconelnombredepredicadoofuntor.. Ejemplo2.1 .(clara,.(tomas,.(jose,.(isabel,[])))) QuePROLOGrepresentarinternamentecomounrbol:

clara tomas jose isabel


[]

Elltimoelementosiempreeslalistavaca([]). Como en PROLOG el manejo de listas es muy usual, se utiliza la notacin simplificadaconcorchetes,queesequivalentealaanterior([clara,tomas,jose, isabel]).InteriormentePROLOGlointerpretarconlanotacinrbol. Loselementosdeunalistapuedenserdecualquiertipo,inclusootralista. Ejemplo2.2 [ana, [maria, juan], agustin] PROLOGrepresentarinternamentecomounrbol:

ana


[] agustin []

maria juan

Lacabezaylacoladeunalistasepuedensepararconelsmbolo|.

Ejemplo2.3 Lassiguientessonexpresionesvlidassobrelistasyserefierenalamismalista: [a,b,c] [a|[b,c]] [a,b|[c]] [a,b,c|[]] [a|X],[Y|[b,c]]

Elordendeloselementosenlalistaimportayunelementosepuederepetirenuna lista,deformasimilaracomoocurreenlastuplasyparesordenados.

2.2.EjemplosdesolucindeproblemasdelistasenPROLOG
LaprcticaenelmanejodelistasconPROLOGesbsicaparaelaprendizajedel lenguaje.Eseeselobjetivodeestecaptulo. Para resolver un problema de listas con PROLOG, primero pondremos varios ejemplosdesufuncionamiento,paradeterminarlosargumentosquesonnecesarios enladefinicindelarelacinylarespuestadePROLOGendistintoscasos,que nosindicarelcomportamientodeseadodelaclusula. Ejemplo2.4 Supongamosquequeremosdeterminarsiunelementoesmiembrodeunalista.Los siguientesseranejemplosdelfuncionamientodelarelacinmiembro. miembro(b,[a,b,c]). %PROLOGresponderas. miembro(b,[a,[b,c]]). %PROLOGresponderano. miembro([b,c],[a,[b,c]]). %PROLOGresponderas. Elsmbolo%permiteponercomentariosqueocupenslolalneadondeaparece dichosmbolo.Paracomentariosmslargossepuedeutilizarlossmbolos/*para empezary*/paraterminar. Lasiguientepodraserunadefinicindelarelacinmiembro: miembro(X,[X|_]). miembro(X,[_|R]):-miembro(X,R). El elemento ser miembro de la lista si coincide con la cabeza de la lista (independientementedeloquecontengaelrestodelalista,poresoponemosuna variableannimaensulugar).EnestecasoelpredicadoserciertoyPROLOGno comprobarnadams.Sinoesas,podrsermiembrosiloesdelrestodelalista, enlallamadarecursivadelasegundadefinicindelpredicado.Lacabezadelalista esunavariableannima,porquecuandovayaacomprobarestasegundaregla,es seguroquelaprimeranosecumple(esdecir,elelementonocoincideconlacabeza

delalista),yaquePROLOGbuscalaclusulaenelordendeaparicinenlabase dedatos. Ejemplo2.5 Suponemos que queremos concatenar dos listas y devolver el resultado en una terceralista,esdecir: concatenar([a,b,c],[d,e],[a,b,c,d,e]).%PROLOGresponderaques. concatenar([a,b],[1,2,3],X).%PROLOGresponderaX=[a,b,1,2,3]. Solucin concatenar ([],L,L). concatenar ([X|L1],L2,[X|L3]):- concatenar (L1,L2,L3). Lalistaresultanteseconstruye(osecomprueba)enlacabezadelareglarecursiva. Enlareglaquecorrespondealasalidadelarecursividadseinicializaelargumento resultadoalalistaqueapareceenelsegundoargumento. Ejercicio 2.1 Utilizarladefinicindeconcatenacinpara: a) Descomponer una lista en dos, obteniendo todas las posibles descomposiciones. b)Borraralgunoselementosdeunalista. Por ejemplo: considera la lista L1=[a,b,c,d,z,z,e,z,z,z,f,g] y borra todos los elementosquesiguenalasecuenciaz,z,z. c)Borrarlostresltimoselementosdeunalista. d)Definirdenuevolaoperacinmiembro. e)Definirlarelacinparaextraerelltimoelementodelalista e.1)Utilizandoladefinicindeconcatenacin. e.2)Sinutilizarla. Ejercicio 2.2 Borrarunelementodeunalista. Ejercicio 2.3 Aadirunelementoenunalista. Ejercicio 2.4 Comprobarsidoselementossonconsecutivosenunalista.

Ejemplo2.6 Calcularlainversadeunalista. Ejemplodeutilizacin: inversa([a,b,c,d],[d,c,b,a]).%PROLOGdevolveras. Solucin1: inversa([],[]). inversa([X|L1],L):inversa(L1,Resto), concatenar(Resto,[X],L). Solucin2: inversa(L1,L):- inversa (L1,[],L). inversa([],L,L). inversa([X|L1],L2,L3):- inversa(L1,[X|L2],L3). /*Paralasdosltimasreglasesindistintoelorden,porqueslounadelasdosser ciertacadavez*/ Enestasegundaversin,seutilizaotropredicadoinversa/3(dearidad3,yportanto distintoalpredicadoinversa/2),endondeelsegundoargumentoseinicializaalista vaca.Enestaversinlalistaseconstruye(osecomprueba)enelcuerpodelaregla delasegundareglainversa/3(alcontrariodecomosucedaenladefinicindel ejemplo 2.3). Para estos casos, la salida de la recursividad deber realizar un volcadodelalistaconstruidaenelsegundoargumentoenlalistaresultante,que apareceenestecasoeneltercerargumento.Deestamaneraelresultadoquedar almacenado en la lista resultante ya que el resultado obtenido en el segundo argumentoseirperdiendoamedidaquesecierrelarecursividad. Muchasveces,paraunmismoproblema,sepuedenplantearambasversiones,la versinqueconstruyeocompruebaenlacabezadelareglarecursivaylaversin queconstruyeocompruebaenelcuerpodelaregla.Laprimerasolucinesms elegante. La segunda solucin, sin embargo, puede resultar ms fcil para programadores de lenguajes procedurales, ya que la lista se construye manualmente, desde la lista vaca. Es interesante conocer ambas formas de resolverloparapoderelegirlamsconvenienteacadaproblema. Ejercicio 2.5 Comprobarsiunalistaesunpalndromo. Ejercicio 2.6 Escribirunconjuntodeclusulasqueresuelvanlassiguientesoperacionessobre conjuntos: a)Subconjunto. Ejemplo1:?subconjunto([b,c],[a,c,d,b]).%Elresultadoseraverdadero
(Unpalndromoesunapalabraqueseleeigualdeizquierdaaderechaquedederechaaizquierda)

Ejemplo2:?subconjunto([a,c,d,b],[b,c])./*Elresultadoseraverdadero,perose obtendra con un conjunto de clusulas distintas a las de la solucin para el ejemplo1.Probadaescribirelconjuntodeclusulasnecesariasparaelcasodel ejemplo1yparaelcasodelejemplo2.*/ b)Disjuntos. Ejemplo:?disjuntos([a,b,d],[m,n,o]).%Elresultadoseraverdadero Ejercicio 2.7 Definirdospredicados: par(Lista),impar(Lista) que sern verdaderos si Lista tiene un nmero par e impar de elementos, respectivamente. Ejercicio 2.8 Definirlarelacin shift(L1,L2) talqueL2eslalistaL1despusdeunarotacindeunelementoalaizquierda. Ejemplo:?shift([a,b,c,d],L),shift(L,L1). Dacomoresultado: L=[b,c,d,a] L1=[c,d,a,b] Ejercicio 2.9 Definirlarelacin trasladar(L1,L2) que permita trasladar una lista de nmeros (L1) a una lista de sus correspondientesnombres(L2). Ejemplo:?trasladar([1,2,3,7],[uno,dos,tres,siete]).%Elresultadoseraveradero Utilizalasiguienterelacinauxiliar: significa(0,cero). significa(1,uno). significa(2,dos). etc. Ejercicio 2.10 Calcularlaspermutacionesdeunalista. Ejemplo: ?permutacion([a,b,c,],P).

P=[a,b,c]; P=[a,c,b]; P=[b,a,c];


X

L
permutar L L1 insertar X en cualquier posicin

Pista:parainsertarencualquierposicinsepuedeutilizarelpredicadoborrar. Si queremos contar los elementos de una lista en PROLOG, necesitamos operadoresparasumar.LossiguientessonnombresdepredicadosenPROLOGque son predefinidos (ya estn definidos, slo hay que utilizarlos) con un comportamientodistintodelexplicadohastaahorayquecomoefectocolateralnos permitirnsumar,etc.

2.3.ConstruccindeexpresionesaritmticasenPROLOG
Acontinuacinsemuestranlosoperadoresquesepuedenutilizarparaconstruir expresiones: X+Y XY X*Y X/YXdivY XmodY X^Y X abs(X) acos(X) asen(X) atan(X) cos(X) exp(X) ln(X) log(X) sin(X) sqrt(X) tan(X) round(X,N) /*suma*/ /*resta*/ /*multiplicacin*/ /*divisinrealyentera*/ /*restodeladivisindeXentreY*/ /*XelevadoaY*/ /*negacin*/ /*valorabsolutodeX*/ /*arcocosenodeX*/ /*arcosenodeX*/ /*arcotangentedeX*/ /*cosenodeX*/ /*exponencialdeX;[eX]*/ /*logaritmoneperianodeX*/ /*logaritmoenbase2deX*/ /*senodeX*/ /*razcuadradadeX*/ /*tangentedeX*/ /*redondeodelrealXconNdecimales*/

2.4.ComparacindetrminosenPROLOG.
Los siguientes operadores son los que permiten comparar trminos (vase el apartado1.5paraunrepasodelconceptodetrmino): X<Y X>Y X=<Y X>=Y X=Y X\=Y /*XesmenorqueY*/ /*XesmayorqueY*/ /*XesmenoroigualqueY*/ /*XesmayoroigualqueY*/ /*XesigualqueY*/ /XesdistintoqueY*/

2.5.ComparacindeexpresionesenPROLOG.
Unaexpresinesunconjuntodetminosunidosporoperadoresaritmticos(los introducidosenelapartado2.3).Lossiguientespredicadospredefinidoscomparan expresiones sin evaluarlas, mediante una comparacin sintctica siguiendo el siguienteorden: variables, enterosyreales, tomosenordenalfabtico, trminoscomplejos:aridad,nombreyordensegnladefinicinrecursiva. X==Y X\==Y X@<Y X@>Y X@=<Y X@>=Y /*laexpresinXesigualquelaexpresinY*/ /*laexpresinXesdistintaquelaexpresinY*/ /*laexpresinXesmenorquelaexpresinY*/ /*laexpresinXesmayorquelaexpresinY*/ /*laexpresinXesmenoroigualquelaexpresinY*/ /*laexpresinXesmayoroigualquelaexpresinY*/

Elsiguienteoperadorpermiteevaluarexpresiones: XisY Ejemplo2.7 X is 3*5+3/2 /*PROLOGcontestaraX=9*/

Paraobtenerunresultadoequivalentealoqueenloslenguajesproceduralesesla asignacin,enPROLOGusaremoselpredicadoisparainstanciarlavariableque aparecealaizquierdaaunvalorconcretooalresultadodelaevaluacindeuna expresinqueaparecealaderecha.Sinembargo,esaasignacinslopodr ser satisfechasilavariablequeaparecealaizquierdadelisnoest instanciada,en casocontrariolaoperacinfallar.Esdecir,enPROLOGnosepuedecambiarel valordeunavariablesindesistanciarlamediantebacktracking.

Lossiguientespredicadospredefinidoscomparantrminoshaciendounaevaluacin deexpresiones: X=:=Y X=\=Y /*ElresultadodeevaluarlaexpresinXesigualalresultado deevaluarlaexpresinY*/ /* El resultado de evaluar la expresin X es distinto al resultadodeevaluarlaexpresinY*/

Ejemplo2.8 EscribirunpredicadoPROLOGparadeterminarlalongituddeunalista. Ejemplo:?-longitud([a,b,c,d,e],5). Solucin: longitud([],0). longitud([_|Resto],N):longitud(Resto,N1), N is N1+1. Para la siguiente consulta al anterior predicado ?longitud([e,w,f,v],X)., las variablesNyN1notendrnningnvalorhastaqueseaninicializadasenlasalida de la recursividad, cuando la lista est vaca. A partir de ese momento, se contabilizar lalongituddelalistaenelcierredelarecursividad.Paraunamejor comprensin del funcionamiento del PROLOG es aconsejable ejecutar los programaspasoapaso,entendiendocadaunodelospasos. Ejercicio 2.11 a)EscribirunpredicadoPROLOGparaquedadaunalistadenmeros,determine elnmerodeelementospositivos(el0seconsideracomopositivo)yelnmero deelementosnegativos. Ejemplo:?pos_y_neg([3,1,9,0,3,5,8],3,4).%PROLOGresponderas. b)EscribirunpredicadoPROLOGparaquedadaunalistadenmeros,construya dos listas, una de nmeros positivos y otra de negativos y que determine la cardinalidaddeambaslistas. Ejemplos: ?pos_y_neg([3,1,9,0,3,5,8],3,[3,9,0],4,[1,3,5,8]).%PROLOGrespondera s. ?pos_y_neg([3,1,9,0,3,5,8],Npos,Pos,Nneg,Neg)./*PROLOGrespondera: Npos=3,Pos=[3,9,0],Nneg=4,Neg=[1,3,5,8]*/ Ejercicio 2.12 Dada una lista, escribir los predicados PROLOG necesarios para obtener dos sublistas, una que contenga los elementos de las posiciones pares y otra que contengaloselementosdelasposicionesimpares.

Ejemplo:?par_impar([a,b,c,d,e,f],[b,d,f],[a,c,e]).%PROLOGcontestaraques. Ejercicio 2.13 Dada una lista de nmeros, escribir los predicados PROLOG necesarios para hallarelelementomnimoyelmximo. Ejemplo:?minimo([4,6,2,7,9,0],Min).%PROLOGresponderaMin=0 Ejemplo:?maximo([4,6,2,7,9,0],Max).%PROLOGresponderaMax=9 Ejercicio 2.14 Dadaunalista,escribirlospredicadosPROLOGnecesariosparacontabilizarlas aparicionesdeundeterminadoelementoenlalista. Ejemplo:?aparicion(a,[a,b,c,a,b,a],X).%PROLOGcontestaraX=3.

2.6.Bibliografa
[Clocksin93] Clocksin,W.F.,Mellish,C.S.,ProgramacinenPROLOG. Segundaedicin.ColeccinCinciaInformtica.Editorial GustavoGiliS.A.,1993. Bratko,I., PROLOG programming for Artificial Intelligence. Second edition. AddisonWesley Publishing Company,1994.

[Bratko94]

[Konigsberger&Bruyn90] Konigsberger, H., Bruyn, F., PROLOG from the beginning.McGrawHillbookCompany,1990. [Starling&Shapiro94] Starling,L.,Shapiro,E.,TheartofPROLOG.Second edition.TheMITPress,1994. [Starling90] [OKeefe90] [Stobo89] Starling, L. editor, The practice of PROLOG. The MIT Press,1990. OKeefe, R.A., The craft of PROLOG. The MIT Press, 1990. Stobo, J., Problem solving with PROLOG. Pitman publishing,1989.

You might also like