Beruflich Dokumente
Kultur Dokumente
Lenguaje de Programacin
OBJETOS
RELACIONES
Para programar en Prolog:
Observar:
Minsculas
El punto final
pedro maria
Ejemplo:
miguel
clusulas
?- progenitor (teresa, raquel). pedro maria
Yes
No
miguel
pedro maria
Quin es nieto de pedro?
No
miguel
pedro maria
Quin es abuelo de jorge?
No
miguel
Paso 1.
Quin es abuelo de jorge?
La base de hechos
Paso 2.
Quin es abuelo de jorge?
descendiente(X,Y) :- progenitor(Y,X). Y
cabeza cuerpo
Para todos X e Y,
SI Y es progenitor de X
Entonces X es descendiente de Y.
Ejemplo: la relacin madre
Para todos X y W,
mujer X
X es madre de W SI
X es progenitor de W Y
progenitor madre
X es mujer
madre (X, W) :- W
progenitor(X, W),
mujer(X).
La coma significa
Relacin unaria conjuncin (Y)
Ejemplo: la relacin abuelo
Para todos X y Z,
hombre X
X es abuelo de Z SI
progenitor
X es progenitor de W y
W es progenitor de Z y
W abuelo
X es hombre
abuelo (X, Z) :-
progenitor
progenitor (X, W),
progenitor (W, Z),
Z
hombre (X).
Ejemplo: la relacin hermana
Para todos X y W, Z
progenitor progenitor
X es hermana de W SI
Z es progenitor de X y W, y
X es mujer X W
hermana
mujer
hermana (X, W) :-
progenitor(Z, X), progenitor(Z, W),
mujer(X).
Aadimos estos hechos. pedro maria
hombre(pedro).
mujer(maria).
mujer(elena).
mujer(teresa). teresa elena
hombre(jorge).
mujer(raquel).
hombre(miguel).
jorge raquel
Quin es hermana de jorge?
?- hermana(X, jorge).
X = raquel ;
miguel
No
Un pequeo problema ... pedro maria
Quin es hermana de teresa?
?- hermana(X, teresa).
X = teresa ; teresa elena
X = teresa ;
X = elena ;
No
jorge raquel
miguel
Programa: pedro maria
progenitor(pedro, teresa).
progenitor(maria, teresa).
progenitor(maria, elena).
progenitor(teresa, jorge).
progenitor(teresa, raquel).
progenitor(raquel, miguel). teresa elena
hombre(pedro).
mujer(maria).
mujer(elena).
mujer(teresa).
hombre(jorge). jorge raquel
mujer(raquel).
hombre(miguel).
hermana(X, W) :-
progenitor(Z, X), progenitor(Z, W), miguel
mujer(X).
Ejemplo: la relacin antepasado X
antepasado (X, Z) :-
antepasado
progenitor (X, W),
antepasado (W, Z). ...
antepasado
antepasado (X, Z) :-
progenitor (X, W), ...
antepasado (W, Z).
Z
Ejemplo: la relacin antepasado X
antepasado(X, Z) :-
progenitor(X, Z).
antepasado
antepasado (X, Z) :-
...
progenitor (X, W),
antepasado (W, Z).
Z
pedro maria
Ejercicios
Definir las relaciones tia,
teresa elena juan
tio, sobrino, sobrina,
primos, ...
y ensayarla sobre jorge raquel jose
la base de datos
de la figura
miguel
Tipos de datos
Datos
Constantes Variables
tomos Nmeros
Tipos de datos Cadenas de caracteres y
nmeros y _, que
Datos
comiencen con minscula
Cadenas de caracteres
pepe especiales
Trminos simples Estructuras
mausculas:
nil <-->A, B, ... Z
x25 Cadenas
minsculas: a, b, dez caracteres
...
===>
encerrados entre
Nmeros nmeros:
a_EDcomillas
0, 1, 2, ... 9
simples
Constantes Variables :-:
Enteros: 1, 3 10000 car. miss_jones
especiales:
Ojo con+ predefinidos,
Pepe - * / <> = : . & _ ~
Reales: 1.00, -0.093 x_ Ana Zapana
p.e. :-
tomos Nmeros
Ali Catari
1 ?- [user].
Tipos de datos Variables:
|: con_hijo(X) :- progenitor(X, Y).
Warning: (user://1:9):
Datosde caracteres,
Cadenas
Singleton variables: [Y]
nmeros y _,
El contexto lxico deque
unacomiencen
con mayscula o _
La variable annima: cuando una variable aparece
Trminosvariable
simples es la clusula.
Estructuras
una sola vez no es necesario
_pepe inventarnos un
nombre para ella.
Nil
con_hijo(X) :- progenitor(X, Y).
Constantes _x25
Variables
con_hijo(X) :- progenitor(X, _).
A_ED
_234
tomos Nmeros
Tipos de datos
Datos
Constantes Variables
Estructuras:
Objetos que contienen datos
como componentes.
tomos Nmeros Functores
Listas
Cualquier da de
Functor
octubre de 1998:
Functor:
fecha( Dia, octubre, 1998)
Ejemplo: una estructura para
representar la fecha.
fecha( 13, octubre, 1998)
fecha
N = 'Luis'
A1 = 'Perez'
A2 = 'Martinez' ;
No
ficha
localizador identidad
X = 5183
N = 'Luis'
A1 = 'Perez'
A2 = 'Martinez' ;
No
Listas
. (a, . ( b, . ( c, [ ] )))
.
a . . (Cabeza, Cola )
b .
c []
Listas (cont.) ?- Lista1 = [a, b, c],
| Lista2 = .(a, .(b, .(c, []))).
b .
a b c
c []
Listas (cont.)
[a, [b, c ], d ] = []
a [] d
b c
[a,b,c] a [ b,c ]
[a] a []
[] no tiene no tiene
[[el, gato], maulla ] [el, gato] [maulla]
[maulla, [el, gato ]] maulla [[el, gato]]
Listas (cont.)
Las listas se manipulan dividindolas en cabeza y cola
Lista
Cadenas de caracteres
?- name(X, [108,243,103,105,99,97]).
X = lgica
Yes
Operaciones elementales en Listas
El predicado eslista es cierto si su argumento
es una lista.
?- eslista([ ]).
Definicin Yes
segundo argumento.
?- pertenece(a, [x,y,a,z]).
Definicin Yes
pertenece ( X, [ _ | Y] ) :- Yes
pertenece (X, Y). ?- 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
?- trace(pertenece).
pertenece/2: call redo exit fail
pertenece ( X, [X | _ ] ).
Yes
pertenece ( X, [ _ | Y] ) :- ?- pertenece(a,[s,d,e]).
pertenece (X, Y). 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
?- trace(pertenece).
pertenece(a,[f,a,c]).
pertenece/2: call redo exit fail
Ojo: Mal definido Yes
pertenece ( X, [ _ | Y] ) :- ?- pertenece(a,[f,a,c]).
pertenece (X, Y). T Call: (6) pertenece(a, [f, a, c])
T Call: (7) pertenece(a, [a, c])
pertenece ( X, [X | _ ] ). 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
Operaciones elementales en Listas
El predicado incluir proporciona una lista que es
X=
L [yo]
= [yo, no, soy, pepe]
Definicin YesYes
incluir ( [] , L, L).
incluir ( [X | L1], L2, [ X | L3] ) :-
incluir (L1, L2, L3).
?- 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])
Definicin
incluir ( [] , L, L).
incluir ( [X | L1], L2, [ X | L3] ) :-
incluir (L1, L2, L3).
Definicin No
Definicin Yes
elimina( _ , [ ], [ ]).
elimina( X, [X | Y], R) :- elimina( X, Y, R).
elimina( X, [W| Y], [W | R]) :- X \== W, elimina( X, Y, R).
Operaciones elementales en Listas
El predicado sustituye todas las ocurrencias de un elemento
(sin estructura).
?- sustituye( i, a, [e,l,i,m,i,n,a], R).
R = [e, l, a, m, a, n, a]
Definicin Yes
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).
Operaciones elementales en Listas
El predicado reverso devuelve la lista inversa de una
dada.
Definicin Yes
Yes
Definicin
L
sublista( S, L):-
append( _,L1,L2,
L2,L),
L), L1 S L3
append(S, _,L3,L2).
L2). L2
sublista( S, L):-
append( _, L2, L),
append(S, _, L2).
aplana([], []).
aplana(X, [X]).
2 ?- trace(aplana).
% aplana/2: [call, redo, exit, fail]
Lp = [a, b] ;
Adems, el uso de append/3
hace que sea muy ineficiente. 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, []] ;
2 ?- trace(aplana2).
% aplana2/2: [call, redo, exit, fail]
Una nueva definicin que es
ms eficiente.
[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)
aplana2(L,LP):- T Exit: (10) aplana2(a, [], [a])
T Call: (10) aplana2([[b]], [a], _G501)
aplana2(L,[],LP). T Call: (11) aplana2([b], [a], _L210)
T Call: (12) aplana2(b, [a], _L231)
aplana2([H|T],A,LP):- T Exit: (12) aplana2(b, [a], [b, a])
T Call: (12) aplana2([], [b, a], _L210)
aplana2(H,A,HA), T Exit: (12) aplana2([], [b, a], [b, a])
aplana2(T,HA,LP). T Exit: (11) aplana2([b], [a], [b, a])
T Call: (11) aplana2([], [b, a], _G501)
T Exit: (11) aplana2([], [b, a], [b, a])
aplana2([],A,A). T Exit: (10) aplana2([[b]], [a], [b, a])
T Exit: (9) aplana2([a, [b]], [], [b, a])
aplana2(X,A,[X|A]). T Exit: (8) aplana2([a, [b]], [b, a])
Lp = [b, a] ;
T Redo: (11) aplana2([], [b, a], _G501)
Problema: La lista resulta invertida 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]
% Execution Aborted
12 ?- trace(aplana3).
Un pequeo arreglo es suficiente % aplana3/2: [call, redo, exit, fail]
% aplana3/3: [call, redo, exit, fail]
aplana3(L,LP):- Yes
aplana3(L,[],LP). [debug] 13 ?- aplana3([a,[b]],Lp).
T Call: (8) aplana3([a, [b]], _G501)
T Call: (9) aplana3([a, [b]], [], _G501)
aplana3([H|T],A,LP):- T Call: (10) aplana3([[b]], [], _L189)
T Call: (11) aplana3([], [], _L210)
aplana3(T,A,HA), T Exit: (11) aplana3([], [], [])
aplana3(H,HA,LP). T Call: (11) aplana3([b], [], _L189)
T Call: (12) aplana3([], [], _L249)
T Exit: (12) aplana3([], [], [])
aplana3([ ],A,A). T Call: (12) aplana3(b, [], _L189)
aplana3(X,A,[X|A]). T Exit: (12) aplana3(b, [], [b])
T Exit: (11) aplana3([b], [], [b])
T Exit: (10) aplana3([[b]], [], [b])
para que la lista salga en el orden T Call: (10) aplana3(a, [b], _G501)
T Exit: (10) aplana3(a, [b], [a, b])
correcto. T Exit: (9) aplana3([a, [b]], [], [a, b])
T Exit: (8) aplana3([a, [b]], [a, b])
Lp = [a, b] ;
Lp = [a, b, []]