Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ingeniería Informática
Ingeniería Técnica en Informática
Departamento de Lenguajes y
Ciencias de la Computación
Universidad de Málaga
Contenido
:: :: es un constructor ternario: B × D × B → B
hijo izquierdo :: raíz :: hijo derecho
Ejemplo:
b
(nil :: a :: nil ) :: b :: (nil :: c :: nil)
a c
Programación lógica con árboles 6
Representación Prolog de árboles binarios
Necesitamos términos recursivos para representar árboles
2 6
1 3 5 7
?- arbolB_ej(A), miembro(3,A).
Programación lógica con árboles 9
Definición de dominio
Seguimos la definición inductiva de B:
% es_arbolB(+A)
es_arbolB(vacioB). % base
es_arbolB(nodoB(I,R,D)) :- % recursivo
es_arbolB(I),
es_arbolB(D).
es_arbolB(A)
Uso Comportamiento Significado
(+) test A∈B
(-) generador anómalo
miembro(X,nodoB(_,X,_)). % base
miembro(X,nodoB(I,_,_)) :- % recursivo (I)
miembro(X,I).
miembro(X,nodoB(_,_,D)) :- % recursivo (D)
miembro(X,D).
miembro(X,A)
Uso Comportamiento Significado
(+,+) test comprueba que X ∈ A
(-,+) generador acotado genera elementos de A
en preorden
preorden(vacioB,[]). % base
preorden(nodoB(I,R,D),RID) :- % recursivo
preorden(I,PreI),
preorden(D,PreD),
concatena([R|PreI],PreD,RID).
% generador único
?- arbolB_ej(A), preorden(A,Rs).
Rs = [4,2,1,3,6,5,7] ;
No
% generador anómalo
?- preorden(A,[4,2,1,3,6,5,7]).
A = arbolB_ej ;
% y se cuelga...
Programación lógica con árboles 17
Tabla de comportamiento de miembro/2
preorden(+A,?Rs)
Uso Comportamiento Significado
(+,+) test comprueba que Rs es el recorrido
en preorden de A
(+,-) generador único genera en Rs el recorrido en
preorden de A
arbol_preorden([],vacioB). % base
arbol_preorden([R|Rec],nodoB(I,R,D)) :- % recursivo
concatena(RecI,RecD,Rec), % (-,-,+)
arbol_preorden(RecI,I),
arbol_preorden(RecD,D).
suma(vacioB,0). % base
suma(nodoB(I,R,D),N) :- % recursivo
suma(I,SI),
suma(D,SD),
N is SI+R+SD.
sustituye(_,_,vacioB,vacioB).
sustituye(X,Y,nodoB(Ix,R,Dx),nodoB(Iy,R,Dy)) :-
X \== R,
sustituye(X,Y,Ix,Iy),
sustituye(X,Y,Dx,Dy).
sustituye(X,Y,nodoB(Ix,R,Dx),nodoB(Iy,Y,Dy)) :-
X == R,
sustituye(X,Y,Ix,Iy),
sustituye(X,Y,Dx,Dy).
Programación lógica con árboles 21
Ejercicios
1. Define los siguientes predicados sobre árboles binarios:
iguales(+A,+B)
simetricos(+A,+B)
frontera(+A,?F)
Términos Prolog:
F := cierto
| falso
| y(F,F)
| o(F,F)
| no(F)
Programación lógica con árboles 24
Definición de dominio
es_fbf(P) – se satisface si P es una fórmula proposicional sin
variables
es_fbf(cierto).
es_fbf(falso).
es_fbf(o(P,Q)) :-
es_fbf(P),
es_fbf(Q).
es_fbf(y(P,Q)):-
es_fbf(P),
es_fbf(Q).
es_fbf(no(P)) :-
es_fbf(P).
derivada(X,X,1).
derivada(C,X,0) :-
atomic(C), % C es constante y
C \= X. % no coincide con el diferencial
derivada(-U,X,-DU) :-
derivada(U,X,DU).
derivada(U+V,X,DU+DV) :-
derivada(U,X,DU),
derivada(V,X,DV).
derivada(U-V,X,DU-DV) :-
derivada(U,X,DU),
derivada(V,X,DV).
derivada(U*V,X,U*DV+DU*V) :-
derivada(U,X,DU),
derivada(V,X,DV).
derivada(U/V,X,(DU*V-U*DV)/V*V) :-
U \== 1,
derivada(U,X,DU),
derivada(V,X,DV).
derivada(1/V,X,-DV/(V*V)) :-
derivada(V,X,DV).
derivada(sin(X),X,cos(X)).
derivada(cos(X),X,-sin(X)).
derivada(X^N,X,N*X^NN) :-
N>0,
NN is N-1.