Академический Документы
Профессиональный Документы
Культура Документы
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:
Nmeros
Functores
Listas
Functor
Functor: Ejemplo: una estructura para representar la fecha. fecha( 13, 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
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
.
.
[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
[ 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
Definicin
eslista( [ ] ). eslista( [ _ | _ ] ).
Prolog II
20
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
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
?- 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
?- ?- 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
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
28
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
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
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
Definicin
sublista( S, L):append( L1, L2, L), _, L2, L), append(S, L3, L2). _, L2).
Prolog II
L L1 S L2
33
L3
Prolog II
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.
Prolog II
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
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
Las palabras
word(abalone). word(abandon). word(enhance). word(anagram). word(connect). word(elegant). Prolog II
39
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,_]).
Sumario.
Los objetos simples en Prolog: tomos, variables y
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