1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 1 Más Invariante Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre del 2007
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 2 Más Invariante Dada la siguiente implementación, invariante y función variante, demostrar algunos puntos de la corrección y terminación del ciclo: P I (I B) Q El cuerpo del ciclo preserva el invariante: { I B } cuerpo { I } Se cuenta con aux cambiar(a:[T], i: , val:T) : T, que devuelve el resultado de poner val en la posición i de a, y de no hacer nada más. Enunciado 1
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 3 Más Invariante int par,total,n; int a[];... while (par < n) { if (a[par] % 2 == 0) { total = total + a[par]; } else { a[par] = 0; } par++; } Enunciado // estado Q: total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x // cota 0 // I: 0 par n == total = suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ // Fv: n - par // estado P: par == total == 0 n == |a|
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 4 Más Invariante Transición de Estados while (par < n) { if (a[par] % 2 == 0) { total = total + a[par]; } else { a[par] = 0; } par++; } // estado Q: total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x // cota 0 // estado E (I B) // vale 0 par < n == total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ // estado P: par == total == 0 && n == |a| // estado F // vale == // vale mod 2 == 0 a[par] == total == + // vale mod 2 != 0 a[par] == 0 total == // vale par == n == // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x (1) // vale a(par..] == // estado G // vale par == + 1 n == total == a ==
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 5 Más Invariante Solución: P I P: par == total == 0 n == |a| ( 0 par n == (trivial) ( [x | x mod 2 == 0]) =[] suma([]) == 0 == total total == suma([x | x mod 2 == 0]) ) ( [if x mod 2 == 0 then x else 0 | x == [ ] == a == == [if x mod 2 == 0 then x else 0 | x ++ ) ) I: 0 par n == |a| == total = suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 6 Más Invariante Solución: I B Q 0 par n == total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ (par < n) par n par n par == n == total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ == [ ] a == [if x mod 2 == 0 then x else 0 | x ++ [ ] total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x Q I B :
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 7 Más Invariante Solución: {I B} cuerpo {I} 0 par n == : //Estado E vale < n == //Estado F vale par == n == //Estado G vale par == < n n == implica 0 < par n implica 0 par n n == // estado E (I B) vale 0 par < n == total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ // estado F // vale == // vale mod 2 == 0 a[par] == total == + // vale mod 2 != 0 a[par] == 0 total == // vale par == n == // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x (1) // vale a(par..] == // estado G vale par == + 1 n == total == a ==
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 8 Más Invariante Solución: {I B} cuerpo {I} total == suma([x | x mod 2 == 0]) : //Estado E vale total==suma([x | x mod 2 == 0]) //Estado F vale mod 2 == 0 total == + vale mod 2 != 0 total == vale par == vale == implica (reempazando) mod 2 == 0 total == suma([x | x mod 2 == 0]) + mod 2 != 0 total == suma([x | x mod 2 == 0]) Implica (juntado y por 1) total == suma([x | x mod 2 == 0]) //Estado G vale par == total == implica total == suma([x | x mod 2 == 0]) // estado E (I B) vale 0 par < n == total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ // estado F // vale == // vale mod 2 == 0 a[par] == total == + // vale mod 2 != 0 a[par] == 0 total == // vale par == n == // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x (1) // vale a(par..] == // estado G vale par == + 1 n == total == a ==
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 9 Más Invariante Solución: {I B} cuerpo {I} a == [if x mod 2 == 0 then x else 0 | x ++ //Estado E vale a == [if x mod 2 == 0 then x else 0 | x ++ //Estado F vale a[..par) == ([if x mod 2 == 0 then x else 0 | x (1) vale a(par..] == vale mod 2 == 0 a[par] == (2) vale mod 2 != 0 a[par] == 0 (3) vale par == implica(por 1,2y3) a[..par] == ([if x mod 2 == 0 then x else 0 | x ] implica a == ([if x mod 2 == 0 then x else 0 | x ] ++ //Estado G vale par == vale a == [if x mod 2 == 0 then x else 0 | x ] ++ implica a == [if x mod 2 == 0 then x else 0 | x ++ // estado E (I B) vale 0 par < n == total == suma([x | x mod 2 == 0]) a == [if x mod 2 == 0 then x else 0 | x ++ // estado F // vale == // vale mod 2 == 0 a[par] == total == + // vale mod 2 != 0 a[par] == 0 total == // vale par == n == // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x (1) // vale a(par..] == // estado G vale par == + 1 n == total == a ==
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 10 Más Invariante Enunciado 2 Escribir una implementación para la siguiente función sin utilizar arreglos auxiliares. (Sugerencia: este problema se puede resolver utilizando un solo ciclo. Hagan eso para simplificar enormemente el segundo ítem). Dar una precondición, un invariante y una función variante, para cada uno de los ciclos que aparezcan en la solución, que permitan demostrar corrección usando el Teorema del Invariante. NO hacer ninguna demostración. problema ejercicioArtificial (a,b : [Z],n : Z) { requiere |a| == |b| == n n mod 2 == 1 ; modifica a; b ; asegura pre(a) == reverse(a(medio..]) + + [pre(a) medio ] + + reverse(a[..medio)) ; asegura a medio == pre(a) div n ; aux medio : Z = n div 2 ; }
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 11 Más Invariante Solución 1: void EjercicioArtificial(inout [Z] a, inout [Z] b, in int n) { int i = 0; int med = n div 2; int acum = 0; while (i<med) { int aux = a[i]; a[i] = a[n-1-i]; a[n-1-i] = aux; acum += a[n-1-i] + a[i]; i++; } a[med] = acum/n; } P: i == 0 acum == 0 I: 0 i n div 2 acum == a == ++ Fv: med - i
1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 12 Más Invariante Solución 2: void EjercicioArtificial(inout [Z] a, inout [Z] b, in int n) { int med = n div 2; int i = med - 1; int acum = a[med]; while (0 i) { int aux = a[i]; a[i] = a[n-1-i]; a[n-1-i] = aux; acum += a[n-1-i] + a[i]; i--; } a[med] = acum/n; } P: i == n div 2 – 1 acum == a[n div 2] I: –1 i n div 2 – 1 acum == a == ++ Fv: i