280 likes | 429 Views
Balanceando Á rboles de Ejecución. David Insa Cabrera. Contenido. Introducción. Depuración Algorítmica. Balanceo de árboles de ejecución. AE balanceados. Tres técnicas para balancear AE. Demostración. DDJ. Conclusiones y trabajo futuro. Depuración Algorítmica.
E N D
Balanceando Árboles de Ejecución David Insa Cabrera
Contenido Introducción Depuración Algorítmica Balanceo de árboles de ejecución AE balanceados Tres técnicas para balancear AE Demostración DDJ Conclusiones y trabajo futuro
Depuración Algorítmica • Depuración algorítmica[Shapiro 82]Paradigma Lógico • DOS FASES: • Generar el árbol de ejecución • Recorrer el árbol de ejecución haciendo preguntas hasta encontrar el error Si se detecta el efecto de un error entonces la DA encontrará el error main = 4 ¿Qué es un Árbol de Ejecución? listSum [1,2] = 4 Ejemplo: main = listSum [1,2] listSum [] = 1 listSum (x:xs) = x + (listSumxs) 1+3 = 4 listSum [2] = 3 2+1 = 3 listSum [] = 1
Depuración Algorítmica • Recorriendo el árbol de ejecución • REGLA DE ORO: Cuando un nodo incorrecto no tiene hijos incorrectos, entonces este nodo es erróneo. main = 4 listSum [1,2] = 4 Ejemplo: main = listSum [1,2] listSum [] = 1 listSum (x:xs) = x + (listSumxs) 1+3 = 4 listSum [2] = 3 2+1 = 3 listSum [] = 1
Depuración Algorítmica • Recorriendo el árbol de ejecución • REGLA DE ORO: Cuando un nodo incorrecto no tiene hijos incorrectos, entonces este nodo es erróneo. main = 5 listSum [1,2] = 5 Ejemplo: main = listSum [1,2] listSum [] = 0 listSum (x:xs) = x + (listSumxs) + 1 1+3+1 = 5 listSum [2] = 3 2+0+1 = 3 listSum [] = 0
Contenido Introducción Depuración Algorítmica • Estrategias de la DA Balanceo de árboles de ejecución • Sesión de depuración AE balanceados Tres técnicas para balancear AE Demostración DDJ Conclusiones y trabajo futuro
Estrategias de la Depuración Algorítmica Estrategias Single Stepping Single Stepping Divide & Query Top Down Top Down LefttoRight Top Down HeaviestFirst Top Down More Rules First Divide & QueryShapiro Divide & QueryHirunkitti Divide by Rules & Query Hat Delta Hat Delta More Wrongs Hat Delta LessRights Hat Delta BestDivision
Sesión de depuración Sesión de depuración main = sqrTest[1,2] sqrTestx = test (squares (listSumx)) test (x,y,z) = (x==y) && (y==z) listSum[] = 0 listSum(x:xs) = x + (listSumxs) squares x = ((square1 x),(square2 x),(square3 x)) square1 x = square x square x = x*x square2 x = listSum(list x x) list x y | y==0 = [] | otherwise = x:list x (y-1) square3 x = listSum(partialSumsx) partialSumsx = [(sum1 x),(sum2 x)] sum1 x = div (x * (incr x)) 2 sum2 x = div (x + (decr x)) 2 incr x = x + 1 decr x = x - 1
Sesión de depuración Sesión de depuración con la búsqueda Top-Down LefttoRight. main = False Empezando la sesión de depuración… main = False? NO sqrTest[1,2] = False? NO test [9,9,8] = False? SI squares 3 = [9,9,8]? NO square1 3 = 9? SI square2 3 = 9? SI square3 3 = 8? NO listSum[6,2] = 8? SI partialSums3 = [6,2]? NO sum1 3 = 6? SI sum2 3 = 2? NO decr 3 = 2? SI Error encontrado en la regla: sum2 x = div (x + (decr x)) 2 sqrTest [1,2] = False test (9,9,8) = False squares 3 = (9,9,8) listSum [1,2] = 3 listSum [2] = 2 squares1 3 = 9 squares2 3 = 9 squares3 3 = 8 listSum [] = 0 square 3 = 9 listSum [3,3,3] = 9 list 3 3 = [3,3,3] partialSums 3 = [6,2] listSum [6,2] = 8 listSum [3,3] = 6 list 3 2 = [3,3] listSum [2] = 2 sum1 3 = 6 sum2 3 = 2 decr 3 = 2 listSum [3] = 3 list 3 1 = [3] listSum [] = 0 incr 3 = 4 listSum [] = 0 list 3 0 = []
Sesión de depuración Sesión de depuración con la búsqueda Top-Down HeaviestFirst. main = False Empezando la sesión de depuración… main = False? NO sqrTest[1,2] = False? NO squares3 = [9,9,8]? NO square2 3 = 9? SI square3 3 = 8? NO partialSums3 = [6,2]? NO sum1 3 = 6? SI sum2 3 = 2? NO decr 3 = 2? SI Error encontrado en la regla: sum2 x = div (x + (decr x)) 2 sqrTest [1,2] = False test (9,9,8) = False squares 3 = (9,9,8) listSum [1,2] = 3 listSum [2] = 2 squares1 3 = 9 squares2 3 = 9 squares3 3 = 8 listSum [] = 0 square 3 = 9 listSum [3,3,3] = 9 list 3 3 = [3,3,3] partialSums 3 = [6,2] listSum [6,2] = 8 listSum [3,3] = 6 list 3 2 = [3,3] listSum [2] = 2 sum1 3 = 6 sum2 3 = 2 decr 3 = 2 listSum [3] = 3 list 3 1 = [3] listSum [] = 0 incr 3 = 4 listSum [] = 0 list 3 0 = []
Sesión de depuración Sesión de depuración con la búsqueda Divide & QueryHirunkitti. main = False Empezando la sesión de depuración… square2 3 = 9? SI square3 3 = 8? NO partialSums 3 = [6,2]? NO sum1 3 = 6? SI sum2 3 = 2? NO decr 3 = 2? SI Error encontrado en la regla: sum2 x = div (x + (decr x)) 2 sqrTest [1,2] = False test (9,9,8) = False squares 3 = (9,9,8) listSum [1,2] = 3 listSum [2] = 2 squares1 3 = 9 squares2 3 = 9 squares3 3 = 8 listSum [] = 0 square 3 = 9 listSum [3,3,3] = 9 list 3 3 = [3,3,3] partialSums 3 = [6,2] listSum [6,2] = 8 listSum [3,3] = 6 list 3 2 = [3,3] listSum [2] = 2 sum1 3 = 6 sum2 3 = 2 decr 3 = 2 listSum [3] = 3 list 3 1 = [3] listSum [] = 0 incr 3 = 4 listSum [] = 0 list 3 0 = []
Contenido Introducción Depuración Algorítmica Balanceo de árboles de ejecución AE balanceados • AE completamente balanceado Tres técnicas para balancear AE • Generación de AE balanceados Demostración DDJ Conclusiones y trabajo futuro
AE completamente balanceado Se dice que un árbol de ejecución está balanceado cuando: si se detecta un nodo incorrecto en el árbol de ejecución, entonces se puede encontrar un nodo que pode la mitad del árbol de ejecución que queda por depurar 16 1 4 8 2 2 1 1 1 4 2 1 2 1 1 1
Generación de AE balanceados 16 8 7 6 5 1 2 3 4 4 2 1 3 1 4 2 1 1 2 1 1 2 1 2 1 1 1 1
Contenido Introducción Depuración Algorítmica Balanceo de árboles de ejecución AE balanceados Tres técnicas para balancear AE • Cadenas Demostración • Proyección DDJ • Colapso Conclusiones y trabajo futuro • Compactación
Programa de ejemplo class Position { int x, y; void locate (int a, int b) {x=a; y=b;} void up() {y=y+1;} void down() {y=y-1;} void right() {x=x+1;} void left() {x=x-1;} } public class Chess { public static void main(String[] args) { Chess p = new Chess(); Position tower = new Position(); Position king = new Position(); king.locate(5, 1); tower.locate(8, 1); p.castling(tower, king); } void castling(Position t, Position k) { if (t.x != 8) { for(inti=1; i<=2; i++) {t.left();} for(inti=1; i<=2; i++) {k.right();} } else { for(inti=1; i<=3; i++) {t.right();} for(inti=1; i<=2; i++) {k.left();} } } }
Cadenas p.castling(tower,king) king.x=5 king.y=1 tower.x=8 tower.y=1 king.x=3 king.y=1 tower.x=11 tower.y=1 t.right() t.right() t.right() k.left() k.left() t.x=8 t.y=1 t.x=9 t.y=1 t.x=9 t.y=1 t.x=10 t.y=1 t.x=10 t.y=1 t.x=11 t.y=1 k.x=5 k.y=1 k.x=4 k.y=1 k.x=4 k.y=1 k.x=3 k.y=1
Proyección p.castling(tower,king) king.x=5 king.y=1 tower.x=8 tower.y=1 king.x=3 king.y=1 tower.x=11 tower.y=1 t.right() t.right() t.right() k.left() k.left() k.x=5 k.y=1 k.x=3 k.y=1 t.x=8 t.y=1 t.x=11 t.y=1 t.right() t.right() t.right() k.left() k.left() t.x=8 t.y=1 t.x=9 t.y=1 t.x=9 t.y=1 t.x=10 t.y=1 t.x=10 t.y=1 t.x=11 t.y=1 k.x=5 k.y=1 k.x=4 k.y=1 k.x=4 k.y=1 k.x=3 k.y=1
Colapso p.castling(tower,king) king.x=5 king.y=1 tower.x=8 tower.y=1 king.x=3 king.y=1 tower.x=11 tower.y=1 t.right() t.right() t.right() k.left() k.left() k.x=5 k.y=1 k.x=3 k.y=1 t.x=8 t.y=1 t.x=11 t.y=1 t.right() t.right() t.right() k.left() k.left() t.x=8 t.y=1 t.x=9 t.y=1 t.x=9 t.y=1 t.x=10 t.y=1 t.x=10 t.y=1 t.x=11 t.y=1 k.x=5 k.y=1 k.x=4 k.y=1 k.x=4 k.y=1 k.x=3 k.y=1
Proceso de balanceo 32 16
Contenido Introducción Depuración Algorítmica Balanceo de árboles de ejecución AE balanceados Tres técnicas para balancear AE • Cadenas • Proyección • Colapso • Compactación Demostración DDJ Conclusiones y trabajo futuro
Compactación 33 13
Contenido Introducción Depuración Algorítmica Balanceo de árboles de ejecución AE balanceados Tres técnicas para balancear AE Demostración DDJ Conclusiones y trabajo futuro
Contenido Introducción Depuración Algorítmica Balanceo de árboles de ejecución AE balanceados Tres técnicas para balancear AE Demostración DDJ Conclusiones y trabajo futuro
Conclusiones Preguntas complejas No colapsar o proyectar cadenas que realicen más de 5 cambios Posibilidad de volver al AE original
Conclusiones Preguntas complejas No colapsar o proyectar cadenas que realicen más de 5 cambios Posibilidad de volver al AE original Evitar preguntas innecesarias
Conclusiones Preguntas complejas No colapsar o proyectar cadenas que realicen más de 5 cambios Posibilidad de volver al AE original Evitar preguntas innecesarias Trabajo futuro Experimentar con el tamaño de las cadenas Compactar subárbol en un nodo Implementar balanceado según la estructura usada en otras estrategias Dividir un nodo en sub-computaciones (inversa)