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

Post on 26-Dec-2019

5 views 0 download

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

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