tema ii el lenguaje lógico prologjmmb/declarativa/apuntespl2004/proglogicaii.pdfprogramación...
TRANSCRIPT
Programación Declarativa 1
Tema IITema II
El Lenguaje Lógico PROLOGEl Lenguaje Lógico PROLOG
Programación Declarativa 2
Prolog
El paso del modelo teórico de programación lógica a un lenguaje práctico requiere:
La mecanización del método de resolución SLD(reglas de cálculo y de búsqueda y backtracking)
Un tratamiento predefinido para las expresiones aritméticas.(predicados aritméticos extralógicos)
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 elorden 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 3
Programación lógica y bases de datos relacionalesLa 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 monariosestructuras
Relaciones en P. L.: predicadosextensionales (mediante hechos)intensionales (mediante reglas)
Programación Declarativa 4
Dominios (I)
o Predicados monariosvaron(antonio). hembra(ana).varon(luis). hembra(pepa).varon(jose). hembra(lola).varon(andres). hembra(maria).... ...
o Estructurasnacimiento(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 5
Dominios (II)
Los predicados sobre dominios se pueden utilizar:
Para comprobar la pertenencia de un objeto a un dominio::-varon(luis).:-varon(lola)....
Para generar valores del dominio::-varon(X). :-natural(X).X = antonio X = 0X = 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 6
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 × Fechaaniversario(antonio,dia(3,feb)).aniversario(lola,dia(24,nov))....
Programación Declarativa 7
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 8
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 9
Aspectos de la programación PROLOG que se deben controlar
Programación Declarativa 10
Orden de las reglas
Afecta al orden de las ramas en el árbol de búsqueda.Repercute en:
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).
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 11
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 árbolde búsqueda.Repercute en:
El orden en que se generan las soluciones.El número de cálculos que se deben realizar.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 12
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 13
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 14
Aplicación al diseño de programas
En los cuerpos de las cláusulas se debe:
Comenzar con fórmulas atómicas que reduzcan el espacio de búsqueda.
Proteger las llamadas recursivas.
Evitar solapamientos
Programación Declarativa 15
Definición de relaciones conpropiedades particulares
Programación Declarativa 16
Relaciones reflexivas
Definición: clausura reflexiva de una relación no reflexiva
Sin restricción de tipo:r(a,b)....r(X,X).
Con restricción de tipo:r(a,b)....r(X,X):- t(X).
Ejemplo:mismaEdad(juan,antonio)....mismaEdad(P,P):- persona(P).
Programación Declarativa 17
Relaciones simétricas
Definición: Clausura simétrica de una relación asimétrica
Divergente:r(a,b)....r(X,Y):- r(Y,X).:-r(a,X).
Convergente:r’(a,b)....r(X,Y):- r’(X,Y).r(X,Y):- r’(Y,X).:-r(a,X).
Ejemplo: Grafo no orientadoarco(a,b). eje(X,Y):-arco(X,Y).... eje(X,Y):-arco(Y,X).
Programación Declarativa 18
Relaciones transitivas
Definición: Clausura transitiva de una relación intransitiva
Divergente:r(a,b)....r(X,Y):- r(X,Z),
r(Z,Y).:-r(a,X).
Convergente:r’(a,b)....r(X,Y):- r’(X,Y).r(X,Y):- r’(X,Z),
r(Z,Y).:-r(a,X).
Ejemplo: Camino en un grafo orientado
Programación Declarativa 19
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 20
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 21
Álgebra de relaciones
Programación Declarativa 22
Unión
Programación Declarativa 23
Intersección
Programación Declarativa 24
Producto cartesiano
Programación Declarativa 25
Diferencia
Programación Declarativa 26
Proyección
Programación Declarativa 27
Selección
Programación Declarativa 28
Programación recursiva:Aritmética del número natural
Programación Declarativa 29
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 30
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 31
Suma de números naturales
Definición recursiva: X+0 = XX+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: (+,+,-) (-,+,+) (+,-,+) (-,-,+)Para sumar: :-suma(s(s(0)),s(0),X).Para restar: :-suma(X,s(0),s(s(0))).Para descomponer: :-suma(X,Y,s(s(0))).
Programación Declarativa 32
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 33
Producto de números naturales
Definición recursiva: X*0 = 0X*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: (+,+,-) (+,-,-) (-,+,-)
Para multiplicar: :- producto(s(s(0)),s(s(0)),P).Para generar múltiplos: :- producto(s(s(0)),Y,P).
:- producto(X,s(s(0)),P).
Programación Declarativa 34
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 35
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 36
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 37
Estrategias de diseño recursivo de predicados
Programación Declarativa 38
Composición de sustituciones vs. acumulador
suma(N,0,N):- nat(N).suma(N,s(M),s(Z)):- suma(N,M,Z).
:-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))....
Recursión
Cálculo de la solución
Programación Declarativa 39
Cálculo con acumulador
suma(N,0,N):- nat(N).suma(N,s(M),Z):- suma(s(N),M,Z).
:-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)))))....
Recursión
Programación Declarativa 40
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 41
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 42
Ejercicios
Definición del producto con acumulador.
Definición de los números de Fibonacci con cálculodescendente y con cálculo ascendente