Вы находитесь на странице: 1из 41

II.

Estructuras de datos en Prolog

Prolog II

Tipos de datos
Datos
Trminos simples Estructuras

Constantes

Variables

tomos
Prolog II

Nmeros
2

Tipos de datos

Cadenas de caracteres y nmeros y _, que Datos comiencen con minscula Cadenas de caracteres pepe especiales Trminos simples Estructuras mausculas: A, B, ... Z nil <--> Nmeros minsculas: a, b, ... z caracteres x25 Cadenas de ===> encerrados entre Enteros: 1, 3 10000 nmeros: 0, 1, 2, simples a_ED Constantes Variablescomillas ... 9 :-: Reales: 1.00, -0.093 car. miss_jones + - * / <> = : . & _ ~ especiales: Pepe Ojo con predefinidos, Nmeros x_ Esther Colero p.e. :Ali Catados
3

tomos
Prolog II

1 ?- [user]. |: Tipos de datoscon_hijo(X) :- progenitor(X, Y). Variables: Warning: (user://1:9): Datos Cadenas de caracteres, Singleton variables: [Y] nmeros y de una El contexto lxico _, que comiencen con mayscula o _ La variable annima: cuando una variable aparece Trminosvariable es la clusula. Estructuras una sola vez no simples es necesario inventarnos un nombre _pepe para ella. Nil con_hijo(X) :- progenitor(X, Y). _x25 Constantes Variables con_hijo(X) :- progenitor(X, _). A_ED _234 tomos
Prolog II

Nmeros
4

Tipos de datos
Datos
Trminos simples Estructuras

Constantes

Variables Estructuras:

Objetos que contienen datos como componentes.


tomos
Prolog II

Nmeros

Functores

Listas

Functor
Functor: Ejemplo: una estructura para representar la fecha. fecha( 13, octubre, 1998)

Cualquier da de octubre de 1998: fecha( Dia, octubre, 1998)

fecha

Functor

Argumentos

13

octubre

1998

Prolog II

Ejemplo:
ficha( identidad( 'luis', 'Perez', 'Martinez'), ficha( identidad( 'Maria', 'Garzon', 'Martin'), ficha( identidad( 'Javier', 'Galindo', 'Martinez'), nacimiento( fecha( 10,2, 1956), nacimiento( fecha( 1, 5, 1978), nacimiento( fecha( 1, 5, 1970), lugar('Buga', 'Valle')), lugar('Guia', 'Gran Canaria')), lugar('Guia', 'Gran Canaria')), direccion( calle( '', 41), 4), direccion( calle( 'Ansite', 124), 'Gomera', poblacion( 'Las Palmas de Gran Canaria')), poblacion( 'Las Palmas de Gran Canaria')), poblacion( 'Santa Brigida')), datos( 42232787, estudiante, 928234567)). datos( 42234347, estudiante, 928234117)). 89234347, arquitecto, 928234227)).

Prolog II

Ejemplo:
?- ficha( identidad( N, A1, A2), | nacimiento( _, lugar( 'Teror', 'Gran Canaria')), | _, _). N = 'Luis' A1 = 'Perez' A2 = 'Martinez' ; No

ficha( identidad( 'Luis', 'Perez', 'Martinez'), nacimiento( fecha( 10, 5, 1970), El nombre y apellidos de las personas nacidas en lugar('Teror', 'Gran Canaria')), Teror de Gran Canaria Galdos', 41), direccion( calle( 'Perez poblacion( 'Las Palmas de Gran Canaria')), datos( 42232787, estudiante, 928234567)). Prolog II

A efectos de eficacia, resulta conveniente simplificar la estructura de representacin ficha( 5123, identidad( 'Luis', 'Perez', 'Martinez')). nacimiento( 5123, fecha( 10, 5, 1970), lugar('Teror', 'Gran Canaria')). direccion( 5123, calle( 'Perez Galdos', 41), poblacion( 'Las Palmas de Gran Canaria')). datos( 5123, 42232787, estudiante, 928234567)).

Prolog II

ficha ( 5123, identidad( 'Luis', 'Perez', 'Martinez')). ficha

localizador

identidad

nombre
Prolog II

apellido1

apellido2
10

Ejemplo (cont.):
El nombre y apellidos de las personas nacidas en (cualquier) Teror y que residan en Las Palmas de Gran Canaria ?- ficha( X, identidad( N, A1, A2)), | nacimiento( X, _, lugar( 'Teror', _)), | direccion( X, _, poblacion('Las Palmas de Gran Canaria')). X = 5183 N = 'Luis' A1 = 'Perez' A2 = 'Martinez' ;

No
Prolog II 11

Ejemplo (cont.):
El telfono de todas las personas nacidas despus de 1975 ?- nacimiento(X,fecha(_, _, Ao), _), | datos( X, _, _, Telefono), | Ao > 1975. X = 5184 Ao = 1978 Telefono = 928234117 ; No
Prolog II 12

Listas
. a . . (a, . ( b, . ( c, [ ] )))

. (Cabeza, Cola )
.

c
Prolog II

[]
13

Listas (cont.)
. (a, . ( b, . ( c, [ ] ))) . a b

?- Lista1 = [a, b, c], | Lista2 = .(a, .(b, .(c, []))).

Lista1 = [a, b, c] Lista2 = [a, b, c]


Yes

.
.

[a, b, c ] = a [] b c

[]

Prolog II

14

Listas (cont.)
[a, [b, c ], d ] =
a b c [] d

[]

?- display( [a, [b, c], d]). .(a, .(.(b, .(c, [])), .(d, []))) Yes
Prolog II 15

Listas (cont.)
Las listas se manipulan dividindolas en cabeza y cola
Lista [a,b,c] [a] [] [[el, gato], maulla ] [maulla, [el, gato ]] Cabeza a a no tiene [el, gato] maulla Cola [ b,c ] [] no tiene [maulla] [[el, gato]]

Prolog II

16

Listas (cont.)
Las listas se manipulan dividindolas en cabeza y cola
Lista [a,b,c] [a] [] [[el, gato], maulla ] [maulla, [el, gato ]] ?- [X|Y] == [a]. c]. b, ?- [X|Y] [a,[]. ?- [X|Y] == [[el, gato], maulla]. ?- [X|Y] = [maulla, [el, gato]]. ?X = a [X|Y] X=a No = [el, Y == [] c] gato] [b, Y X = maulla X Y == [[el, gato]] Y [maulla] Yes Yes Yes Yes
17

Prolog II

Listas (cont.)
Una operacin bsica: unificacin de listas
Lista1 [ X, Y, Z] [ gato ] [X, Y | Z ] [[el, Y], Z ] [ X, Y, X ]
Prolog II

Lista2 [ se, ha, ido] [X|Y]

Unificacin Unificacin X = yo No se X = unificables gato a el Y = bebo Y = ha [] b ratn

[yo, bebo, vino ]


[[X, ratn], [se, fu ]]

Z = [[ vinofue ] Z = ido ] ] c se,


U=u

[ X, [ Y| Z ], U ] [ a, [ b, c], u]

[ a, b, c ]
18

Listas (cont.)
Cadenas de caracteres como listas de cdigos ASCII ?- name( lgica, X). X = [108, 243, 103, 105, 99, 97] Yes ?- name(X, [108,243,103,105,99,97]). X = lgica Yes
Prolog II 19

Operaciones elementales en Listas


El predicado eslista es cierto si su argumento
es una lista. ?- eslista([ ]). Yes

Definicin

eslista( [ ] ). eslista( [ _ | _ ] ).

?- eslista( [a | [b , d]] ). Yes

Prolog II

20

Operaciones elementales en Listas


El predicado pertenece es cierto si su primer
argumento pertenece a la lista que aparece como segundo argumento. Definicin ?- pertenece(a, [x,y,a,z]). Yes

pertenece ( X, [X | _ ] ). pertenece ( X, [ _ | Y] ) :pertenece (X, Y).

?- pertenece(X, [a,b,c]). X=a; X=b; X=c; No


21

Prolog II

pertenece ( X, [X | _ ] ).
pertenece ( X, [ _ | Y] ) :pertenece (X, Y).

?- trace(pertenece). pertenece/2: call redo exit fail Yes ?- pertenece(a,[x,y,a,z]). T Call: ( 8) pertenece(a, [x, y, a, z]) T Call: ( 9) pertenece(a, [y, a, z]) T Call: ( 10) pertenece(a, [a, z]) T Exit: ( 10) pertenece(a, [a, z]) T Exit: ( 9) pertenece(a, [y, a, z]) T Exit: ( 8) pertenece(a, [x, y, a, z]) Yes

Prolog II

22

?- trace(pertenece). pertenece/2: call redo exit fail

pertenece ( X, [X | _ ] ).
pertenece ( X, [ _ | Y] ) :pertenece (X, Y). Yes ?- pertenece(a,[s,d,e]). T Call: ( 7) pertenece(a, [s, d, e]) T Call: ( 8) pertenece(a, [d, e]) T Call: ( 9) pertenece(a, [e]) T Call: ( 10) pertenece(a, []) T Fail: ( 10) pertenece(a, []) T Fail: ( 9) pertenece(a, [e]) T Fail: ( 8) pertenece(a, [d, e]) T Fail: ( 7) pertenece(a, [s, d, e])

No
Prolog II 23

Ojo: Mal definido


pertenece ( X, [ _ | Y] ) :pertenece (X, Y). pertenece ( X, [X | _ ] ).

?- pertenece(a,[f,a,c]). trace(pertenece). pertenece/2: call redo exit fail Yes ?- pertenece(a,[f,a,c]). T Call: (6) pertenece(a, [f, a, c]) T Call: (7) pertenece(a, [a, c]) T Call: (8) pertenece(a, [c]) T Call: (9) pertenece(a, []) T Fail: (9) pertenece(a, []) T Redo: (8) pertenece(a, [c]) T Fail: (8) pertenece(a, [c]) T Redo: (7) pertenece(a, [a, c]) T Exit: (7) pertenece(a, [a, c]) T Exit: (6) pertenece(a, [f, a, c]) Yes
24

Prolog II

Operaciones elementales en Listas


El predicado incluir proporciona una lista que es
concatenacin de otras dos.

?- ?- incluir( [yo, no], [soy, pepe], L). incluir( X, [soy, pepe], [yo, soy, pepe]).
X = [yo] no, soy, pepe] L = [yo,

Definicin

Yes Yes

incluir ( [] , L, L). incluir ( [X | L1], L2, [ X | L3] ) :incluir (L1, L2, L3).
Prolog II 25

?- incluir([yo],[soy, pepe],L). T Call: ( 7) incluir([yo], [soy, pepe], _G242) T Call: ( 8) incluir([], [soy, pepe], _G344) T Exit: ( 8) incluir([], [soy, pepe], [soy, pepe]) T Exit: ( 7) incluir([yo], [soy, pepe], [yo, soy, pepe])
L = [yo, soy, pepe] Yes

Definicin
incluir ( [] , L, L). incluir ( [X | L1], L2, [ X | L3] ) :incluir (L1, L2, L3).
Prolog es 26 incluir/3II equivalente al predicado predefinido append/3

Operaciones elementales en Listas


El predicado cuenta devuelve el nmero de ocurrencias
de un elemento en una lista simple (sin estructura). ?- cuenta( a, [t,r,a,g,a], N). N=2;

Definicin

No

cuenta( _, [], 0). cuenta(X, [X | Y], N) :- cuenta(X,Y,Z), N is Z+1. cuenta(X, [W| Y], Z) :- X \== W, cuenta(X,Y,Z).
Prolog II

Es necesario ?

27

cuenta( _, [], 0). cuenta(X, [X | Y], N) :- cuenta(X,Y,Z), N is Z+1. cuenta(X, [W| Y], Z) :- X \== W, cuenta(X,Y,Z). ?- cuenta( a, [t,r,a,g,a], N). N=2; No

cuenta( _, [], 0). cuenta(X, [X | Y], N) :- cuenta(X,Y,Z), N is Z+1. cuenta(X, [W| Y], Z) :- cuenta(X,Y,Z).

Prolog II

?- cuenta( a, [t,r,a,g,a], N). N=2; N=1; N=1; N=0; No

28

Operaciones elementales en Listas


El predicado elimina elimina todas las ocurrencias
de un elemento en una lista simple (sin estructura). ?- elimina( i, [e,l,i,m,i,n,a], R). R = [e, l, m, n, a]

Definicin

Yes

elimina( _ , [ ], [ ]). elimina( X, [X | Y], R) :- elimina( X, Y, R). elimina( X, [W| Y], [W | R]) :- X \== W, elimina( X, Y, R).
Prolog II 29

Operaciones elementales en Listas


El predicado sustituye todas las ocurrencias de un elemento
(1er arg.) por el 2 argumento en una lista simple (sin estructura). ?- sustituye( i, a, [e,l,i,m,i,n,a], R). R = [e, l, a, m, a, n, a] Yes

Definicin

sustituye( _ , _ , [ ], [ ]). sustituye( X, Y, [X | U], [Y | V]) :- sustituye( X, Y, U, V). sustituye( X, Y, [Z | U], [Z | V]) :- X \== Z, sustituye( X, Y, U, V).
Prolog II 30

Operaciones elementales en Listas


El predicado reverso devuelve la lista inversa de una
dada. ?- reverso( [1,2,3,4,5], R). R = [5, 4, 3, 2, 1]

Definicin

Yes

reverso( L1, L2):- rev( L1, [ ], L2). rev( [ ], L, L). rev( [X | Y], L1, L2) :- rev( Y, [X | L1], L2).
Prolog II 31

reverso( L1, L2):rev( L1, [ ], L2). rev( [ ], L, L). rev( [X | Y], L1, L2) :rev( Y, [X | L1], L2).

?- reverso([1,2,3,4,5],R). ?- trace(rev), trace(reverso). T Call: ( 8) reverso([1, 2, 3, 4, 5], _G217) rev/3: call redo exit fail T Call: ( 9) rev([1, 2, 3, 4, 5], [], _G217) reverso/2: 4, 5], [1], exit fail T Call: ( 10) rev([2, 3, call redo_G217) T Call: ( 11) rev([3, 4, 5], [2, 1], _G217) Yes T Call: ( 12) rev([4, 5], [3, 2, 1], _G217) T Call: ( 13) rev([5], [4, 3, 2, 1], _G217) T Call: ( 14) rev([], [5, 4, 3, 2, 1], _G217) T Exit: ( 14) rev([], [5, 4, 3, 2, 1], [5, 4, 3, 2, 1]) T Exit: ( 13) rev([5], [4, 3, 2, 1], [5, 4, 3, 2, 1]) T Exit: ( 12) rev([4, 5], [3, 2, 1], [5, 4, 3, 2, 1]) T Exit: ( 11) rev([3, 4, 5], [2, 1], [5, 4, 3, 2, 1]) T Exit: ( 10) rev([2, 3, 4, 5], [1], [5, 4, 3, 2, 1]) T Exit: ( 9) rev([1, 2, 3, 4, 5], [], [5, 4, 3, 2, 1]) T Exit: ( 8) reverso([1, 2, 3, 4, 5], [5, 4, 3, 2, 1]) R = [5, 4, 3, 2, 1] Yes
32

Prolog II

Operaciones elementales en Listas


El predicado sublista que comprueba si una lista (1er arg.)
es parte de otra dada (2 arg.). ?- sublista( [a,s,f], [b,e,a,s,f,g,h]). Yes

Definicin
sublista( S, L):append( L1, L2, L), _, L2, L), append(S, L3, L2). _, L2).
Prolog II

L L1 S L2
33

L3

sublista( S, L):append( _, L2, L), append(S, _, L2).


?- sublista( [a,s,f], [b,e,a,s,f,g,h]). [debug] ?- sublista( [a,s,f], [b,e,a,s,f,g,h]). T Call: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) Call: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) ? creep Call: (7) append(_G598, _G599, [b, e, a, s, f, g, h]) ? creep Exit: (7) append([], [b, e, a, s, f, g, h], [b, e, a, s, f, g, h]) ? creep Call: (7) append([a, s, f], _G599, [b, e, a, s, f, g, h]) ? creep Fail: (7) append([a, s, f], _G599, [b, e, a, s, f, g, h]) ? creep Exit: (7) append([b], [e, a, s, f, g, h], [b, e, a, s, f, g, h]) ? creep Call: (7) append([a, s, f], _G602, [e, a, s, f, g, h]) ? creep Fail: (7) append([a, s, f], _G602, [e, a, s, f, g, h]) ? creep Exit: (7) append([b, e], [a, s, f, g, h], [b, e, a, s, f, g, h]) ? creep Call: (7) append([a, s, f], _G605, [a, s, f, g, h]) ? creep Exit: (7) append([a, s, f], [g, h], [a, s, f, g, h]) ? creep T Exit: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) Exit: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) ? creep Yes 34

Prolog II

Operaciones elementales en Listas


El predicado aplana transforma una lista compleja, que
puede contener a otras listas como elementos, en una lista sin estructura. ?- aplana([a, [ [b], c] ], L). L = [a, b, c] Yes

Definicin
aplana([H|T], Lp):aplana(H, Hp), aplana(T, Tp), append(Hp, Tp, Lp). aplana([], []). Prolog II aplana(X, [X]).

35

Esta definicin produce basura en el backtracking. aplana([H|T], Lp):aplana(H, Hp), aplana(T, Tp), append(Hp, Tp, Lp). aplana([], []). aplana(X, [X]). Adems, el uso de append/3 hace que sea muy ineficiente.

2 ?- trace(aplana). % aplana/2: [call, redo, exit, fail]


Yes [debug] 3 ?- aplana([a,[b]],Lp). T Call: (7) aplana([a, [b]], _G486) T Call: (8) aplana(a, _L171) T Exit: (8) aplana(a, [a]) T Call: (8) aplana([[b]], _L172) T Call: (9) aplana([b], _L192) T Call: (10) aplana(b, _L213) T Exit: (10) aplana(b, [b]) T Call: (10) aplana([], _L214) T Exit: (10) aplana([], []) T Exit: (9) aplana([b], [b]) T Call: (9) aplana([], _L193) T Exit: (9) aplana([], []) T Exit: (8) aplana([[b]], [b]) T Exit: (7) aplana([a, [b]], [a, b]) Lp = [a, b] ; T Redo: (9) aplana([], _L193) T Exit: (9) aplana([], [[]]) T Exit: (8) aplana([[b]], [b, []]) T Exit: (7) aplana([a, [b]], [a, b, []]) Lp = [a, b, []] ; 36

Prolog II

Una nueva definicin que es ms eficiente.


aplana2(L,LP):aplana2(L,[],LP). aplana2([H|T],A,LP):aplana2(H,A,HA), aplana2(T,HA,LP). aplana2([],A,A). aplana2(X,A,[X|A]).

2 ?- trace(aplana2). % aplana2/2: [call, redo, exit, fail] [debug] 11 ?- aplana2([a,[b]],Lp). T Call: (8) aplana2([a, [b]], _G501) T Call: (9) aplana2([a, [b]], [], _G501) T Call: (10) aplana2(a, [], _L189) T Exit: (10) aplana2(a, [], [a]) T Call: (10) aplana2([[b]], [a], _G501) T Call: (11) aplana2([b], [a], _L210) T Call: (12) aplana2(b, [a], _L231) T Exit: (12) aplana2(b, [a], [b, a]) T Call: (12) aplana2([], [b, a], _L210) T Exit: (12) aplana2([], [b, a], [b, a]) T Exit: (11) aplana2([b], [a], [b, a]) T Call: (11) aplana2([], [b, a], _G501) T Exit: (11) aplana2([], [b, a], [b, a]) T Exit: (10) aplana2([[b]], [a], [b, a]) T Exit: (9) aplana2([a, [b]], [], [b, a]) T Exit: (8) aplana2([a, [b]], [b, a]) Lp = [b, a] ; T Redo: (11) aplana2([], [b, a], _G501) T Exit: (11) aplana2([], [b, a], [[], b, a]) T Exit: (10) aplana2([[b]], [a], [[], b, a]) T Exit: (9) aplana2([a, [b]], [], [[], b, a]) T Exit: (8) aplana2([a, [b]], [[], b, a]) Lp = [[], b, a] 37

Problema: La lista resulta invertida

Prolog II

Un pequeo arreglo es suficiente aplana3(L,LP):aplana3(L,[],LP). aplana3([H|T],A,LP):aplana3(T,A,HA), aplana3(H,HA,LP). aplana3([ ],A,A). aplana3(X,A,[X|A]). para que la lista salga en el orden correcto.

% Execution Aborted 12 ?- trace(aplana3). % aplana3/2: [call, redo, exit, fail] % aplana3/3: [call, redo, exit, fail] Yes [debug] 13 ?- aplana3([a,[b]],Lp). T Call: (8) aplana3([a, [b]], _G501) T Call: (9) aplana3([a, [b]], [], _G501) T Call: (10) aplana3([[b]], [], _L189) T Call: (11) aplana3([], [], _L210) T Exit: (11) aplana3([], [], []) T Call: (11) aplana3([b], [], _L189) T Call: (12) aplana3([], [], _L249) T Exit: (12) aplana3([], [], []) T Call: (12) aplana3(b, [], _L189) T Exit: (12) aplana3(b, [], [b]) T Exit: (11) aplana3([b], [], [b]) T Exit: (10) aplana3([[b]], [], [b]) T Call: (10) aplana3(a, [b], _G501) T Exit: (10) aplana3(a, [b], [a, b]) T Exit: (9) aplana3([a, [b]], [], [a, b]) T Exit: (8) aplana3([a, [b]], [a, b]) Lp = [a, b] ;

Prolog II

Lp = [a, b, []]

38

Operaciones elementales en Listas


El predicado crossword permite encontrar las palabras
que forman un crucigrama de 6 palabras cruzadas (3 verticales y 3 horizontales) de siete letras cada una.

Las palabras
word(abalone). word(abandon). word(enhance). word(anagram). word(connect). word(elegant). Prolog II

?- crossword(V1,V2,V3,H1,H2,H3). V1 = abalone, V2 = anagram, V3 = connect, H1 = abandon, H2 = elegant, H3 = enhance Yes

39

word(abalone). word(abandon). word(enhance). word(anagram). word(connect). word(elegant).

crossword(V1,V2,V3,H1,H2,H3):word(V1), name(V1,[_,C12,_,C14,_,C16,_]), word(V2), name(V2,[_,C22,_,C24,_,C26,_]), word(V3), name(V3,[_,C32,_,C34,_,C36,_]), word(H1), name(H1,[_,C12,_,C22,_,C32,_]), word(H2), name(H2,[_,C14,_,C24,_,C34,_]), word(H3), name(H3,[_,C16,_,C26,_,C36,_]).

a a c abandon a a n elegant o r e enhance e m t

Una versin ms sofisticada y realista - podra partir

de una plantilla de celdas libres y ocupadas para definir


el crucigrama. Alguien se anima?
Prolog II 40

Sumario.
Los objetos simples en Prolog: tomos, variables y

nmeros. Las estructuras sirven para representar objetos


compuestos. Las estructuras se construyen por medio de

functores.

Cada functor se define por su nombre y aridad. La misma variable en dos clusulas representa dos cosas diferentes. El mbito lxico de una variable es la clusula. La lista es una estructura verstil, compuesta de cabeza y cola.
Prolog II 41

Вам также может понравиться