• No se han encontrado resultados

Programación lógica con árboles. Introducción. Contenido. Introducción. 1. Programación con árboles 2. Otras estructuras arbóreas

N/A
N/A
Protected

Academic year: 2021

Share "Programación lógica con árboles. Introducción. Contenido. Introducción. 1. Programación con árboles 2. Otras estructuras arbóreas"

Copied!
8
0
0

Texto completo

(1)

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

(2)

Programación con árboles

Programación lógica con árboles 6

Definición de árbol binario

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

(3)

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?

(4)

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

(5)

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.

(6)

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 define

1. >, "  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)

(7)

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

(8)

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 ;

Referencias

Documento similar

Pero, al fin y al cabo, lo que debe privar e interesar al sistema, es la protección jurisdiccional contra las ilegalidades de la Administración,221 dentro de las que se contemplan,

a) Ao alumnado que teña superado polo menos 60 créditos do plan de estudos da licenciatura que inclúan materias troncais e obrigatorias do primeiro curso recoñeceráselles o

Imparte docencia en el Grado en Historia del Arte (Universidad de Málaga) en las asignaturas: Poéticas del arte español de los siglos XX y XXI, Picasso y el arte español del

De esta manera, ocupar, resistir y subvertir puede oponerse al afrojuvenicidio, que impregna, sobre todo, los barrios más vulnerables, co-construir afrojuvenicidio, la apuesta

DECORA SOLO LAS IMÁGENES QUE NECESITES PARA LLEGAR AL NÚMERO CORRESPONDIENTE... CEIP Sansueña/CEIP Juan XXIII Infantil

Las personas solicitantes deberán incluir en la solicitud a un investigador tutor, que deberá formar parte de un grupo de investigación. Se entiende por investigador tutor la

22 Enmarcado el proyecto de investigación de I+D «En clave femenina: música y ceremonial en las urbes andaluzas durante el reinado de Fernando VII (1808-1833)» (Plan Andaluz

Si el progreso de las instituciones de Derecho público no ha tenido lugar en los pueblos que se han reservado para el Poder judicial en abso- luto las