Programación lógica con árboles
Ingeniería Informática Ingeniería Técnica en Informática
Departamento de Lenguajes y Ciencias de la Computación
Universidad de Málaga
Programación lógica con árboles 2
Contenido
1. Programación con árboles 2. Otras estructuras arbóreas
Introducción
Programación lógica con árboles
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 dominio
relaciones
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
SeaD un dominio o tipo baseDefinición: el conjunto de árboles binarios B de D se define
1. nil B (árbol vacío) [base]
2. si I, D B AR 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
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 AR D, entonces I::R::D B [recursivo]
Caso base ÆconstantevacioB
Caso 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)
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 AR D, entonces I::R::D B [recursivo]
% es_arbolB(+A)
es_arbolB(vacioB). % base
es_arbolB(nodoB(I,R,D)) :- % recursivo
es_arbolB(I), es_arbolB(D).
Programación lógica con árboles
Usos de es_arbolB/1
?- arbolB_ej(A), es_arbolB(A). % test
Yes
?- es_arbolB(A). % generador anómalo
A = 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
Tabla de comportamiento de es_arbolB/1
es_arbolB(A)
Uso Comportamiento Significado
(+) test AB
(-) 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)– Xpertenece al árbol binario A
Es similar a miembro/2para listas:
miembro(X,nodoB(_,X,_)). % base
miembro(X,nodoB(I,_,_)) :- % recursivo (I)
miembro(X,I).
miembro(X,nodoB(_,_,D)) :- % recursivo (D)
miembro(X,D).
caso base Æ acceso directo a la raíz casos base y recursivos no son excluyentes
Programación lógica con árboles 14
Usos de miembro/2
?- arbolB_ej(A), miembro(5,A). % test
Yes
9 ?- arbolB_ej(A), miembro(X,A). % gen acotado
X = 4 ; X = 2 ; X = 1 ; X = 3 ; X = 6 ; X = 5 ; X = 7 ; No
Ejercicio: ¿En qué orden se generan los elementos del árbol?
Tabla de comportamiento de miembro/2
miembro(X,A)
Uso Comportamiento Significado
(+,+) test comprueba que XA (-,+) 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?
El predicado preorden/2
preorden(+A,?Rs)–Rses el recorrido en preorden de A
Aplicamos recursión sobre el árbol A:
preorden(vacioB,[]). % base
preorden(nodoB(I,R,D),RID) :- % recursivo
preorden(I,PreI), preorden(D,PreD),
concatena([R|PreI],PreD,RID).
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 Rses el recorrido en preorden de A
(+,-) generador único genera en Rsel recorrido en preorden de A
Ejercicio: Construir las tablas de inorden/2ypostorden/2
¿Es posible generar el árbol a partir del recorrido?
Programación lógica con árboles
Generación de árboles binarios
arbol_preorden(+Rs,?A)–Rses el recorrido preorden de A
Hay que dirigir la recursión por la lista (el recorrido):
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).
Ejercicio: definir los predicados arbol_inorden/2 y
arbol_postorden/2
Programación lógica con árboles
El predicado suma/2
suma(+A,?N)– los nodos del árbol binario AsumanN
Aplicamos recursión al árbol binario A:
suma(vacioB,0). % base
suma(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 AYesAX, con todas las Xreemplazadas 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)
dondeTes 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
Fórmulas proposicionales sin variables
Definición: el conjunto F se define1. >, " F [base] 2. si A, B F entonces [recursivo] A A B F A B B F ¬ A F Términos Prolog: F := cierto | falso | y(F,F) | o(F,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)–DFes la derivada de Fxrespecto de X
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).
Programación lógica con árboles
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
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 ;