Programación lógica con árboles
Ingeniería InformáticaIngeniería Técnica en Informática
Departamento de Lenguajes yCiencias de la Computación
Universidad de Málaga
Programación lógica con árboles 2
Contenido
1. Programación con árboles2. Otras estructuras arbóreas
Introducción
Programación lógica con árboles 4
Introducción
Objetivo: representar en Prolog estructuras de datos y procesarlas
Para cada estructura de datos, daremos:
definición formal (conjunto inductivo)representación sintáctica (gramática formal)definición de dominiorelaciones
Aplicaremos las técnicas de programación básicas: recursión, recursión de cola, generar/comprobar
Programación con árboles
Programación lógica con árboles 6
Definición de árbol binario
Sea D un dominio o tipo base
Definición: el conjunto de árboles binarios B de D se define1. nil ∈ B (árbol vacío) [base]2. si I, D ∈ B ∧ R ∈ D, entonces I::R::D ∈ B [recursivo]
:: :: es un constructor ternario: B × D × B → B
hijo izquierdo :: raíz :: hijo derecho
Ejemplo:
(nil :: a :: nil ) :: b :: (nil :: c :: nil)
b
a c
Programación lógica con árboles 7
Representación Prolog de árboles binarios
Necesitamos términos recursivos para representar árboles
Seguimos la definición inductiva de B: 1. nil ∈ B (árbol vacío) [base]2. si I, D ∈ B ∧ R ∈ D, entonces I::R::D ∈ B [recursivo]
Caso base constante vacioBCaso recursivo estructura funtor nodoB/3 nodoB(I,R,D)
Un árbol binario bien formado es un término de la gramática:AB ::= vacioB
| nodoB(AB,T,AB)
donde T es un término Prolog
Programación lógica con árboles 8
Ejemplo de árbol binario bien construido
El árbol binario:
se representa por el término Prolog:nodoB(nodoB(nodoB(vacioB, 1, vacioB),
2, nodoB(vacioB, 3, vacioB)),
4, nodoB(nodoB(vacioB, 5, vacioB),
6, nodoB(vacioB, 7, vacioB)))
4
2
1 3
6
5 7
Programación lógica con árboles 9
El predicado arbolB_ej/1
% arbolB_ej(?A)arbolB_ej(nodoB(nodoB(nodoB(vacioB, 1, vacioB),
2, nodoB(vacioB, 3, vacioB)),
4, nodoB(nodoB(vacioB, 5, vacioB),
6, nodoB(vacioB, 7, vacioB)))).
Cada hecho define un árbol binario bien construido:
?- arbolB_ej(A), miembro(3,A).
1
Programación lógica con árboles 10
Definición de dominio
Seguimos la definición inductiva de B:
1. nil ∈ B (árbol vacío) [base]2. si I, D ∈ B ∧ R ∈ D, entonces I::R::D ∈ B [recursivo]
% es_arbolB(+A)es_arbolB(vacioB). % basees_arbolB(nodoB(I,R,D)) :- % recursivo
es_arbolB(I),es_arbolB(D).
Programación lógica con árboles 11
Usos de es_arbolB/1
?- arbolB_ej(A), es_arbolB(A). % testYes
?- es_arbolB(A). % generador anómaloA = vacioB ;A = nodoB(vacioB, _G309, vacioB) ;A = nodoB(vacioB, _G309,
nodoB(vacioB, _G313, vacioB)) ;A = nodoB(vacioB, _G309, nodoB(vacioB, _G313,
nodoB(vacioB, _G317, vacioB))) ;...
Programación lógica con árboles 12
Tabla de comportamiento de es_arbolB/1
es_arbolB(A)
Uso Comportamiento Significado(+) test A ∈ B
(-) generador anómalo
Ejercicio: ¿Por qué no funciona el uso (-)? ¿Cómo lo solucionarías?
Programación lógica con árboles 13
El predicado miembro/2
miembro(?X,+A) – X pertenece al árbol binario A
Es similar a miembro/2 para listas:
miembro(X,nodoB(_,X,_)). % basemiembro(X,nodoB(I,_,_)) :- % recursivo (I)
miembro(X,I).miembro(X,nodoB(_,_,D)) :- % recursivo (D)
miembro(X,D).
caso base acceso directo a la raízcasos base y recursivos no son excluyentes
Programación lógica con árboles 14
Usos de miembro/2
?- arbolB_ej(A), miembro(5,A). % testYes
9 ?- arbolB_ej(A), miembro(X,A). % gen acotadoX = 4 ;X = 2 ;X = 1 ;X = 3 ;X = 6 ;X = 5 ;X = 7 ;No
Ejercicio: ¿En qué orden se generan los elementos del árbol?
Programación lógica con árboles 15
Tabla de comportamiento de miembro/2
miembro(X,A)
Uso Comportamiento Significado(+,+) test comprueba que X ∈ A(-,+) generador acotado genera elementos de A
en preorden
Ejercicio: ¿Cómo se comportan los usos (+,-) y (-,-)? ¿De quédepende el orden en que se generen los elementos? Escribir definiciones que generen los elementos en inorden y postorden.
¿Cómo almacenar el recorrido en predorden en una lista?
Programación lógica con árboles 16
El predicado preorden/2
preorden(+A,?Rs) – Rs es el recorrido en preorden de A
Aplicamos recursión sobre el árbol A :
preorden(vacioB,[]). % basepreorden(nodoB(I,R,D),RID) :- % recursivo
preorden(I,PreI),preorden(D,PreD),concatena([R|PreI],PreD,RID).
Ejercicio: definir los recorridos en inorden y postorden
Programación lógica con árboles 17
Usos de preorden/2
% test?- arbolB_ej(A), preorden(A,[4,2,1,3,6,5,7]).Yes
% 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 18
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
Ejercicio: Construir las tablas de inorden/2 y postorden/2
¿Es posible generar el árbol a partir del recorrido?
Programación lógica con árboles 19
Generación de árboles binarios
arbol_preorden(+Rs,?A) – Rs es el recorrido preorden de A
Hay que dirigir la recursión por la lista (el recorrido):
arbol_preorden([],vacioB). % basearbol_preorden([R|Rec],nodoB(I,R,D)) :- % recursivo
concatena(RecI,RecD,Rec), % (-,-,+)arbol_preorden(RecI,I),arbol_preorden(RecD,D).
Ejercicio: definir los predicados arbol_inorden/2 y arbol_postorden/2
Programación lógica con árboles 20
El predicado suma/2
suma(+A,?N) – los nodos del árbol binario A suman N
Aplicamos recursión al árbol binario A:
suma(vacioB,0). % basesuma(nodoB(I,R,D),N) :- % recursivo
suma(I,SI),suma(D,SD),N is SI+R+SD.
Programación lógica con árboles 21
El predicado sustituye/3
sustituye(+X,+AX,+Y,?AY) –el árbol AY es AX, con todas las X reemplazadas por Y
Aplicamos recursión al árbol AX:
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 22
Ejercicios
1. Define los siguientes predicados sobre árboles binarios:
iguales(+A,+B)simetricos(+A,+B)frontera(+A,?F)
2. Los árboles binarios de búsqueda se pueden representar por términos de la forma:
ArbolBB ::= vacioBB| nodoBB(ArbolBB,T,ArbolBB)
donde T es un término Prolog. Define los predicados esta(+X,+A), no_esta(+X,+A), inserta(+X,+A,?AX) y borra(+X,+AX,?A). Utiliza los predicados extralógicos de comparación de términos
Otras estructuras arbóreas
Programación lógica con árboles 24
Fórmulas proposicionales sin variables
Definición: el conjunto F se define1. >, ⊥ ∈ F [base]2. si A, B ∈ F entonces [recursivo]
A ∧ B ∈ F
A ∨ B ∈ F
¬ A ∈ F
Términos Prolog:
F := cierto| falso| y(F,F)| o(F,F)| no(F)
Programación lógica con árboles 25
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).
Programación lógica con árboles 26
Derivación simbólica (I)
derivada(+Fx,+X,?DF)– DF es la derivada de Fx respecto de X
derivada(X,X,1).
derivada(C,X,0) :-atomic(C), % C es constante yC \= X. % no coincide con el diferencial
derivada(-U,X,-DU) :-derivada(U,X,DU).
Programación lógica con árboles 27
Derivación simbólica (II)
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).
Programación lógica con árboles 28
Derivación simbólica (III)
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).
Programación lógica con árboles 29
Derivación simbólica (y IV)
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.
Programación lógica con árboles 30
Ejemplos
Prolog deriva bastante bien:?- derivada(x^3+x,x,U).U = 3*x^2+1 ;No?- derivada(x^3+x,x,3*x^2+1).Yes
pero no sabe nada de conmutatividad:?- derivada(x^3+x,x,1+3*x^2).No
ni simplifica las derivadas:?- derivada(3*x,x,U).U = 3*1+0*x ;No