Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el...

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

Transcript of Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el...

Page 1: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 2: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

Programación lógica con árboles 2

Contenido

1. Programación con árboles2. Otras estructuras arbóreas

Page 3: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

Introducción

Page 4: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 5: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

Programación con árboles

Page 6: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 7: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 8: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 9: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 10: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 11: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 12: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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?

Page 13: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 14: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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?

Page 15: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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?

Page 16: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 17: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 18: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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?

Page 19: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 20: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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.

Page 21: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 22: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 23: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

Otras estructuras arbóreas

Page 24: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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)

Page 25: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 26: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 27: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 28: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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

Page 29: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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.

Page 30: Programación lógica con árboleslopez/progdec/prolog/apuntes/05-arboles/arboles.pdf · depende el orden en que se generen los elementos? Escribir definiciones que generen los elementos

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