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

Tema II

El Lenguaje Lógico PROLOG

Programación Declarativa 1
Prolog

El paso del modelo teórico de programación lógica a un lenguaje


práctico requiere:
9 La mecanización del método de resolución SLD
(reglas de cálculo y de búsqueda y backtracking)
9 Un tratamiento predefinido para las expresiones aritméticas.
(predicados aritméticos extralógicos)
9 La incorporación de facilidades para la entrada y salida de datos
(predicados extralógicos de E/S)
Prolog utiliza la regla de cálculo primero por la izquierda y aplica el
orden textual como regla de búsqueda, incorpora backtracking y
dispone de predicados extralógicos para cálculos aritméricos y
para la gestión de la entrada y salida de datos.

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.

Base de datos relacional:


dominios D1, ..., Dn
relaciones R ⊆ Di1 × ... × Dip

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,_)).

o Combinación de ambas formas (dominios recursivos)


natural(0).
natural(s(N)):- natural(N).

Programación Declarativa 4
Dominios (II)
Los predicados sobre dominios se pueden utilizar:

9 Para comprobar la pertenencia de un objeto a un dominio:


:-varon(luis).
:-varon(lola).
...
9 Para generar valores del dominio:
:-varon(X). :-natural(X).

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).

% hijo ⊆ Varon × Persona


hijo(H,P):- varon(H),
procrean(P,M,H).
hijo(H,M):- varon(H),
procrean(P,M,H).

% abuelo ⊆ Varon × Persona


abuelo(A,N):- procrean(A,M,P),
procrean(P,M1,N).
abuelo(A,N):- procrean(A,M,M1),
procrean(P,M1,N).

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).

9 Posibilidad de alcanzar algunas soluciones (ramas infinitas)

antepasado(A,D):- progenitor(A,D). :- antepasado(A,maria).


antepasado(A,D):- antepasado(A,P), progenitor(P,D).

antepasado(A,D):- antepasado(A,P), progenitor(P,D).


antepasado(A,D):- progenitor(A,D). :- antepasado(A,maria).

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.

hijo(H,P):- procrean(P,M,H), varon(H). :-hijo(H,antonio).


hijo(H,M):- procrean(P,M,H),varon(H).

antepasado(A,D):- progenitor(A,D). :- antepasado(A,maria).


antepasado(A,D):- progenitor(P,D), antepasado(A,P).

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(A,N):- progenitor(A,P), progenitor(P,N).

:-abuelo/a(+,?).

abuelo/a(A,N):- progenitor(P,N), progenitor(A,P).

:-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 Comenzar con fórmulas atómicas que reduzcan el espacio de


búsqueda.

9 Proteger las llamadas recursivas.

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

Sin restricción de tipo: Con restricción de tipo:


r(a,b). r(a,b).
... ...
r(X,X). r(X,X):- t(X).

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).

Ejemplo: Camino en un grafo orientado

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).

Ejemplo: relación de conexión en un grafo orientado

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).

Ejemplo: relación de conexión en un grafo no orientado

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)

Representación de los números:


0, s(0), s(s(0)), s(s(s(0))), ..., s(...n...(0)...), ...

Definición del dominio mediante predicado:


nat(0).
nat(s(N)):- nat(N).

Usos del predicado:


:-nat(s(s(s(0)))). :-nat(s(s(a))).
:-nat(N).

Programación Declarativa 29
Ejercicios

1) Definir el dominio de los números pares: % par(N)

2) Definir el dominio de los números impares: % impar(N)

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).

Usos del predicado suma: (+,+,-) (-,+,+) (+,-,+) (-,-,+)


9 Para sumar: :-suma(s(s(0)),s(0),X).
9 Para restar: :-suma(X,s(0),s(s(0))).
9 Para descomponer: :-suma(X,Y,s(s(0))).

Programación Declarativa 31
Suma: flujo de datos

suma(X,0,X):- nat(X). %(+,+,-)

suma(X,s(Y),s(Z)):- suma(X,Y,Z).

suma(X,0,X):- nat(X). %(-,+,+)

suma(X,s(Y),s(Z)):- suma(X,Y,Z).

suma(X,0,X):- nat(X). %(-,-,+)

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).

Usos del predicado producto: (+,+,-) (+,-,-) (-,+,-)


9 Para multiplicar: :- producto(s(s(0)),s(s(0)),P).
9 Para generar múltiplos: :- producto(s(s(0)),Y,P).
:- producto(X,s(s(0)),P).

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

% generador acotado de números:


% entre(I,J) = K si I ≤ K ≤ J

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

% Cociente de una división entera


% Resto de una división entera
% Cociente y resto de una división entera

% Máximo común divisor:


% mcd(X,X) = X, si 0 < X
% mcd(X,Y) = mcd(X-Y,Y), si 0 < Y < X
% mcd(X,Y) = mcd(X,Y-X), si 0 < X < Y

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

ƒDefinición del producto con acumulador.

ƒ Definición de los números de Fibonacci con cálculo


descendente y con cálculo ascendente

Programación Declarativa 42

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