Академический Документы
Профессиональный Документы
Культура Документы
Programación Declarativa 1
Prolog
Programación Declarativa 2
Programación lógica y
bases de datos relacionales
La P. L. se puede utilizar para la representación/interrogación
de bases de datos relacionales.
Dominios en P. L.:
predicados monarios
estructuras
Relaciones en P. L.: predicados
extensionales (mediante hechos)
intensionales (mediante reglas)
Programación Declarativa 3
Dominios (I)
o Predicados monarios
varon(antonio). hembra(ana).
varon(luis). hembra(pepa).
varon(jose). hembra(lola).
varon(andres). hembra(maria).
... ...
o Estructuras
nacimiento(juan,fecha(2,nov,1993)).
...
aniversario(P,dia(D,M)):-
nacimiento(N,fecha(D,M,_)).
Programación Declarativa 4
Dominios (II)
Los predicados sobre dominios se pueden utilizar:
X = antonio X = 0
X = luis X = s(0)
X = jose X = s(s(0))
X = andres X = s(s(s(0)))
X = s(s(s(s(0))))
...
Programación Declarativa 5
Relaciones (def. extensional)
Relaciones familiares:
% procrean ⊆ Varon × Hembra × Persona
procrean(antonio,ana,jose).
procrean(antonio,ana,luis).
procrean(antonio,pepa,maria).
procrean(andres,lola,antonio).
...
Agenda:
% anivesario ⊆ Persona × Fecha
aniversario(antonio,dia(3,feb)).
aniversario(lola,dia(24,nov)).
...
Programación Declarativa 6
Relaciones (def. intensional)
% padre ⊆ Varon × Persona
padre(P,H):- procrean(P,M,H).
Programación Declarativa 7
Formas de interrogación
:- procrean(antonio,ana,H).
:- procrean(antonio,_,H).
:- procrean(P,M,maria).
:- aniversario(antonio,D).
:- aniversario(P,dia(3,abril)).
- aniversario(P,dia(_,abril)).
:- abuelo(andres,N).
:- abuelo(A,maria).
Programación Declarativa 8
Aspectos de la programación PROLOG
que se deben controlar
Programación Declarativa 9
Orden de las reglas
Afecta al orden de las ramas en el árbol de búsqueda.
Repercute en:
9 El orden en que se generan las soluciones.
hijo(H,M):- varon(H), procrean(P,M,H).
hijo(H,P):- varon(H), procrean(P,M,H). :-hijo(luis,X).
Programación Declarativa 10
Orden de las fórmulas atómicas en el cuerpo
de las cláusulas (I)
Afecta al número de ramas y a la longitud de las ramas del árbol
de búsqueda.
Repercute en:
9 El orden en que se generan las soluciones.
9 El número de cálculos que se deben realizar.
9 La terminación de los cálculos.
Programación Declarativa 11
Orden de las fórmulas atómicas en el cuerpo
de las cláusulas (II)
Los diferentes órdenes de las llamadas a predicados en los
cuerpos de las cláusulas representan diferentes formas de
buscar soluciones.
Afecta al uso de los predicados:
:-abuelo/a(+,?).
:-abuelo/a(?,+).
Programación Declarativa 12
Solapamientos
La posibilidad de aplicar dos reglas a un mismo conjunto de
valores repercute en la aparición de soluciones repetidas que
afectan a la eficiencia de los cálculos
minimo(X,Y,X):- menorigual(X,Y).
minimo(X,Y,Y):- menorigual(Y,X).
:- minimo(3,3,M).
Programación Declarativa 13
Aplicación al diseño de programas
En los cuerpos de las cláusulas se debe:
9 Evitar solapamientos
Programación Declarativa 14
Definición de relaciones con
propiedades particulares
Programación Declarativa 15
Relaciones reflexivas
Definición: clausura reflexiva de una relación no reflexiva
Ejemplo:
mismaEdad(juan,antonio).
...
mismaEdad(P,P):- persona(P).
Programación Declarativa 16
Relaciones simétricas
Definición: Clausura simétrica de una relación asimétrica
Divergente: Convergente:
r(a,b). r’(a,b).
... ...
r(X,Y):- r(Y,X). r(X,Y):- r’(X,Y).
:-r(a,X). r(X,Y):- r’(Y,X).
:-r(a,X).
Ejemplo: Grafo no orientado
arco(a,b). eje(X,Y):-arco(X,Y).
... eje(X,Y):-arco(Y,X).
Programación Declarativa 17
Relaciones transitivas
Definición: Clausura transitiva de una relación intransitiva
Divergente: Convergente:
r(a,b). r’(a,b).
... ...
r(X,Y):- r(X,Z), r(X,Y):- r’(X,Y).
r(Z,Y). r(X,Y):- r’(X,Z),
:-r(a,X). r(Z,Y).
:-r(a,X).
Programación Declarativa 18
Relaciones de preorden
Clausura reflexiva y transitiva de una relación intransitiva
r’(a,b).
...
r(X,X).
r(X,Y):- r’(X,Z),r(Z,Y).
Programación Declarativa 19
Relaciones de equivalencia
Clausura reflexiva y transitiva de la clausura simétrica de una
relación asimétrica
r’’(a,b).
...
r’(X,Y):- r’’(X,Y).
r’(X,Y):- r’’(Y,X).
r(X,X).
r(X,Y):- r’(X,Z),r(Z,Y).
Programación Declarativa 20
Álgebra de relaciones
Programación Declarativa 21
Unión
Programación Declarativa 22
Intersección
Programación Declarativa 23
Producto cartesiano
Programación Declarativa 24
Diferencia
Programación Declarativa 25
Proyección
Programación Declarativa 26
Selección
Programación Declarativa 27
Programación recursiva:
Aritmética del número natural
Programación Declarativa 28
Dominio de los números naturales
Definición recursiva del dominio:
nat = 0 | s(nat)
Programación Declarativa 29
Ejercicios
Programación Declarativa 30
Suma de números naturales
Definición recursiva: X+0 =X
X+s(Y) = s(X+Y)
% suma(X,Y,X+Y)
suma(X,0,X):- nat(X).
suma(X,s(Y),s(Z)):- suma(X,Y,Z).
Programación Declarativa 31
Suma: flujo de datos
suma(X,s(Y),s(Z)):- suma(X,Y,Z).
suma(X,s(Y),s(Z)):- suma(X,Y,Z).
suma(X,s(Y),s(Z)):- suma(X,Y,Z).
Programación Declarativa 32
Producto de números naturales
Definición recursiva: X*0 = 0
X*s(Y) = X*Y + X
% producto(X,Y,X*Y)
producto(X,0,0):- nat(X).
producto(X,s(Y),Z):- producto(X,Y,P),suma(P,X,Z).
Programación Declarativa 33
Ejercicios (Definir y estudiar comportamientos)
1) Predicado para descomponer un número N en suma de dos
números pares, cuando sea posible.
2) Predicado para calcular potencias:
% N^0 = 1, para N>0
% 0^N = 0, para N>0
% N^(M+1) = (N^M) * N, para N>0
3) Predicado para calcular factoriales:
% 0! = 1
% (N+1)! = N! * (N+1)
4) Predicado para generar números de Fibonacci:
% f(0) = 1
% f(1) = 1
% f(N+2) = f(N) + f(N+1)
Programación Declarativa 34
Ordenación de números naturales
(Definir y estudiar comportamientos)
%0≤Y
% s(X) ≤ s(Y) Ù X ≤ Y
% 0 < s(Y)
% s(X) < s(Y) Ù X < Y
% min(X,Y) = X si X ≤ Y
% min(X,Y) = Y si Y< X
Programación Declarativa 35
Cociente de números naturales
(Definir y estudiar comportamientos)
% Dd = Ds*C + R
% Dd/Ds = 0 si Dd < Ds y 0 < Ds
% Dd/Ds = s((Dd-Ds)/Ds) si Dd ≥ Ds y 0 < Ds
Programación Declarativa 36
Estrategias de diseño recursivo
de predicados
Programación Declarativa 37
Composición de sustituciones vs. acumulador
suma(N,0,N):- nat(N).
suma(N,s(M),s(Z)):- suma(N,M,Z).
Recursión
:-suma(s(0),s(s(s(0))),Z). Z = s(Z1)
:-suma(s(0),s(s(0)),Z1). Z1 = s(Z2)
:-suma(s(0),s(0),Z2). Z2 = s(Z3)
:-suma(s(0),0,Z3). Z3 = s(0)
:-nat(s(0)). Cálculo de la solución
...
Programación Declarativa 38
Cálculo con acumulador
suma(N,0,N):- nat(N).
suma(N,s(M),Z):- suma(s(N),M,Z).
Recursión
:-suma(s(0),s(s(s(0))),Z).
:-suma(s(s(0)),s(s(0)),Z).
:-suma(s(s(s(0))),s(0),Z)
:-suma(s(s(s(s(0)))),0,Z). Z = s(s(s(s(0))))
:-nat(s(s(s(s(0))))).
...
Programación Declarativa 39
Cálculo descendente vs. ascendente
fac(0,1).
fac(s(N),F):- fac(N,F1),
producto(s(N),F1,F).
:-fac(s(s(0)),F).
:-fac(s(0),F1),producto(s(s(0)),F1,F).
:-fac(0,F2),producto(s(0),F2,F1),producto(s(s(0)),F1,F).
:-producto(s(0),s(0),F1),producto(s(s(0)),F1,F).
:-producto(s(s(0)),s(0),F).
F = s(s(0))
Programación Declarativa 40
Cálculo ascendente (con acumuladores)
fac(N,F):-fac(N,s(0),F).
fac(0,F,F).
fac(s(N),A,F):- producto(s(N),A,A1),fac(N,A1,F).
:-fac(s(s(0)),F).
:-fac(s(s(0)),s(0),F).
:-producto(s(s(0)),s(0),A1),fac(s(0),A1,F).
:-fac(s(0),s(s(0)),F).
:-producto(s(0),s(s(0)),A2),fac(0,A2,F).
:-fac(0,s(s(0)),F).
F = s(s(0))
Programación Declarativa 41
Ejercicios
Programación Declarativa 42