Sei sulla pagina 1di 10

Prolog: Listas

Estructura bsica

Unificacin

Member

Append

Ejercicio

rbol de seguimiento

Estructura bsica

En prolog, una lista es una representacin de un conjunto de


elementos.

La notacin es la siguiente:
[manana, pera, banana! lista "acia: [ !

#e pueden utiliar cmo elementos de la lista cual$uier tipo de


dato de prolog, inclu%endo listas:
[[a,b,c!,[d, e, f!!

&ambi'n estructuras prolog:


[camino(tandil, bsas), camino(mardel, tandil),
camino(bsas,junin) !
["e*iculo(ale, [bici, moto, auto!),
"e*iculo(ariel,[bici, auto, *elicoptero!)!
Estructura bsica

Estructura bsica

En su forma ms bsica, una lista se puede "er como un predicado


$ue tiene + partes:
lista(cabea, cola)
en prolog:
[,abea - ,ola!

.or ejemplo:
[,abea - ,ola!/[0,+,1! [0! / [0-[ !!
,abea/0,
,ola/[+,1!

Es una definicin recursi"a...


[0,+,1! / [0 - [ + , 1 ! ! / [0 - [ + - [1 ! ! ! / [0 - [ + - [1 - [ ! ! ! !

.ara probar:
234/[0,+,1!,4 / [0 - [ + , 1 ! !,
4 / [0 - [ + - [1 ! ! !,4 / [0 - [ + - [1 - [ ! ! ! ! .

Unificacin

5a "imos algunos ejemplos, pero *a% mas:


[a,b,c]=[X,Y,Z]
X=a, Y=b, Z=c
[a,b,c] = [A, B, C|D]
A=a, B=b, C=c, D=[]
[a]=[A|B]
A=a, B=[]
[a,b,c,d,e] = [X,Y| Z]
X=a, Y=b, Z=[c,d,e]
[a,b,c] = [X,[Y|Z]]
No, espera que el segundo
elemento de la lista sea una lista
[]=[X|Y] o [] = [X]
No!, la lista vacia no se puede dividir en cabeza y
cola
Es til cuando definimos predicados de corte,
para estar seuros !ue una lista vacia no "ace
matc" con una divisi#n cabeza$cola%
&or e'(
sumar)[],*+($*=,% -e'or( sumar)[],,+%
sumar)[ X | Y ],*+ ($ sumar)Y, *.+, * is *./X%

Member

.ermite saber si un elemento pertenece a una lista:


member(0,[6,7,8,9,0,+,1!).
%es
member(0,[a,b,c!)
no

#i el primer argumento es una "ariable, podemos listar los


elementos de una lista uno a uno, *aciendo redo:
member(4,[a,b,c!).
%es, 4/a:
%es, 4/b:
%es, 4/c:
;o

Append

.ermite unificar + listas en una:


append([0,+!,[1,<!,4)
4/[0,+,1,<!
o "erificar $ue una lista es la unin de otras +:
append([a,b!,[c!,[a,b,c!)
%es

Es ms =til con los argumentos sin instanciar:


append(4,[1,<!,[0,+,1,<!).
5es, 4/[0,+!
append([0,+!,5,[0,+,1,<!)
5es, 5/[1,<!

Append

.ermite conseguir todas las posibilidades de partir una lista en


+:
append(4,5,[0,+,1,<!)
4/[!, 5/[0,+,1,<! :
4/[0!, 5/[+,1,<!:
>
4/[0,+,1,<!, 5/[!

En algunos casos nos sir"e para agregar nue"os elementos a


una lista $ue "amos acarreando:
agregar(4, L, Lnue"a):3 append([4!, L, Lnue"a).
?ue en realida tambi'n se podr@a *acer con unificacin:
agregar(4, L, Lnue"a):3 Lnue"a/[4-L!.
pero como "imos, es lo mismo:
agregar(4, L, [4-L!).

Ejercicio

&amaAo de una lista:


sie([a,b,c!, ;).
%es, ;/1.
sie([!,B).
sie([4-5!, ;):3sie(5, ;0), ; is ;0C0.

#e puede dejar sin instanciar el 0er argumento (Ejercicio 1.a).



Ejercicio

Dotar una lista:


.or ej:
23rotar([0,+,1,<!, L, +).
L/[1,<,0,+!.

.rimer enfo$ue:
rotar(4,4,B).
rotar([4-5!, L, ;):3;0 is ;30, append(5,[4!,50), rotar(50, L, ;0).

#egundo enfo$ue:
rotar(L,D, ;):3append(4, 5, L), sie(4, ;), append(5, 4, D).

Arbol de seguimiento
No
.+ size)[],,+%
0+ size)[X|Y], N+($size)Y, N.+, N is N./.%
size)[.,0,1], N+
&or .+
size)[0,1], N.+, N2 is N. / .
&or 0+ X2=0, Y2=[1], N2=N22 &or .+
No, no "ace
matc"in el
vacio con la
lista
&or 0+ X=., Y=[0,1], N=N2
size)[1], N.2+, N22 is N.2 / .
Yes, N.22=,
&or 0+ X22=1, Y22=[], N22=N222
&or .+
size)[], N.22+, N222 is N.22 / .
&or .+
No

Potrebbero piacerti anche