Arboles

  • Uploaded by: amordebebe
  • 0
  • 0
  • January 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Arboles as PDF for free.

More details

  • Words: 1,155
  • Pages: 30
Loading documents preview...
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 Programación lógica con árboles

c 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) 2. si I, D ∈ B ∧ R ∈ D, entonces I::R::D ∈ B

[base] [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 4

El árbol binario: 2 1

6 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) 2. si I, D ∈ B ∧ R ∈ D, entonces I::R::D ∈ B

% es_arbolB(+A) es_arbolB(vacioB). es_arbolB(nodoB(I,R,D)) :es_arbolB(I), es_arbolB(D).

Programación lógica con árboles

[base] [recursivo]

% base % recursivo

10

Usos de es_arbolB/1 ?- arbolB_ej(A), es_arbolB(A). Yes

% test

?- 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 test generador anómalo

Ejercicio: ¿Por solucionarías?

qué

Programación lógica con árboles

no

Significado A∈B

funciona

el

uso

(-)?

¿Cómo

lo

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,_)). miembro(X,nodoB(I,_,_)) :miembro(X,I). miembro(X,nodoB(_,_,D)) :miembro(X,D).

% base % recursivo (I) % recursivo (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). Yes

% test

9 ?- arbolB_ej(A), miembro(X,A). X = 4 ; X = 2 ; X = 1 ; X = 3 ; X = 6 ; X = 5 ; X = 7 ; No

% gen acotado

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 (+,+) test (-,+) generador acotado

Significado comprueba que X ∈ A 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,[]). preorden(nodoB(I,R,D),RID) :preorden(I,PreI), preorden(D,PreD), concatena([R|PreI],PreD,RID).

% base % recursivo

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 (+,+) test (+,-) generador único

Significado comprueba que Rs es el recorrido en preorden de A 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 arbol_postorden/2 Programación lógica con árboles

predicados

arbol_inorden/2

y

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). suma(nodoB(I,R,D),N) :suma(I,SI), suma(D,SD), N is SI+R+SD.

Programación lógica con árboles

% base % recursivo

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 2. si A, B ∈ F entonces A∧B∈ F A∨B∈ F ¬ A∈ F

[base] [recursivo]

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

Related Documents

Arboles
January 2021 2
Arboles Bolivia
January 2021 0
Clase De Arboles
March 2021 0
Plantas - Arboles De Jardin
February 2021 3
Arboles De Nicaragua
February 2021 1

More Documents from "William Chacon"

Arboles
January 2021 2