Sie sind auf Seite 1von 30

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
Contenido

1. Programación con árboles


2. Otras estructuras arbóreas

Programación lógica con árboles 2


Introducción
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 lógica con árboles 4


Programación con árboles
Definición de árbol binario
Sea D un dominio o tipo base

Definición: el conjunto de árboles binarios B de D se define


1. 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:
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

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 vacioB


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)
donde T es un término Prolog
Programación lógica con árboles 7
Ejemplo de árbol binario bien construido
El árbol binario: 4

2 6

1 3 5 7

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

Programación lógica con árboles 8


El predicado arbolB_ej/1
% arbolB_ej(?A)
arbolB_ej(
nodoB(nodoB(nodoB(vacioB, 1, vacioB),
2,
1
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).
Programación lógica con árboles 9
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). % base
es_arbolB(nodoB(I,R,D)) :- % recursivo
es_arbolB(I),
es_arbolB(D).

Programación lógica con árboles 10


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 11


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 12


El predicado miembro/2
miembro(?X,+A) – X pertenece al árbol binario A

Es similar a miembro/2 para 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 13


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?
Programación lógica con árboles 14
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 15


El predicado preorden/2
preorden(+A,?Rs) – Rs es 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).

Ejercicio: definir los recorridos en inorden y postorden

Programación lógica con árboles 16


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

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 18


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


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


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 21
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

Programación lógica con árboles 22


Otras estructuras arbóreas
Fórmulas proposicionales sin variables
Definición: el conjunto F se define
1. >, ⊥ ∈ 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 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).

Programación lógica con árboles 25


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 y
C \= X. % no coincide con el diferencial

derivada(-U,X,-DU) :-
derivada(U,X,DU).

Programación lógica con árboles 26


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 27


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 28


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 29


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
Programación lógica con árboles 30

Das könnte Ihnen auch gefallen